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
1diff --git a/MANIFEST.in b/MANIFEST.in
2index 7318b78..e51f963 100644
3--- a/MANIFEST.in
4+++ b/MANIFEST.in
5@@ -48,4 +48,4 @@ recursive-exclude daily-package-testing *
6 recursive-include contrib *.policy
7 recursive-include docs *.rst *.py *.html *.conf
8 recursive-include plainbox/data *.rng
9-recursive-include plainbox/test-data *.json *.xml *.html
10+recursive-include plainbox/test-data *.json *.html *.tar.xz
11diff --git a/docs/glossary.rst b/docs/glossary.rst
12index a4eea8b..6174025 100644
13--- a/docs/glossary.rst
14+++ b/docs/glossary.rst
15@@ -96,7 +96,7 @@ Glossary
16 attachment
17
18 Attachments are a special type of a Job that can creates an attachment
19- record in the submission.xml file. They are commonly used to include
20+ record in the submission reports. They are commonly used to include
21 basic system information files and output of certain commands which can
22 aid in system certification.
23
24diff --git a/docs/manpages/plainbox-run.rst b/docs/manpages/plainbox-run.rst
25index 83a5717..eaf5098 100644
26--- a/docs/manpages/plainbox-run.rst
27+++ b/docs/manpages/plainbox-run.rst
28@@ -191,10 +191,10 @@ plainbox-run (1)
29
30 Some formats are more useful than others in that they are capable of
31 transferring more of the internal state. Depending on your application you
32- may wish to choose the most generic format (json) and process it further
33+ may wish to choose the most generic format (tar.xz) and process it further
34 with additional tools, choose the most basic format (text) just to get a
35 simple summary of the results or lastly choose one of the two specialized
36- formats (xml and html) that are specific to the Checkbox workflow.
37+ formats (xlsx and html) that are specific to the Checkbox workflow.
38
39 Out of the box the following exporters are supported:
40
41@@ -230,7 +230,7 @@ plainbox-run (1)
42 xlsx
43 ----
44
45- This exporter creates a standalone .xlsx (XML format for Microsoft Excel)
46+ This exporter creates a standalone .xlsx (OOXML format for Microsoft Excel)
47 file that contains a human-readable test report. It is quit similar to the
48 HTML report but it is easier to edit. It is useful for communicating with
49 other humans and since it is entirely standalone and off-line it can be
50@@ -238,17 +238,6 @@ plainbox-run (1)
51
52 It depends on python3-xlsxwriter package
53
54- hexr
55- ----
56-
57- This exporter creates a rather confusingly named XML document only
58- applicable for internal Canonical Hardware Certification Team workflow.
59-
60- It is not a generic XML representation of test results and instead it
61- carries quite a few legacy constructs that are only retained for
62- compatibility with other internal tools. If you want generic processing
63- look for JSON instead.
64-
65 Selecting Exporter Options
66 ^^^^^^^^^^^^^^^^^^^^^^^^^^
67
68@@ -361,15 +350,6 @@ plainbox-run (1)
69 with-text-attachments:
70 Exported spreadsheet will include text attachments on a separate sheet
71
72- xml
73- ---
74-
75- client-name:
76- This option allows clients to override the name of the application
77- generating the XML document. By default that name is `plainbox`. To
78- use this option pass ``--output-options client-name=other-name``
79- command-line option.
80-
81 TRANSPORTING RESULTS
82 ====================
83
84@@ -388,23 +368,12 @@ plainbox-run (1)
85
86 Plainbox comes equipped with the following transports:
87
88- launchpad
89- ^^^^^^^^^
90-
91- This transport can send the results exported using ``xml`` exporter to the
92- Launchpad Hardware Database. This is a little-known feature offered by the
93- https://launchpad.net/ website.
94-
95 certification
96 ^^^^^^^^^^^^^
97
98- This transport can send the results exported using the ``xml`` exporter to
99+ This transport can send the results exported using the ``tar`` exporter to
100 the Canonical Certification Website (https://certification.canonical.com).
101
102- This transport is of little use to anyone but the Canonical Hardware
103- Certification Team that also maintains Plainbox and Checkbox but it is
104- mentioned here for completeness.
105-
106 See Also
107 ========
108
109diff --git a/docs/usage.rst b/docs/usage.rst
110index c84866a..e2037b9 100644
111--- a/docs/usage.rst
112+++ b/docs/usage.rst
113@@ -62,8 +62,8 @@ Saving test results
114 ^^^^^^^^^^^^^^^^^^^
115
116 Anything that Plainbox captures and stores during test execution can be
117-exported to a file using the exporter system. The two most commonly used
118-exporters are JSON (versatile and general) and XML (for internal Canonical use).
119+exported to a file using the exporter system. The three most commonly used
120+exporters are tar.xz, html and xlsx.
121
122 JSON Exporter
123 -------------
124@@ -83,22 +83,6 @@ exporter options can be specified, separated with commas.
125
126 $ plainbox run --whitelist=/path/to/some/file.whitelist --output-format=com.canonical.plainbox::json --output-file=results.json
127
128-XML Exporter
129-------------
130-
131-To generate an XML file that can be sent to the :term:`certification website`
132-you need to pass two additional arguments to ``plainbox run``:
133-
134-#. ``--output-format=com.canonical.plainbox::hexr``
135-#. ``--output-file=NAME`` where *NAME* is a file name
136-
137-For example, to get the default certification tests ready to be submitted
138-run this command:
139-
140-.. code-block:: bash
141-
142- $ plainbox run --whitelist=/path/to/some/file.whitelist --output-format=com.canonical.plainbox::hexr --output-file=submission.xml
143-
144 Other Exporters
145 ---------------
146
147diff --git a/plainbox/abc.py b/plainbox/abc.py
148index 8b50900..3315d9d 100644
149--- a/plainbox/abc.py
150+++ b/plainbox/abc.py
151@@ -1064,7 +1064,7 @@ class ISessionStateTransport(metaclass=ABCMeta):
152 Interface for transports that send test data somewhere.
153
154 They handle just the transmission portion of data sending; exporters are
155- expected to produce data in the proper format (e.g. json, xml).
156+ expected to produce data in the proper format (e.g. json, tar.xz).
157
158 Each transport can have specific parameters that are required for the
159 other end to properly process received information (like system
160diff --git a/plainbox/data/report/hardware-1_0.rng b/plainbox/data/report/hardware-1_0.rng
161deleted file mode 100644
162index 2707550..0000000
163--- a/plainbox/data/report/hardware-1_0.rng
164+++ /dev/null
165@@ -1,552 +0,0 @@
166-<?xml version="1.0" encoding="UTF-8" ?>
167-<grammar xmlns="http://relaxng.org/ns/structure/1.0"
168- datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
169- xmlns:a="http://launchpad.net/annotation">
170- <start>
171- <element name="system">
172- <attribute name="version">
173- <value>1.0</value>
174- </attribute>
175- <interleave>
176- <element name="summary">
177- <ref name="summarySection"/>
178- </element>
179- <element name="hardware">
180- <ref name="hardwareSection"/>
181- </element>
182- <element name="software">
183- <ref name="softwareSection"/>
184- </element>
185- <element name="questions">
186- <ref name="questionsSection"/>
187- </element>
188- <optional>
189- <element name="context">
190- <ref name="contextSection"/>
191- </element>
192- </optional>
193- </interleave>
194- </element>
195- </start>
196-
197- <define name="summarySection">
198- <interleave>
199- <element name="live_cd">
200- <attribute name="value">
201- <ref name="booleanValue"/>
202- </attribute>
203- <empty/>
204- </element>
205- <element name="system_id">
206- <attribute name="value">
207- <text/>
208- </attribute>
209- <empty/>
210- </element>
211- <element name="distribution">
212- <attribute name="value">
213- <text/>
214- </attribute>
215- <empty/>
216- </element>
217- <element name="distroseries">
218- <attribute name="value">
219- <text/>
220- </attribute>
221- <empty/>
222- </element>
223- <element name="architecture">
224- <attribute name="value">
225- <text/>
226- </attribute>
227- <empty/>
228- </element>
229- <element name="private">
230- <attribute name="value">
231- <ref name="booleanValue"/>
232- </attribute>
233- <empty/>
234- </element>
235- <element name="contactable">
236- <attribute name="value">
237- <ref name="booleanValue"/>
238- </attribute>
239- <empty/>
240- </element>
241- <element name="date_created">
242- <attribute name="value">
243- <data type="dateTime"/>
244- </attribute>
245- <empty/>
246- </element>
247- <element name="client">
248- <attribute name="name">
249- <text/>
250- </attribute>
251- <attribute name="version">
252- <text/>
253- </attribute>
254- <empty/>
255- <zeroOrMore>
256- <element name="plugin">
257- <attribute name="name">
258- <text/>
259- </attribute>
260- <attribute name="version">
261- <text/>
262- </attribute>
263- </element>
264- </zeroOrMore>
265- </element>
266- <optional>
267- <element name="kernel-release">
268- <attribute name="value">
269- <text/>
270- </attribute>
271- </element>
272- </optional>
273- </interleave>
274- </define>
275-
276- <define name="hardwareSection">
277- <interleave>
278- <choice>
279- <element name="hal">
280- <attribute name="version">
281- <text/>
282- </attribute>
283- <oneOrMore>
284- <element name="device">
285- <attribute name="id">
286- <data type="integer">
287- <except>
288- <value/>
289- </except>
290- </data>
291- </attribute>
292- <attribute name="udi">
293- <text/>
294- </attribute>
295- <optional>
296- <attribute name="parent">
297- <data type="integer"/>
298- </attribute>
299- </optional>
300- <!-- XXX: Abel Deuring 2007-12-07:
301- specify a set of required properties? -->
302- <oneOrMore>
303- <ref name="property"/>
304- </oneOrMore>
305- </element>
306- </oneOrMore>
307- </element>
308- <group>
309- <interleave>
310- <element name="udev">
311- <text/>
312- </element>
313- <element name="dmi">
314- <text/>
315- </element>
316- <element name="sysfs-attributes">
317- <zeroOrMore>
318- <text/>
319- </zeroOrMore>
320- </element>
321- </interleave>
322- </group>
323- </choice>
324- <element name="processors">
325- <oneOrMore>
326- <element name="processor">
327- <attribute name="id">
328- <data type="integer">
329- <except>
330- <value/>
331- </except>
332- </data>
333- </attribute>
334- <attribute name="name">
335- <text/>
336- </attribute>
337- <oneOrMore>
338- <ref name="property"/>
339- </oneOrMore>
340- </element>
341- </oneOrMore>
342- </element>
343- <optional>
344- <element name="aliases">
345- <zeroOrMore>
346- <element name="alias">
347- <attribute name="target">
348- <text/>
349- </attribute>
350- <interleave>
351- <element name="vendor">
352- <text/>
353- </element>
354- <element name="model">
355- <text/>
356- </element>
357- </interleave>
358- </element>
359- </zeroOrMore>
360- </element>
361- </optional>
362- </interleave>
363- </define>
364-
365- <define name="softwareSection">
366- <interleave>
367- <element name="lsbrelease">
368- <!-- XXX: Abel Deuring 2007-12-07:
369- specify a more restrictive set of allowed
370- and/or required properties?
371- -->
372- <oneOrMore>
373- <ref name="property"/>
374- </oneOrMore>
375- </element>
376- <optional>
377- <element name="packages">
378- <zeroOrMore>
379- <element name="package">
380- <attribute name="name"/>
381- <attribute name="id">
382- <data type="integer">
383- <except>
384- <value/>
385- </except>
386- </data>
387- </attribute>
388- <oneOrMore>
389- <ref name="property"/>
390- </oneOrMore>
391- </element>
392- </zeroOrMore>
393- </element>
394- </optional>
395- <optional>
396- <element name="requirements">
397- <zeroOrMore>
398- <element name="requirement">
399- <attribute name="name"/>
400- <attribute name="id">
401- <data type="integer">
402- <except>
403- <value/>
404- </except>
405- </data>
406- </attribute>
407- <oneOrMore>
408- <ref name="property"/>
409- </oneOrMore>
410- </element>
411- </zeroOrMore>
412- </element>
413- </optional>
414- <optional>
415- <element name="xorg">
416- <attribute name="version">
417- <text/>
418- </attribute>
419- <zeroOrMore>
420- <element name="driver">
421- <optional>
422- <attribute name="device">
423- <data type="integer"/>
424- </attribute>
425- </optional>
426- <attribute name="name">
427- <text/>
428- </attribute>
429- <optional>
430- <attribute name="version">
431- <text/>
432- </attribute>
433- </optional>
434- <attribute name="class">
435- <text/>
436- </attribute>
437- </element>
438- </zeroOrMore>
439- </element>
440- </optional>
441- </interleave>
442- </define>
443-
444- <define name="questionsSection">
445- <zeroOrMore>
446- <element name="question">
447- <attribute name="name">
448- <text/>
449- </attribute>
450- <a:comment>
451- The attribute "plugin" must be set, if the question
452- is generated by a plugin.
453- </a:comment>
454- <optional>
455- <attribute name="plugin">
456- <text/>
457- </attribute>
458- </optional>
459- <interleave>
460- <optional>
461- <element name="command">
462- <text/>
463- </element>
464- </optional>
465- <choice>
466- <interleave>
467- <element name="answer">
468- <attribute name="type">
469- <value>multiple_choice</value>
470- </attribute>
471- <optional>
472- <attribute name="unit">
473- <text/>
474- </attribute>
475- </optional>
476- <text/>
477- </element>
478- <element name="answer_choices">
479- <oneOrMore>
480- <ref name="value"/>
481- </oneOrMore>
482- </element>
483- </interleave>
484- <element name="answer">
485- <attribute name="type">
486- <value>measurement</value>
487- </attribute>
488- <optional>
489- <attribute name="unit">
490- <text/>
491- </attribute>
492- </optional>
493- <data type="decimal"/>
494- </element>
495- </choice>
496- <zeroOrMore>
497- <element name="target">
498- <attribute name="id">
499- <text/>
500- </attribute>
501- <interleave>
502- <zeroOrMore>
503- <element name="driver">
504- <text/>
505- </element>
506- </zeroOrMore>
507- </interleave>
508- </element>
509- </zeroOrMore>
510- <optional>
511- <element name="comment">
512- <text/>
513- </element>
514- </optional>
515- </interleave>
516- </element>
517- </zeroOrMore>
518- </define>
519-
520- <define name="contextSection">
521- <zeroOrMore>
522- <element name="info">
523- <attribute name="command">
524- <text/>
525- </attribute>
526- <text/>
527- </element>
528- </zeroOrMore>
529- </define>
530-
531- <a:comment>
532- convenience for Python code: 'True'/'False' for boolean values
533- instead of 'true'/'false' as defined by
534- http://www.w3.org/2001/XMLSchema-datatypes .
535- </a:comment>
536- <define name="booleanValue">
537- <choice>
538- <value>True</value>
539- <value>False</value>
540- </choice>
541- </define>
542-
543- <define name="propertyAndValueContent">
544- <a:comment>
545- Allowed types and values:
546- The dbus... data types are used for HAL properties; the data
547- types are specified in
548- http://dbus.freedesktop.org/doc/dbus-specification.html
549- The other data types are Python data types, defined in
550- http://docs.python.org/lib/types.html
551- </a:comment>
552- <choice>
553- <group>
554- <attribute name="type">
555- <choice>
556- <value>dbus.Boolean</value>
557- <value>bool</value>
558- </choice>
559- </attribute>
560- <ref name="booleanValue"/>
561- </group>
562- <group>
563- <attribute name="type">
564- <choice>
565- <value>dbus.String</value>
566- <value>dbus.UTF8String</value>
567- <value>str</value>
568- </choice>
569- </attribute>
570- <text/>
571- </group>
572- <group>
573- <attribute name="type">
574- <value>dbus.Byte</value>
575- </attribute>
576- <data type="unsignedByte">
577- <except>
578- <value/>
579- </except>
580- </data>
581- </group>
582- <group>
583- <attribute name="type">
584- <value>dbus.Int16</value>
585- </attribute>
586- <data type="short">
587- <except>
588- <value/>
589- </except>
590- </data>
591- </group>
592- <group>
593- <attribute name="type">
594- <value>dbus.Int32</value>
595- </attribute>
596- <data type="int">
597- <except>
598- <value/>
599- </except>
600- </data>
601- </group>
602- <group>
603- <attribute name="type">
604- <value>dbus.Int64</value>
605- </attribute>
606- <data type="long">
607- <except>
608- <value/>
609- </except>
610- </data>
611- </group>
612- <group>
613- <attribute name="type">
614- <value>dbus.UInt16</value>
615- </attribute>
616- <data type="unsignedShort">
617- <except>
618- <value/>
619- </except>
620- </data>
621- </group>
622- <group>
623- <attribute name="type">
624- <value>dbus.UInt32</value>
625- </attribute>
626- <data type="unsignedInt">
627- <except>
628- <value/>
629- </except>
630- </data>
631- </group>
632- <group>
633- <attribute name="type">
634- <value>dbus.UInt64</value>
635- </attribute>
636- <data type="unsignedLong">
637- <except>
638- <value/>
639- </except>
640- </data>
641- </group>
642- <group>
643- <attribute name="type">
644- <value>int</value>
645- </attribute>
646- <data type="long">
647- <except>
648- <value/>
649- </except>
650- </data>
651- </group>
652- <group>
653- <attribute name="type">
654- <value>long</value>
655- </attribute>
656- <data type="integer">
657- <except>
658- <value/>
659- </except>
660- </data>
661- </group>
662- <group>
663- <attribute name="type">
664- <choice>
665- <value>dbus.Double</value>
666- <value>float</value>
667- </choice>
668- </attribute>
669- <data type="decimal"/>
670- </group>
671- <group>
672- <attribute name="type">
673- <choice>
674- <value>dbus.Array</value>
675- <value>list</value>
676- </choice>
677- </attribute>
678- <zeroOrMore>
679- <element name="value">
680- <ref name="propertyAndValueContent"/>
681- </element>
682- </zeroOrMore>
683- </group>
684- <group>
685- <attribute name="type">
686- <choice>
687- <value>dbus.Dictionary</value>
688- <value>dict</value>
689- </choice>
690- </attribute>
691- <zeroOrMore>
692- <element name="value">
693- <attribute name="name">
694- <text/>
695- </attribute>
696- <ref name="propertyAndValueContent"/>
697- </element>
698- </zeroOrMore>
699- </group>
700- </choice>
701- </define>
702-
703- <define name="property">
704- <element name="property">
705- <attribute name="name">
706- <text/>
707- </attribute>
708- <ref name="propertyAndValueContent"/>
709- </element>
710- </define>
711-
712- <define name="value">
713- <element name="value">
714- <ref name="propertyAndValueContent"/>
715- </element>
716- </define>
717-</grammar>
718diff --git a/plainbox/impl/commands/test_run.py b/plainbox/impl/commands/test_run.py
719index 7d6755b..19d7c9c 100644
720--- a/plainbox/impl/commands/test_run.py
721+++ b/plainbox/impl/commands/test_run.py
722@@ -131,7 +131,6 @@ class TestRun(TestCase):
723 self.assertEqual(call.exception.args, (0,))
724 expected = """
725 Available output formats:
726- com.canonical.plainbox::hexr - Generate XML (for certification)
727 com.canonical.plainbox::html - Generate a standalone HTML
728 com.canonical.plainbox::json - Generate JSON output
729 com.canonical.plainbox::rfc822 - Generate RCF822 output
730@@ -149,7 +148,6 @@ class TestRun(TestCase):
731 self.assertEqual(call.exception.args, (0,))
732 expected = """
733 Each format may support a different set of options
734- com.canonical.plainbox::hexr:
735 com.canonical.plainbox::html:
736 com.canonical.plainbox::json:
737 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
738diff --git a/plainbox/impl/exporter/jinja2.py b/plainbox/impl/exporter/jinja2.py
739index 765035f..8bced61 100644
740--- a/plainbox/impl/exporter/jinja2.py
741+++ b/plainbox/impl/exporter/jinja2.py
742@@ -46,21 +46,6 @@ CERTIFICATION_NS = 'com.canonical.certification::'
743
744
745 @environmentfilter
746-def do_sorted_xmlattr(_environment, d, autospace=True):
747- """A version of xmlattr filter that sorts attributes."""
748- rv = ' '.join(
749- '%s="%s"' % (escape(key), escape(value))
750- for key, value in sorted(d.items())
751- if value is not None and not isinstance(value, Undefined)
752- )
753- if autospace and rv:
754- rv = ' ' + rv
755- if _environment.autoescape:
756- rv = Markup(rv)
757- return rv
758-
759-
760-@environmentfilter
761 def do_strip_ns(_environment, unit_id, ns=CERTIFICATION_NS):
762 """Remove the namespace part of the identifier."""
763 if unit_id.startswith(ns):
764@@ -138,10 +123,9 @@ class Jinja2SessionStateExporter(ISessionStateExporter):
765 return self._unit
766
767 def customize_environment(self, env):
768- """Register filters and tests custom to the HEXR exporter."""
769+ """Register filters and tests custom to the JSON exporter."""
770 env.autoescape = True
771 env.filters['jsonify'] = json.dumps
772- env.filters['sorted_xmlattr'] = do_sorted_xmlattr
773 env.filters['strip_ns'] = do_strip_ns
774 env.tests['is_name'] = do_is_name
775
776diff --git a/plainbox/impl/exporter/test_hexr.py b/plainbox/impl/exporter/test_hexr.py
777deleted file mode 100644
778index 3ba2f62..0000000
779--- a/plainbox/impl/exporter/test_hexr.py
780+++ /dev/null
781@@ -1,661 +0,0 @@
782-# This file is part of Checkbox.
783-#
784-# Copyright 2015 Canonical Ltd.
785-# Written by:
786-# Zygmunt Krynicki <zygmunt.krynicki@canonical.com>
787-#
788-# Checkbox is free software: you can redistribute it and/or modify
789-# it under the terms of the GNU General Public License version 3,
790-# as published by the Free Software Foundation.
791-#
792-# Checkbox is distributed in the hope that it will be useful,
793-# but WITHOUT ANY WARRANTY; without even the implied warranty of
794-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
795-# GNU General Public License for more details.
796-#
797-# You should have received a copy of the GNU General Public License
798-# along with Checkbox. If not, see <http://www.gnu.org/licenses/>.
799-
800-"""Tests for the hexr exporter."""
801-
802-from io import BytesIO
803-from unittest import TestCase
804-from xml.etree import ElementTree
805-
806-from plainbox.impl.exporter.jinja2 import CERTIFICATION_NS
807-from plainbox.impl.exporter.jinja2 import Jinja2SessionStateExporter
808-from plainbox.impl.exporter.jinja2 import do_strip_ns
809-from plainbox.impl.providers.special import get_stubbox
810-from plainbox.impl.resource import Resource
811-from plainbox.impl.result import JobResultBuilder
812-from plainbox.impl.session import SessionManager
813-from plainbox.impl.unit.exporter import ExporterUnitSupport
814-from plainbox.impl.unit.job import JobDefinition
815-from plainbox.public import get_providers
816-from plainbox.vendor import mock
817-
818-
819-class FilterTests(TestCase):
820-
821- """Tests for additional filters."""
822-
823- def test_do_strip_ns(self):
824- env = mock.Mock()
825- self.assertEqual(do_strip_ns(env, "ns::id", "ns::"), "id")
826-
827- def test_do_strip_ns__defaults(self):
828- env = mock.Mock()
829- self.assertEqual(
830- do_strip_ns(env, "com.canonical.certification::id"), "id")
831-
832-
833-class HexrExporterTests(TestCase):
834-
835- """Tests for Jinja2SessionStateExporter using the HEXR template."""
836-
837- maxDiff = None
838-
839- def setUp(self):
840- """Common initialization."""
841- exporter_unit = self._get_all_exporter_units()[
842- 'com.canonical.plainbox::hexr']
843- self.exporter = Jinja2SessionStateExporter(
844- system_id='SYSTEM_ID', timestamp='TIMESTAMP',
845- client_version='CLIENT_VERSION', client_name='CLIENT_NAME',
846- exporter_unit=exporter_unit)
847- self.manager = SessionManager.create()
848- self.manager.add_local_device_context()
849-
850- def _get_all_exporter_units(self):
851- exporter_map = {}
852- for provider in get_providers():
853- for unit in provider.unit_list:
854- if unit.Meta.name == 'exporter':
855- exporter_map[unit.id] = ExporterUnitSupport(unit)
856- return exporter_map
857-
858- def _populate_session(self):
859- self._make_representative_jobs()
860- self._make_cert_resources()
861- self._make_cert_attachments()
862-
863- def _make_representative_jobs(self):
864- # Add all of the jobs from representative.pxu so that we don't have to
865- # create verbose fakes. Each job gets a simple passing result.
866- state = self.manager.default_device_context.state
867- stubbox = get_stubbox(validate=False, check=True)
868- for job in stubbox.job_list:
869- if not job.partial_id.startswith('representative/plugin/'):
870- continue
871- state.add_unit(job)
872- result = self._make_result_for(job)
873- state.update_job_result(job, result)
874- last_job = job
875- last_result = result
876- # Add a comment to one job (the last one)
877- state.update_job_result(
878- last_job, last_result.get_builder(
879- comments='COMMENTS').get_result())
880-
881- def _make_result_for(self, job):
882- builder = JobResultBuilder(outcome='pass')
883- if job.plugin == 'local':
884- pass
885- elif job.plugin == 'resource':
886- pass
887- else:
888- builder.io_log = [
889- (0, 'stdout', b'IO-LOG-STDOUT\n'),
890- (1, 'stderr', b'IO-LOG-STDERR\n')
891- ]
892- return builder.get_result()
893-
894- def _make_cert_resources(self):
895- # Create some specific resources that this exporter relies on. The
896- # corresponding jobs are _not_ loaded but this is irrelevant.
897- state = self.manager.default_device_context.state
898- ns = CERTIFICATION_NS
899- state.set_resource_list(ns + 'cpuinfo', [Resource({
900- 'PROP-1': 'VALUE-1',
901- 'PROP-2': 'VALUE-2',
902- 'count': '2', # NOTE: this has to be a number :/
903- })])
904- state.set_resource_list(ns + 'dpkg', [Resource({
905- 'architecture': 'dpkg.ARCHITECTURE',
906- })])
907- state.set_resource_list(ns + 'lsb', [Resource({
908- 'codename': 'lsb.CODENAME',
909- 'description': 'lsb.DESCRIPTION',
910- 'release': 'lsb.RELEASE',
911- 'distributor_id': 'lsb.DISTRIBUTOR_ID',
912- })])
913- state.set_resource_list(ns + 'uname', [Resource({
914- 'release': 'uname.RELEASE',
915- })])
916- state.set_resource_list(ns + 'package', [Resource({
917- 'name': 'package.0.NAME',
918- 'version': 'package.0.VERSION',
919- }), Resource({
920- 'name': 'package.1.NAME',
921- 'version': 'package.1.VERSION',
922- })])
923- state.set_resource_list(ns + 'requirements', [Resource({
924- 'name': 'requirement.0.NAME',
925- 'link': 'requirement.0.LINK',
926- }), Resource({
927- 'name': 'requirement.1.NAME',
928- 'link': 'requirement.1.LINK',
929- })])
930-
931- def _make_cert_empty_resources(self):
932- # Create empty resources, as experienced when the tested system
933- # freezes and corrupts the content of the session. (lp:1479719)
934- state = self.manager.default_device_context.state
935- ns = CERTIFICATION_NS
936- state.set_resource_list(ns + 'cpuinfo', [])
937- state.set_resource_list(ns + 'dpkg', [])
938- state.set_resource_list(ns + 'lsb', [])
939- state.set_resource_list(ns + 'uname', [])
940- state.set_resource_list(ns + 'package', [])
941- state.set_resource_list(ns + 'requirements', [])
942-
943- def _make_cert_attachments(self):
944- state = self.manager.default_device_context.state
945- partial_id_list = ['dmi_attachment', 'sysfs_attachment',
946- 'udev_attachment']
947- for partial_id in partial_id_list:
948- job = JobDefinition({
949- 'id': CERTIFICATION_NS + partial_id,
950- 'plugin': 'attachment'
951- })
952- result = JobResultBuilder(io_log=[
953- (0, 'stdout', 'STDOUT-{}\n'.format(
954- partial_id).encode('utf-8')),
955- (1, 'stderr', 'STDERR-{}\n'.format(
956- partial_id).encode('utf-8'))]
957- ).get_result()
958- state.add_unit(job)
959- state.update_job_result(job, result)
960-
961- def _inject_evil_input(self):
962- evil = '"\'<&>'
963- self.exporter._system_id = evil
964- self.exporter._timestamp = evil
965- self.exporter._client_name = evil
966- self.exporter._client_version = evil
967- state = self.manager.default_device_context.state
968- for resource_id in state.resource_map:
969- resource_list = state.resource_map[resource_id]
970- for resource in resource_list:
971- for key in resource:
972- if resource_id.endswith('cpuinfo') and key == 'count':
973- # don't change resources for the <hardware> section
974- continue
975- resource[key] = evil
976- new_job_state_map = {}
977- for index, job_id in enumerate(sorted(state.job_state_map)):
978- job_state = state.job_state_map[job_id]
979- if (job_state.job.partial_id.endswith('_attachment')
980- or job_state.job.partial_id == 'cpuinfo'):
981- # don't change attachments for the <hardware> section
982- evil_id = job_id
983- else:
984- evil_id = '{}-{}-{}'.format(evil, index, job_state.job.plugin)
985- # NOTE: using private API
986- job_state.job._data['id'] = evil_id
987- job_state.result = job_state.result.get_builder(
988- comments=evil,
989- io_log=[(0, 'stdout', evil.encode("UTF-8"))],
990- ).get_result()
991- new_job_state_map[evil_id] = job_state
992- # NOTE: using private API
993- state._job_state_map = new_job_state_map
994-
995- def tearDown(self):
996- """Common teardown."""
997- self.manager.destroy()
998-
999- def test_smoke(self):
1000- """The XML document has the right data in the right spot."""
1001- self._populate_session()
1002- stream = BytesIO()
1003- self.exporter.dump_from_session_manager(self.manager, stream)
1004- smoke_actual = stream.getvalue().decode("utf-8")
1005- self.assertMultiLineEqual(_smoke_expected, smoke_actual)
1006-
1007- def test_without_any_data(self):
1008- """The XML document can be produced without any data in the session."""
1009- stream = BytesIO()
1010- self.exporter.dump_from_session_manager(self.manager, stream)
1011- empty_actual = stream.getvalue().decode("utf-8")
1012- self.assertMultiLineEqual(_empty_expected, empty_actual)
1013-
1014- def _test_escaping(self):
1015- """Evil input doesn't break the correctness of the XML document."""
1016- self._populate_session()
1017- self._inject_evil_input()
1018- stream = BytesIO()
1019- self.exporter.dump_from_session_manager(self.manager, stream)
1020- evil_actual = stream.getvalue().decode("utf-8")
1021- self.assertMultiLineEqual(_evil_expected, evil_actual)
1022-
1023- def test_empty_resources(self):
1024- """Empty resources don't break the correctness of the XML document."""
1025- self._make_representative_jobs()
1026- self._make_cert_empty_resources()
1027- self._make_cert_attachments()
1028- stream = BytesIO()
1029- self.exporter.dump_from_session_manager(self.manager, stream)
1030- empty_resources_actual = stream.getvalue().decode("utf-8")
1031- self.assertMultiLineEqual(_empty_resources_expected, empty_resources_actual)
1032-
1033- def test_xml_parsability(self):
1034- """Each produced output can be parsed with an XML parser."""
1035- stream1 = BytesIO(_smoke_expected.encode("utf-8"))
1036- ElementTree.parse(stream1)
1037- stream2 = BytesIO(_empty_expected.encode("utf-8"))
1038- ElementTree.parse(stream2)
1039- stream3 = BytesIO(_evil_expected.encode("utf-8"))
1040- ElementTree.parse(stream3)
1041-
1042-
1043-_smoke_expected = """\
1044-<?xml version="1.0"?>
1045-<system version="1.0">
1046- <context>
1047- <info command="com.canonical.plainbox::representative/plugin/attachment">IO-LOG-STDOUT
1048-</info>
1049- </context>
1050- <hardware>
1051- <dmi>STDOUT-dmi_attachment
1052-</dmi>
1053- <sysfs-attributes>STDOUT-sysfs_attachment
1054-</sysfs-attributes>
1055- <udev>STDOUT-udev_attachment
1056-</udev>
1057- <processors>
1058- <processor id="0" name="0">
1059- <property name="count" type="str">2</property>
1060- <property name="PROP-1" type="str">VALUE-1</property>
1061- <property name="PROP-2" type="str">VALUE-2</property>
1062- </processor>
1063- <processor id="1" name="1">
1064- <property name="count" type="str">2</property>
1065- <property name="PROP-1" type="str">VALUE-1</property>
1066- <property name="PROP-2" type="str">VALUE-2</property>
1067- </processor>
1068- </processors>
1069- </hardware>
1070- <questions>
1071- <question name="com.canonical.plainbox::representative/plugin/manual">
1072- <answer type="multiple_choice">pass</answer>
1073- <answer_choices>
1074- <value type="str">none</value>
1075- <value type="str">pass</value>
1076- <value type="str">fail</value>
1077- <value type="str">skip</value>
1078- </answer_choices>
1079- <comment>IO-LOG-STDOUT
1080-IO-LOG-STDERR
1081-</comment>
1082- </question>
1083- <question name="com.canonical.plainbox::representative/plugin/qml">
1084- <answer type="multiple_choice">pass</answer>
1085- <answer_choices>
1086- <value type="str">none</value>
1087- <value type="str">pass</value>
1088- <value type="str">fail</value>
1089- <value type="str">skip</value>
1090- </answer_choices>
1091- <comment>IO-LOG-STDOUT
1092-IO-LOG-STDERR
1093-</comment>
1094- </question>
1095- <question name="com.canonical.plainbox::representative/plugin/shell">
1096- <answer type="multiple_choice">pass</answer>
1097- <answer_choices>
1098- <value type="str">none</value>
1099- <value type="str">pass</value>
1100- <value type="str">fail</value>
1101- <value type="str">skip</value>
1102- </answer_choices>
1103- <comment>IO-LOG-STDOUT
1104-IO-LOG-STDERR
1105-</comment>
1106- </question>
1107- <question name="com.canonical.plainbox::representative/plugin/user-interact">
1108- <answer type="multiple_choice">pass</answer>
1109- <answer_choices>
1110- <value type="str">none</value>
1111- <value type="str">pass</value>
1112- <value type="str">fail</value>
1113- <value type="str">skip</value>
1114- </answer_choices>
1115- <comment>IO-LOG-STDOUT
1116-IO-LOG-STDERR
1117-</comment>
1118- </question>
1119- <question name="com.canonical.plainbox::representative/plugin/user-interact-verify">
1120- <answer type="multiple_choice">pass</answer>
1121- <answer_choices>
1122- <value type="str">none</value>
1123- <value type="str">pass</value>
1124- <value type="str">fail</value>
1125- <value type="str">skip</value>
1126- </answer_choices>
1127- <comment>IO-LOG-STDOUT
1128-IO-LOG-STDERR
1129-</comment>
1130- </question>
1131- <question name="com.canonical.plainbox::representative/plugin/user-verify">
1132- <answer type="multiple_choice">pass</answer>
1133- <answer_choices>
1134- <value type="str">none</value>
1135- <value type="str">pass</value>
1136- <value type="str">fail</value>
1137- <value type="str">skip</value>
1138- </answer_choices>
1139- <comment>COMMENTS</comment>
1140- </question>
1141- </questions>
1142- <software>
1143- <lsbrelease>
1144- <property name="codename" type="str">lsb.CODENAME</property>
1145- <property name="description" type="str">lsb.DESCRIPTION</property>
1146- <property name="distributor_id" type="str">lsb.DISTRIBUTOR_ID</property>
1147- <property name="release" type="str">lsb.RELEASE</property>
1148- </lsbrelease>
1149- <packages>
1150- <package id="0" name="package.0.NAME">
1151- <property name="version" type="str">package.0.VERSION</property>
1152- </package>
1153- <package id="1" name="package.1.NAME">
1154- <property name="version" type="str">package.1.VERSION</property>
1155- </package>
1156- </packages>
1157- <requirements>
1158- <requirement id=" 0" name="requirement.0.NAME">
1159- <property name="link" type="str">requirement.0.LINK</property>
1160- </requirement>
1161- <requirement id=" 1" name="requirement.1.NAME">
1162- <property name="link" type="str">requirement.1.LINK</property>
1163- </requirement>
1164- </requirements>
1165- </software>
1166- <summary>
1167- <client name="CLIENT_NAME" version="CLIENT_VERSION"/>
1168- <date_created value="TIMESTAMP"/>
1169- <architecture value="dpkg.ARCHITECTURE"/>
1170- <distribution value="lsb.DISTRIBUTOR_ID"/>
1171- <distroseries value="lsb.RELEASE"/>
1172- <kernel-release value="uname.RELEASE"/>
1173- <private value="False"/>
1174- <contactable value="False"/>
1175- <live_cd value="False"/>
1176- <system_id value="SYSTEM_ID"/>
1177- </summary>
1178-</system>"""
1179-
1180-
1181-_empty_expected = """\
1182-<?xml version="1.0"?>
1183-<system version="1.0">
1184- <context>
1185- </context>
1186- <hardware>
1187- <!-- the dmi_attachment job is not available, not producing the <dmi> section -->
1188- <!-- the sysfs_attachment job is not available, not producing the <sysfs-attributes> tag -->
1189- <!-- the udev_attachment job is not available, not producing the <udev> tag -->
1190- <!-- cpuinfo resource is not available, not producing the <processors> section -->
1191- </hardware>
1192- <questions>
1193- </questions>
1194- <software>
1195- <!-- lsb resource is not available, not producing the <lsbrelease> tag -->
1196- <!-- package resource is not available, not producing the <packages> tag -->
1197- <!-- requirements resource is not available, not producing the <requirements> tag -->
1198- </software>
1199- <summary>
1200- <client name="CLIENT_NAME" version="CLIENT_VERSION"/>
1201- <date_created value="TIMESTAMP"/>
1202- <!-- dpkg resource is not available, not producing the <architecture> tag -->
1203- <!-- lsb resource is not available, not producing <distribution> and <distroseries> tags -->
1204- <!-- uname resource is not available, not producing the <kernel-release> tag -->
1205- <private value="False"/>
1206- <contactable value="False"/>
1207- <live_cd value="False"/>
1208- <system_id value="SYSTEM_ID"/>
1209- </summary>
1210-</system>"""
1211-
1212-_escaped_evil_text = '&#34;&#39;&lt;&amp;&gt;'
1213-_evil_expected = """\
1214-<?xml version="1.0"?>
1215-<system version="1.0">
1216- <context>
1217- <info command="com.canonical.plainbox::&#34;&#39;&lt;&amp;&gt;-3-attachment">&#34;&#39;&lt;&amp;&gt;</info>
1218- </context>
1219- <hardware>
1220- <dmi>&#34;&#39;&lt;&amp;&gt;</dmi>
1221- <sysfs-attributes>&#34;&#39;&lt;&amp;&gt;</sysfs-attributes>
1222- <udev>&#34;&#39;&lt;&amp;&gt;</udev>
1223- <processors>
1224- <processor id="0" name="0">
1225- <property name="count" type="str">2</property>
1226- <property name="PROP-1" type="str">{evil}</property>
1227- <property name="PROP-2" type="str">{evil}</property>
1228- </processor>
1229- <processor id="1" name="1">
1230- <property name="count" type="str">2</property>
1231- <property name="PROP-1" type="str">{evil}</property>
1232- <property name="PROP-2" type="str">{evil}</property>
1233- </processor>
1234- </processors>
1235- </hardware>
1236- <questions>
1237- <question name="com.canonical.plainbox::&#34;&#39;&lt;&amp;&gt;-10-user-interact-verify">
1238- <answer type="multiple_choice">pass</answer>
1239- <answer_choices>
1240- <value type="str">none</value>
1241- <value type="str">pass</value>
1242- <value type="str">fail</value>
1243- <value type="str">skip</value>
1244- </answer_choices>
1245- <comment>&#34;&#39;&lt;&amp;&gt;</comment>
1246- </question>
1247- <question name="com.canonical.plainbox::&#34;&#39;&lt;&amp;&gt;-11-user-verify">
1248- <answer type="multiple_choice">pass</answer>
1249- <answer_choices>
1250- <value type="str">none</value>
1251- <value type="str">pass</value>
1252- <value type="str">fail</value>
1253- <value type="str">skip</value>
1254- </answer_choices>
1255- <comment>&#34;&#39;&lt;&amp;&gt;</comment>
1256- </question>
1257- <question name="com.canonical.plainbox::&#34;&#39;&lt;&amp;&gt;-5-manual">
1258- <answer type="multiple_choice">pass</answer>
1259- <answer_choices>
1260- <value type="str">none</value>
1261- <value type="str">pass</value>
1262- <value type="str">fail</value>
1263- <value type="str">skip</value>
1264- </answer_choices>
1265- <comment>&#34;&#39;&lt;&amp;&gt;</comment>
1266- </question>
1267- <question name="com.canonical.plainbox::&#34;&#39;&lt;&amp;&gt;-6-qml">
1268- <answer type="multiple_choice">pass</answer>
1269- <answer_choices>
1270- <value type="str">none</value>
1271- <value type="str">pass</value>
1272- <value type="str">fail</value>
1273- <value type="str">skip</value>
1274- </answer_choices>
1275- <comment>&#34;&#39;&lt;&amp;&gt;</comment>
1276- </question>
1277- <question name="com.canonical.plainbox::&#34;&#39;&lt;&amp;&gt;-8-shell">
1278- <answer type="multiple_choice">pass</answer>
1279- <answer_choices>
1280- <value type="str">none</value>
1281- <value type="str">pass</value>
1282- <value type="str">fail</value>
1283- <value type="str">skip</value>
1284- </answer_choices>
1285- <comment>&#34;&#39;&lt;&amp;&gt;</comment>
1286- </question>
1287- <question name="com.canonical.plainbox::&#34;&#39;&lt;&amp;&gt;-9-user-interact">
1288- <answer type="multiple_choice">pass</answer>
1289- <answer_choices>
1290- <value type="str">none</value>
1291- <value type="str">pass</value>
1292- <value type="str">fail</value>
1293- <value type="str">skip</value>
1294- </answer_choices>
1295- <comment>&#34;&#39;&lt;&amp;&gt;</comment>
1296- </question>
1297- </questions>
1298- <software>
1299- <lsbrelease>
1300- <property name="codename" type="str">{evil}</property>
1301- <property name="description" type="str">{evil}</property>
1302- <property name="distributor_id" type="str">{evil}</property>
1303- <property name="release" type="str">{evil}</property>
1304- </lsbrelease>
1305- <packages>
1306- <package id="0" name="{evil}">
1307- <property name="version" type="str">{evil}</property>
1308- </package>
1309- <package id="1" name="{evil}">
1310- <property name="version" type="str">{evil}</property>
1311- </package>
1312- </packages>
1313- <requirements>
1314- <requirement id=" 0" name="{evil}">
1315- <property name="link" type="str">{evil}</property>
1316- </requirement>
1317- <requirement id=" 1" name="{evil}">
1318- <property name="link" type="str">{evil}</property>
1319- </requirement>
1320- </requirements>
1321- </software>
1322- <summary>
1323- <client name="{evil}" version="{evil}"/>
1324- <date_created value="{evil}"/>
1325- <architecture value="{evil}"/>
1326- <distribution value="{evil}"/>
1327- <distroseries value="{evil}"/>
1328- <kernel-release value="{evil}"/>
1329- <private value="False"/>
1330- <contactable value="False"/>
1331- <live_cd value="False"/>
1332- <system_id value="{evil}"/>
1333- </summary>
1334-</system>""".format(evil=_escaped_evil_text)
1335-
1336-_empty_resources_expected = """\
1337-<?xml version="1.0"?>
1338-<system version="1.0">
1339- <context>
1340- <info command="com.canonical.plainbox::representative/plugin/attachment">IO-LOG-STDOUT
1341-</info>
1342- </context>
1343- <hardware>
1344- <dmi>STDOUT-dmi_attachment
1345-</dmi>
1346- <sysfs-attributes>STDOUT-sysfs_attachment
1347-</sysfs-attributes>
1348- <udev>STDOUT-udev_attachment
1349-</udev>
1350- <!-- cpuinfo resource is not available, not producing the <processors> section -->
1351- </hardware>
1352- <questions>
1353- <question name="com.canonical.plainbox::representative/plugin/manual">
1354- <answer type="multiple_choice">pass</answer>
1355- <answer_choices>
1356- <value type="str">none</value>
1357- <value type="str">pass</value>
1358- <value type="str">fail</value>
1359- <value type="str">skip</value>
1360- </answer_choices>
1361- <comment>IO-LOG-STDOUT
1362-IO-LOG-STDERR
1363-</comment>
1364- </question>
1365- <question name="com.canonical.plainbox::representative/plugin/qml">
1366- <answer type="multiple_choice">pass</answer>
1367- <answer_choices>
1368- <value type="str">none</value>
1369- <value type="str">pass</value>
1370- <value type="str">fail</value>
1371- <value type="str">skip</value>
1372- </answer_choices>
1373- <comment>IO-LOG-STDOUT
1374-IO-LOG-STDERR
1375-</comment>
1376- </question>
1377- <question name="com.canonical.plainbox::representative/plugin/shell">
1378- <answer type="multiple_choice">pass</answer>
1379- <answer_choices>
1380- <value type="str">none</value>
1381- <value type="str">pass</value>
1382- <value type="str">fail</value>
1383- <value type="str">skip</value>
1384- </answer_choices>
1385- <comment>IO-LOG-STDOUT
1386-IO-LOG-STDERR
1387-</comment>
1388- </question>
1389- <question name="com.canonical.plainbox::representative/plugin/user-interact">
1390- <answer type="multiple_choice">pass</answer>
1391- <answer_choices>
1392- <value type="str">none</value>
1393- <value type="str">pass</value>
1394- <value type="str">fail</value>
1395- <value type="str">skip</value>
1396- </answer_choices>
1397- <comment>IO-LOG-STDOUT
1398-IO-LOG-STDERR
1399-</comment>
1400- </question>
1401- <question name="com.canonical.plainbox::representative/plugin/user-interact-verify">
1402- <answer type="multiple_choice">pass</answer>
1403- <answer_choices>
1404- <value type="str">none</value>
1405- <value type="str">pass</value>
1406- <value type="str">fail</value>
1407- <value type="str">skip</value>
1408- </answer_choices>
1409- <comment>IO-LOG-STDOUT
1410-IO-LOG-STDERR
1411-</comment>
1412- </question>
1413- <question name="com.canonical.plainbox::representative/plugin/user-verify">
1414- <answer type="multiple_choice">pass</answer>
1415- <answer_choices>
1416- <value type="str">none</value>
1417- <value type="str">pass</value>
1418- <value type="str">fail</value>
1419- <value type="str">skip</value>
1420- </answer_choices>
1421- <comment>COMMENTS</comment>
1422- </question>
1423- </questions>
1424- <software>
1425- <!-- lsb resource is not available, not producing the <lsbrelease> tag -->
1426- <packages>
1427- </packages>
1428- <requirements>
1429- </requirements>
1430- </software>
1431- <summary>
1432- <client name="CLIENT_NAME" version="CLIENT_VERSION"/>
1433- <date_created value="TIMESTAMP"/>
1434- <!-- dpkg resource is not available, not producing the <architecture> tag -->
1435- <!-- lsb resource is not available, not producing <distribution> and <distroseries> tags -->
1436- <!-- uname resource is not available, not producing the <kernel-release> tag -->
1437- <private value="False"/>
1438- <contactable value="False"/>
1439- <live_cd value="False"/>
1440- <system_id value="SYSTEM_ID"/>
1441- </summary>
1442-</system>"""
1443diff --git a/plainbox/impl/launcher.py b/plainbox/impl/launcher.py
1444index dffab32..c535aef 100644
1445--- a/plainbox/impl/launcher.py
1446+++ b/plainbox/impl/launcher.py
1447@@ -133,12 +133,6 @@ class LauncherDefinitionLegacy(LauncherDefinition):
1448 section="submission",
1449 help_text=_("Label on the 'send' button"))
1450
1451- submit_to_hexr = config.Variable(
1452- section="submission",
1453- kind=bool,
1454- # TODO: default?
1455- help_text=_("If enabled then test results will be also sent to HEXR"))
1456-
1457 submit_to = config.Variable(
1458 section="transport",
1459 validator_list=[config.ChoiceValidator(get_all_transports().keys())],
1460diff --git a/plainbox/impl/providers/exporters/data/checkbox.json b/plainbox/impl/providers/exporters/data/checkbox.json
1461index 31bfff6..00ed7e1 100644
1462--- a/plainbox/impl/providers/exporters/data/checkbox.json
1463+++ b/plainbox/impl/providers/exporters/data/checkbox.json
1464@@ -42,7 +42,7 @@
1465 "name": "{{ job_state.job.tr_summary() }}",
1466 "certification_status": "{{ job_state.effective_certification_status }}",
1467 "category": "{{ job_state.effective_category_id }}",
1468- "status": "{{ job_state.result.outcome_meta().hexr_xml_mapping }}",
1469+ "status": "{{ job_state.result.outcome_meta().hexr_mapping }}",
1470 "comments": {{ job_state.result.comments | jsonify | safe }},
1471 "io_log": {{ job_state.result.io_log_as_flat_text | jsonify | safe }},
1472 "type": "test",
1473diff --git a/plainbox/impl/providers/exporters/data/hexr.xml b/plainbox/impl/providers/exporters/data/hexr.xml
1474deleted file mode 100644
1475index 649c84c..0000000
1476--- a/plainbox/impl/providers/exporters/data/hexr.xml
1477+++ /dev/null
1478@@ -1,161 +0,0 @@
1479-{%- set ns = 'com.canonical.certification::' -%}
1480-{%- set state = manager.default_device_context.state -%}
1481-{%- set job_state_map = state.job_state_map -%}
1482-{%- set hexr_outcome_list = OUTCOME_METADATA_MAP.values()|selectattr('hexr_xml_allowed')|sort(attribute='hexr_xml_order') -%}
1483-<?xml version="1.0"?>
1484-<system version="1.0">
1485- <context>
1486- {%- for job_id in job_state_map|sort %}
1487- {%- set job_state = job_state_map[job_id] %}
1488- {%- 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 %}
1489- <info command="{{ job_state.job.id|strip_ns }}">{{ job_state.result.io_log_as_text_attachment }}</info>
1490- {%- endif %}
1491- {%- endfor %}
1492- </context>
1493- <hardware>
1494- {%- if ns ~ 'dmi_attachment' in state.job_state_map %}
1495- {%- set dmi_attachment = state.job_state_map[ns ~ 'dmi_attachment'].result.io_log_as_text_attachment %}
1496- <dmi>{{ dmi_attachment }}</dmi>
1497- {%- else %}
1498- <!-- the dmi_attachment job is not available, not producing the <dmi> section -->
1499- {%- endif %}
1500- {%- if ns ~ 'sysfs_attachment' in state.job_state_map %}
1501- {%- set sysfs_attachment = state.job_state_map[ns ~ 'sysfs_attachment'].result.io_log_as_text_attachment %}
1502- <sysfs-attributes>{{ sysfs_attachment }}</sysfs-attributes>
1503- {%- else %}
1504- <!-- the sysfs_attachment job is not available, not producing the <sysfs-attributes> tag -->
1505- {%- endif %}
1506- {%- if ns ~ 'udev_attachment' in state.job_state_map %}
1507- {%- set udev_attachment = state.job_state_map[ns ~ 'udev_attachment'].result.io_log_as_text_attachment %}
1508- <udev>{{ udev_attachment }}</udev>
1509- {%- else %}
1510- <!-- the udev_attachment job is not available, not producing the <udev> tag -->
1511- {%- endif %}
1512- {%- if ns ~ 'cpuinfo' in state.resource_map and state.resource_map[ns ~ 'cpuinfo'][0] %}
1513- {%- set processor_resource = state.resource_map[ns ~ 'cpuinfo'][0] %}
1514- {#- FIXME: The <processors> section is quite broken by design. #}
1515- {#- Yes, it does copy the data for the 0th CPU $count times. #}
1516- <processors>
1517- {%- for dummy_index in range(processor_resource.count|int) %}
1518- <processor id="{{ loop.index0 }}" name="{{ loop.index0 }}">
1519- {%- for key in processor_resource|sort %}
1520- <property name="{{ key }}" type="str">{{ processor_resource[key] }}</property>
1521- {%- endfor %}
1522- </processor>
1523- {%- endfor %}
1524- </processors>
1525- {%- else %}
1526- <!-- cpuinfo resource is not available, not producing the <processors> section -->
1527- {%- endif %}
1528- </hardware>
1529- <questions>
1530- {%- for job_id in job_state_map|sort %}
1531- {%- set job_state = job_state_map[job_id] %}
1532- {%- set job = job_state.job %}
1533- {%- set result = job_state.result %}
1534- {%- if job.plugin not in ("resource", "local", "attachment") and job_state.result.outcome %}
1535- <question{{ {
1536- 'name': job.id|strip_ns,
1537- 'certification_status': job_state.certification_status,
1538- }|sorted_xmlattr }}>
1539- <answer type="multiple_choice">{{ result.outcome_meta().hexr_xml_mapping }}</answer>
1540- {#- FIXME: Yes the <answer_choices> section is useless #}
1541- <answer_choices>
1542- {%- for outcome_info in hexr_outcome_list %}
1543- <value type="str">{{ outcome_info.hexr_xml_mapping }}</value>
1544- {%- endfor %}
1545- </answer_choices>
1546- {#- FIXME: yes this does munges comments and I/O log #}
1547- <comment>
1548- {%- if result.comments -%}
1549- {{ result.comments }}
1550- {%- else -%}
1551- {{ result.io_log_as_flat_text }}
1552- {%- endif -%}
1553- </comment>
1554- </question>
1555- {%- endif %}
1556- {%- endfor %}
1557- </questions>
1558- <software>
1559- {%- if ns ~ 'lsb' in state.resource_map and state.resource_map[ns ~ 'lsb'][0] %}
1560- {%- set lsb_resource = state.resource_map[ns ~ 'lsb'][0] %}
1561- <lsbrelease>
1562- {%- for key in lsb_resource|sort %}
1563- <property name="{{ key }}" type="str">{{ lsb_resource[key] }}</property>
1564- {%- endfor %}
1565- </lsbrelease>
1566- {%- else %}
1567- <!-- lsb resource is not available, not producing the <lsbrelease> tag -->
1568- {%- endif %}
1569- {%- if ns ~ 'package' in state.resource_map %}
1570- {%- set package_resource_list = state.resource_map[ns ~ 'package'] %}
1571- <packages>
1572- {%- for package_resource in package_resource_list if package_resource.name %}
1573- <package id="{{ loop.index0 }}" name="{{ package_resource.name }}">
1574- {%- for key in package_resource|reject('is_name')|sort %}
1575- <property name="{{ key }}" type="str">{{ package_resource[key] }}</property>
1576- {%- endfor %}
1577- </package>
1578- {%- endfor %}
1579- </packages>
1580- {%- else %}
1581- <!-- package resource is not available, not producing the <packages> tag -->
1582- {%- endif %}
1583- {%- if ns ~ 'snap' in state.resource_map %}
1584- {%- set snap_package_resource_list = state.resource_map[ns ~ 'snap'] %}
1585- <snap_packages>
1586- {%- for snap_package_resource in snap_package_resource_list if snap_package_resource.name %}
1587- <snap_package id="{{ loop.index0 }}" name="{{ snap_package_resource.name }}">
1588- {%- for key in snap_package_resource|reject('is_name')|sort %}
1589- <property name="{{ key }}" type="str">{{ snap_package_resource[key] }}</property>
1590- {%- endfor %}
1591- </snap_package>
1592- {%- endfor %}
1593- </snap_packages>
1594- {%- endif %}
1595- {%- if ns ~ 'requirements' in state.resource_map %}
1596- {%- set requirement_resource_list = state.resource_map[ns ~ 'requirements'] %}
1597- <requirements>
1598- {%- for requirement_resource in requirement_resource_list %}
1599- <requirement id=" {{ loop.index0 }}" name="{{ requirement_resource.name }}">
1600- {%- for key in requirement_resource|reject('is_name')|sort %}
1601- <property name="{{ key }}" type="str">{{ requirement_resource[key] }}</property>
1602- {%- endfor %}
1603- </requirement>
1604- {%- endfor %}
1605- </requirements>
1606- {%- else %}
1607- <!-- requirements resource is not available, not producing the <requirements> tag -->
1608- {%- endif %}
1609- </software>
1610- <summary>
1611- {#- FIXME: with all the <property> tags those should not be custom #}
1612- <client name="{{ client_name }}" version="{{ client_version }}"/>
1613- <date_created value="{{ timestamp }}"/>
1614- {%- if ns ~ 'dpkg' in state.resource_map and state.resource_map[ns ~ 'dpkg'][0] %}
1615- {%- set dpkg_resource = state.resource_map[ns ~ 'dpkg'][0] %}
1616- <architecture value="{{ dpkg_resource.architecture }}"/>
1617- {%- else %}
1618- <!-- dpkg resource is not available, not producing the <architecture> tag -->
1619- {%- endif %}
1620- {%- if ns ~ 'lsb' in state.resource_map and lsb_resource %}
1621- {#- NOTE: lsb_resource is computed earlier, if the condition above holds #}
1622- <distribution value="{{ lsb_resource.distributor_id }}"/>
1623- <distroseries value="{{ lsb_resource.release }}"/>
1624- {%- else %}
1625- <!-- lsb resource is not available, not producing <distribution> and <distroseries> tags -->
1626- {%- endif %}
1627- {%- if ns ~ 'uname' in state.resource_map and state.resource_map[ns ~ 'uname'][0] %}
1628- {%- set uname_resource = state.resource_map[ns ~ 'uname'][0] %}
1629- <kernel-release value="{{ uname_resource.release }}"/>
1630- {%- else %}
1631- <!-- uname resource is not available, not producing the <kernel-release> tag -->
1632- {%- endif %}
1633- {#- FIXME: yes, this is just hard-coded non-sense #}
1634- <private value="False"/>
1635- <contactable value="False"/>
1636- <live_cd value="False"/>
1637- <system_id value="{{ system_id }}"/>
1638- </summary>
1639-</system>
1640diff --git a/plainbox/impl/providers/exporters/units/exporter.pxu b/plainbox/impl/providers/exporters/units/exporter.pxu
1641index 66e155a..0d7ec67 100644
1642--- a/plainbox/impl/providers/exporters/units/exporter.pxu
1643+++ b/plainbox/impl/providers/exporters/units/exporter.pxu
1644@@ -1,11 +1,4 @@
1645 unit: exporter
1646-id: hexr
1647-_summary: Generate XML (for certification)
1648-entry_point: jinja2
1649-file_extension: xml
1650-data: {"template": "hexr.xml"}
1651-
1652-unit: exporter
1653 id: html
1654 _summary: Generate a standalone HTML
1655 entry_point: jinja2
1656diff --git a/plainbox/impl/result.py b/plainbox/impl/result.py
1657index 8bbf98a..ec325e6 100644
1658--- a/plainbox/impl/result.py
1659+++ b/plainbox/impl/result.py
1660@@ -54,8 +54,7 @@ logger = logging.getLogger("plainbox.result")
1661 # U+007F..U+009F. Also known as control characters."
1662 #
1663 # NOTE: we don't want to match certain control characters (newlines, carriage
1664-# returns, tabs or vertical tabs as those are allowed by lxml and it would be
1665-# silly to strip them.
1666+# returns, tabs or vertical tabs).
1667 CONTROL_CODE_RE_STR = re.compile(
1668 "(?![\n\r\t\v])[\u0000-\u001F]|[\u007F-\u009F]")
1669
1670@@ -105,24 +104,11 @@ IOLogRecord = namedtuple("IOLogRecord", "delay stream_name data".split())
1671 # for graphical applications in the same way as color_ansi is useful for
1672 # console applications.
1673 #
1674-# hexr_xml_mapping - a string that needs to be used in the XML report for the
1675-# Canonical HEXR application (also for the Canonical Certification web
1676-# application). Those values must be in sync with a piece of code in
1677-# checkbox_support that handles parsing of the XML report, for as long as the
1678-# report is to be maintained.
1679-#
1680-# hexr_xml_allowed - a boolean indicating that this outcome may appear
1681-# in the XML document generated for the Canonical HEXR application. In
1682-# theory it can go away as we can now easily control both "sides"
1683-# (client and server) but it does exist today.
1684-#
1685-# hexr_xml_order - an (optional) integer used for ordering allowed values.
1686-# This is used so that the XML output can have a fixed ordering regardless of
1687-# the actual order of entries in the dictionary.
1688+# hexr_mapping - a string that needs to be used in the XML report for the
1689+# Canonical Certification web application.
1690 OutcomeMetadata = namedtuple(
1691 "OutcomeMetadata", ("value unicode_sigil tr_outcome tr_label color_ansi"
1692- " color_hex hexr_xml_mapping hexr_xml_allowed"
1693- " hexr_xml_order"))
1694+ " color_hex hexr_mapping"))
1695
1696 OUTCOME_METADATA_MAP = {
1697 IJobResult.OUTCOME_NONE: OutcomeMetadata(
1698@@ -132,9 +118,7 @@ OUTCOME_METADATA_MAP = {
1699 tr_label=C_("chart label", "not started"),
1700 color_ansi="",
1701 color_hex="#000000",
1702- hexr_xml_mapping="none",
1703- hexr_xml_allowed=True,
1704- hexr_xml_order=0,
1705+ hexr_mapping="none",
1706 ),
1707 IJobResult.OUTCOME_PASS: OutcomeMetadata(
1708 value=IJobResult.OUTCOME_PASS,
1709@@ -143,9 +127,7 @@ OUTCOME_METADATA_MAP = {
1710 tr_label=C_("chart label", "passed"),
1711 color_ansi="\033[32;1m",
1712 color_hex="#6AA84F",
1713- hexr_xml_mapping="pass",
1714- hexr_xml_allowed=True,
1715- hexr_xml_order=1,
1716+ hexr_mapping="pass",
1717 ),
1718 IJobResult.OUTCOME_FAIL: OutcomeMetadata(
1719 value=IJobResult.OUTCOME_FAIL,
1720@@ -154,9 +136,7 @@ OUTCOME_METADATA_MAP = {
1721 tr_label=C_("chart label", "failed"),
1722 color_ansi="\033[31;1m",
1723 color_hex="#DC3912",
1724- hexr_xml_mapping="fail",
1725- hexr_xml_allowed=True,
1726- hexr_xml_order=2,
1727+ hexr_mapping="fail",
1728 ),
1729 IJobResult.OUTCOME_SKIP: OutcomeMetadata(
1730 value=IJobResult.OUTCOME_SKIP,
1731@@ -165,9 +145,7 @@ OUTCOME_METADATA_MAP = {
1732 tr_label=C_("chart label", "skipped"),
1733 color_ansi="\033[33;1m",
1734 color_hex="#FF9900",
1735- hexr_xml_mapping="skip",
1736- hexr_xml_allowed=True,
1737- hexr_xml_order=3,
1738+ hexr_mapping="skip",
1739 ),
1740 IJobResult.OUTCOME_NOT_SUPPORTED: OutcomeMetadata(
1741 value=IJobResult.OUTCOME_NOT_SUPPORTED,
1742@@ -176,9 +154,7 @@ OUTCOME_METADATA_MAP = {
1743 tr_label=C_("chart label", "not supported"),
1744 color_ansi="\033[33;1m",
1745 color_hex="#FF9900",
1746- hexr_xml_mapping="skip",
1747- hexr_xml_allowed=False,
1748- hexr_xml_order=None,
1749+ hexr_mapping="skip",
1750 ),
1751 IJobResult.OUTCOME_NOT_IMPLEMENTED: OutcomeMetadata(
1752 value=IJobResult.OUTCOME_NOT_IMPLEMENTED,
1753@@ -187,9 +163,7 @@ OUTCOME_METADATA_MAP = {
1754 tr_label=C_("chart label", "not implemented"),
1755 color_ansi="\033[31;1m",
1756 color_hex="#DC3912",
1757- hexr_xml_mapping="skip",
1758- hexr_xml_allowed=False,
1759- hexr_xml_order=None,
1760+ hexr_mapping="skip",
1761 ),
1762 IJobResult.OUTCOME_UNDECIDED: OutcomeMetadata(
1763 value=IJobResult.OUTCOME_UNDECIDED,
1764@@ -198,9 +172,7 @@ OUTCOME_METADATA_MAP = {
1765 tr_label=C_("chart label", "undecided"),
1766 color_ansi="\033[35;1m",
1767 color_hex="#FF00FF",
1768- hexr_xml_mapping="skip",
1769- hexr_xml_allowed=False,
1770- hexr_xml_order=None,
1771+ hexr_mapping="skip",
1772 ),
1773 IJobResult.OUTCOME_CRASH: OutcomeMetadata(
1774 value=IJobResult.OUTCOME_CRASH,
1775@@ -209,9 +181,7 @@ OUTCOME_METADATA_MAP = {
1776 tr_label=C_("chart label", "crashed"),
1777 color_ansi="\033[41;37;1m",
1778 color_hex="#FF0000",
1779- hexr_xml_mapping="fail",
1780- hexr_xml_allowed=False,
1781- hexr_xml_order=None,
1782+ hexr_mapping="fail",
1783 ),
1784 }
1785
1786diff --git a/plainbox/impl/session/assistant.py b/plainbox/impl/session/assistant.py
1787index 17c396b..52271e7 100644
1788--- a/plainbox/impl/session/assistant.py
1789+++ b/plainbox/impl/session/assistant.py
1790@@ -57,7 +57,6 @@ from plainbox.impl.session.manager import SessionManager
1791 from plainbox.impl.session.restart import IRestartStrategy
1792 from plainbox.impl.session.restart import detect_restart_strategy
1793 from plainbox.impl.session.storage import SessionStorageRepository
1794-from plainbox.impl.transport import CertificationTransport
1795 from plainbox.impl.transport import OAuthTransport
1796 from plainbox.impl.transport import TransportError
1797 from plainbox.public import get_providers
1798@@ -190,10 +189,6 @@ class SessionAssistant:
1799 "use an alternate execution controllers"),
1800 self.select_providers: (
1801 "select the providers to work with"),
1802- self.get_canonical_certification_transport: (
1803- "create a transport for the C3 system"),
1804- self.get_canonical_hexr_transport: (
1805- "create a transport for the HEXR system"),
1806 self.get_old_sessions: (
1807 "get previously created sessions"),
1808 self.delete_sessions: (
1809@@ -1475,10 +1470,6 @@ class SessionAssistant:
1810 self.export_to_stream: "to export the results to a stream",
1811 self.get_resumable_sessions: "to get resume candidates",
1812 self.start_new_session: "to create a new session",
1813- self.get_canonical_certification_transport: (
1814- "create a transport for the C3 system"),
1815- self.get_canonical_hexr_transport: (
1816- "create a transport for the HEXR system"),
1817 self.get_old_sessions: (
1818 "get previously created sessions"),
1819 self.delete_sessions: (
1820@@ -1503,7 +1494,7 @@ class SessionAssistant:
1821 :param transport:
1822 A pre-created transport object such as the `CertificationTransport`
1823 that is useful for sending data to the Canonical Certification
1824- Website and HEXR. This can also be any object conforming to the
1825+ Website. This can also be any object conforming to the
1826 appropriate API.
1827 :param options:
1828 (optional) List of options customary to the exporter that is being
1829@@ -1599,71 +1590,6 @@ class SessionAssistant:
1830 self._metadata.flags.add(SessionMetaData.FLAG_SUBMITTED)
1831 self._manager.checkpoint()
1832
1833- @raises(ValueError, UnexpectedMethodCall)
1834- def get_canonical_certification_transport(
1835- self, secure_id: str, *, staging: bool=False
1836- ) -> "ISesssionStateTransport":
1837- """
1838- Get a transport for the Canonical Certification website.
1839-
1840- :param secure_id:
1841- The *secure identifier* of the machine. This is an identifier
1842- issued by Canonical. It is only applicable to machines that are
1843- tested by the Hardware Certification team.
1844- :param staging:
1845- Flag indicating if the staging server should be used.
1846- :returns:
1847- A ISessionStateTransport instance with appropriate configuration.
1848- In practice the transport object should be passed to
1849- :meth:`export_to_transport()` and not handled in any other way.
1850- :raises ValueError:
1851- if the ``secure_id`` is malformed.
1852- :raises UnexpectedMethodCall:
1853- If the call is made at an unexpected time. Do not catch this error.
1854- It is a bug in your program. The error message will indicate what
1855- is the likely cause.
1856-
1857- This transport, same as the hexr transport, expects the data created by
1858- the ``"hexr"`` exporter.
1859- """
1860- UsageExpectation.of(self).enforce()
1861- if staging:
1862- url = ('https://certification.staging.canonical.com/'
1863- 'submissions/submit/')
1864- else:
1865- url = 'https://certification.canonical.com/submissions/submit/'
1866- options = "secure_id={}".format(secure_id)
1867- return CertificationTransport(url, options)
1868-
1869- @raises(UnexpectedMethodCall)
1870- def get_canonical_hexr_transport(
1871- self, *, staging: bool=False
1872- ) -> "ISesssionStateTransport":
1873- """
1874- Get a transport for the Canonical HEXR website.
1875-
1876- :param staging:
1877- Flag indicating if the staging server should be used.
1878- :returns:
1879- A ISessionStateTransport instance with appropriate configuration.
1880- In practice the transport object should be passed to
1881- :meth:`export_to_transport()` and not handled in any other way.
1882- :raises UnexpectedMethodCall:
1883- If the call is made at an unexpected time. Do not catch this error.
1884- It is a bug in your program. The error message will indicate what
1885- is the likely cause.
1886-
1887- This transport, same as the certification transport, expects the data
1888- created by the ``"hexr"`` exporter.
1889- """
1890- UsageExpectation.of(self).enforce()
1891- if staging:
1892- url = 'https://hexr.staging.canonical.com/checkbox/submit/'
1893- else:
1894- url = 'https://hexr.canonical.com/checkbox/submit/'
1895- options = "submit_to_hexr=1"
1896- return CertificationTransport(url, options)
1897-
1898 @raises(UnexpectedMethodCall, KeyError)
1899 def get_ubuntu_sso_oauth_transport(
1900 self, transport_details: dict
1901diff --git a/plainbox/impl/session/manager.py b/plainbox/impl/session/manager.py
1902index 9242b15..9a056fa 100644
1903--- a/plainbox/impl/session/manager.py
1904+++ b/plainbox/impl/session/manager.py
1905@@ -477,7 +477,6 @@ class SessionManager(pod.POD):
1906 # Patch exporter map to expose short names
1907 legacy_mapping = {
1908 'com.canonical.plainbox::global': 'global',
1909- 'com.canonical.plainbox::hexr': 'xml',
1910 'com.canonical.plainbox::html': 'html',
1911 'com.canonical.plainbox::json': 'json',
1912 'com.canonical.plainbox::junit': 'junit',
1913@@ -499,7 +498,7 @@ class SessionManager(pod.POD):
1914 Identifier of the exporter unit (which must have been loaded
1915 into the session device context of the first device). For
1916 backwards compatibility this can also be any of the legacy
1917- identifiers ``xml``, ``html``, ``json``, ``rfc822``, ``text`` or
1918+ identifiers ``tar``, ``html``, ``json``, ``rfc822``, ``text`` or
1919 ``xlsx``.
1920 :param option_list:
1921 (optional) A list of options to pass to the exporter. Each option
1922diff --git a/plainbox/impl/test_launcher.py b/plainbox/impl/test_launcher.py
1923index 5165037..ebce693 100644
1924--- a/plainbox/impl/test_launcher.py
1925+++ b/plainbox/impl/test_launcher.py
1926@@ -80,7 +80,6 @@ class LauncherDefinitionLegacyTests(TestCase):
1927 self.assertEqual(l.skip_test_selection, False)
1928 self.assertEqual(l.input_type, Unset)
1929 self.assertEqual(l.ok_btn_text, Unset)
1930- self.assertEqual(l.submit_to_hexr, Unset)
1931 self.assertEqual(l.submit_to, Unset)
1932 self.assertEqual(l.submit_url, Unset)
1933 self.assertEqual(l.secure_id, Unset)
1934diff --git a/plainbox/impl/transport.py b/plainbox/impl/transport.py
1935index efc98e5..fedcdcc 100644
1936--- a/plainbox/impl/transport.py
1937+++ b/plainbox/impl/transport.py
1938@@ -71,7 +71,7 @@ class TransportBase(ISessionStateTransport):
1939 Base class for transports that send test data somewhere.
1940
1941 They handle just the transmission portion of data sending; exporters are
1942- expected to produce data in the proper format (e.g. json, xml).
1943+ expected to produce data in the proper format (e.g. json, tar).
1944
1945 Each transport can have specific parameters that are required for the
1946 other end to properly process received information (like system
1947@@ -125,148 +125,6 @@ class InvalidSecureIDError(ValueError):
1948 return repr(self.value)
1949
1950
1951-class CertificationTransport(TransportBase):
1952-
1953- """
1954- Transport for sending data to certification database.
1955-
1956- - POSTs data to a http(s) endpoint
1957- - Adds a header with a hardware identifier
1958- - Data is expected to be in checkbox xml-compatible format.
1959- This means it will work best with a stream produced by the
1960- xml exporter.
1961- """
1962-
1963- def __init__(self, where, options):
1964- """
1965- Initialize the Certification Transport.
1966-
1967- The options string may contain 'secure_id' which must be
1968- a 15-character (or more) alphanumeric ID for the system.
1969-
1970- It may also contain a submit_to_hexr boolean, set to 1
1971- to enable submission to hexr.
1972- """
1973- super().__init__(where, options)
1974- # Interpret this setting here
1975- submit_to_hexr = self.options.get('submit_to_hexr')
1976- self._submit_to_hexr = False
1977- try:
1978- if submit_to_hexr and (submit_to_hexr.lower() in
1979- ('yes', 'true') or
1980- int(submit_to_hexr) == 1):
1981- self._submit_to_hexr = True
1982- except ValueError:
1983- # Just leave it at False
1984- pass
1985- self._secure_id = self.options.get('secure_id')
1986- if self._secure_id is not None:
1987- self._validate_secure_id(self._secure_id)
1988-
1989- def send(self, data, config=None, session_state=None):
1990- """
1991- Send data to the specified server.
1992-
1993- :param data:
1994- Data containing the xml dump to be sent to the server. This
1995- can be either bytes or a file-like object (BytesIO works fine too).
1996- If this is a file-like object, it will be read and streamed "on
1997- the fly".
1998- :param config:
1999- Optional PlainBoxConfig object. If http_proxy and https_proxy
2000- values are set in this config object, they will be used to send
2001- data via the specified protocols. Note that the transport also
2002- honors the http_proxy and https_proxy environment variables.
2003- Proxy string format is http://[user:password@]<proxy-ip>:port
2004- :param session_state:
2005- The session for which this transport is associated with
2006- the data being sent (optional)
2007- :returns:
2008- A dictionary with responses from the server if submission
2009- was successful. This should contain an 'id' key, however
2010- the server response may change, so the only guarantee
2011- we make is that this will be non-False if the server
2012- accepted the data.
2013- :raises requests.exceptions.Timeout:
2014- If sending timed out.
2015- :raises requests.exceptions.ConnectionError:
2016- If connection failed outright.
2017- :raises requests.exceptions.HTTPError:
2018- If the server returned a non-success result code
2019- """
2020- proxies = None
2021- if config and config.environment is not Unset:
2022- proxies = {
2023- proto[:-len("_proxy")]: config.environment[proto]
2024- for proto in ['http_proxy', 'https_proxy']
2025- if proto in config.environment
2026- }
2027- # Find the effective value of secure_id:
2028- # - use the configuration object (if available)
2029- # - override with secure_id= option (if defined)
2030- secure_id = None
2031- if config is not None and hasattr(config, 'secure_id'):
2032- secure_id = config.secure_id
2033- if self._secure_id is not None:
2034- secure_id = self._secure_id
2035- if secure_id is not None:
2036- self._validate_secure_id(secure_id)
2037- logger.debug(
2038- _("Sending to %s, Secure ID is %s"), self.url, secure_id)
2039- headers = {"X_HARDWARE_ID": secure_id}
2040- else:
2041- headers = {}
2042- # Similar handling for submit_to_hexr
2043- submit_to_hexr = False
2044- if config is not None and hasattr(config, 'submit_to_hexr'):
2045- submit_to_hexr = config.submit_to_hexr
2046- logger.debug(_("submit_to_hexr set to %s by config"),
2047- submit_to_hexr)
2048- if self._submit_to_hexr:
2049- submit_to_hexr = self._submit_to_hexr
2050- logger.debug(_("submit_to_hexr set to %s by UI"), submit_to_hexr)
2051- # We could always set this header since hexr will only process a value
2052- # of 'True', but this avoids injecting that extraneous knowledge into
2053- # the tests.
2054- # Note that hexr will only process a submission with this header's
2055- # value set to 'True', so this boolean conversion should be ok.
2056- if submit_to_hexr:
2057- headers["X-Share-With-HEXR"] = submit_to_hexr
2058-
2059- # Requests takes care of properly handling a file-like data.
2060- form_payload = {"data": data}
2061- try:
2062- response = requests.post(
2063- self.url, files=form_payload, headers=headers, proxies=proxies)
2064- except requests.exceptions.Timeout as exc:
2065- raise TransportError(
2066- _("Request to {0} timed out: {1}").format(self.url, exc))
2067- except requests.exceptions.InvalidSchema as exc:
2068- raise TransportError(
2069- _("Invalid destination URL: {0}").format(exc))
2070- except requests.exceptions.ConnectionError as exc:
2071- raise TransportError(
2072- _("Unable to connect to {0}: {1}").format(self.url, exc))
2073- if response is not None:
2074- try:
2075- # This will raise HTTPError for status != 20x
2076- response.raise_for_status()
2077- except requests.exceptions.RequestException as exc:
2078- raise TransportError(str(exc))
2079- logger.debug("Success! Server said %s", response.text)
2080- try:
2081- return response.json()
2082- except Exception as exc:
2083- raise TransportError(str(exc))
2084- # XXX: can response be None?
2085- return {}
2086-
2087- def _validate_secure_id(self, secure_id):
2088- if not re.match(SECURE_ID_PATTERN, secure_id):
2089- raise InvalidSecureIDError(
2090- _("secure_id must be a 15 characters (or more) alphanumeric string"))
2091-
2092-
2093 def oauth_available():
2094 return _oauth_available
2095
2096diff --git a/plainbox/test-data/tar-exporter/example-data.tar.xz b/plainbox/test-data/tar-exporter/example-data.tar.xz
2097new file mode 100644
2098index 0000000..77026b4
2099Binary files /dev/null and b/plainbox/test-data/tar-exporter/example-data.tar.xz differ
2100diff --git a/plainbox/test-data/xml-exporter/example-data-certification-status.json b/plainbox/test-data/xml-exporter/example-data-certification-status.json
2101deleted file mode 100644
2102index 51e85e8..0000000
2103--- a/plainbox/test-data/xml-exporter/example-data-certification-status.json
2104+++ /dev/null
2105@@ -1,19045 +0,0 @@
2106-{
2107- "attachment_map": {},
2108- "resource_map": {
2109- "com.canonical.certification::cpuinfo": [
2110- {
2111- "count": "2",
2112- "cache": "3145728",
2113- "type": "GenuineIntel",
2114- "model_revision": "10",
2115- "model_number": "6",
2116- "bogomips": "5066",
2117- "platform": "x86_64",
2118- "model_version": "23",
2119- "model": "Intel(R) Core(TM)2 Duo CPU P8700 @ 2.53GHz",
2120- "speed": "2534",
2121- "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"
2122- }
2123- ],
2124- "com.canonical.certification::requirements": [
2125- {
2126- "name": "example",
2127- "link": "http://www.example.com"
2128- }
2129- ],
2130- "com.canonical.certification::lsb": [
2131- {
2132- "release": "12.04",
2133- "codename": "precise",
2134- "distributor_id": "Ubuntu",
2135- "description": "Ubuntu 12.04.1 LTS"
2136- }
2137- ],
2138- "com.canonical.certification::package": [
2139- {
2140- "status": "Installed",
2141- "desired": "Install",
2142- "version": "0.6.15-2ubuntu9.4",
2143- "name": "accountsservice",
2144- "description": "query and manipulate user account information"
2145- },
2146- {
2147- "status": "Installed",
2148- "desired": "Install",
2149- "version": "2.2.51-5ubuntu1",
2150- "name": "acl",
2151- "description": "Access control list utilities"
2152- },
2153- {
2154- "status": "Installed",
2155- "desired": "Install",
2156- "version": "1.6-1",
2157- "name": "acpi",
2158- "description": "displays information on ACPI devices"
2159- },
2160- {
2161- "status": "Installed",
2162- "desired": "Install",
2163- "version": "0.140",
2164- "name": "acpi-support",
2165- "description": "scripts for handling many ACPI events"
2166- },
2167- {
2168- "status": "Installed",
2169- "desired": "Install",
2170- "version": "1:2.0.10-1ubuntu3",
2171- "name": "acpid",
2172- "description": "Advanced Configuration and Power Interface event daemon"
2173- },
2174- {
2175- "status": "Installed",
2176- "desired": "Install",
2177- "version": "20100513-3ubuntu1",
2178- "name": "acpidump",
2179- "description": "utilities to dump system's ACPI tables to an ASCII file"
2180- },
2181- {
2182- "status": "Installed",
2183- "desired": "Install",
2184- "version": "0.5.1-3",
2185- "name": "acpitool",
2186- "description": "command line ACPI client"
2187- },
2188- {
2189- "status": "Installed",
2190- "desired": "Install",
2191- "version": "0.9.4-0ubuntu3.2",
2192- "name": "activity-log-manager-common",
2193- "description": "blacklist configuration for Zeitgeist (assets)"
2194- },
2195- {
2196- "status": "Installed",
2197- "desired": "Install",
2198- "version": "0.9.4-0ubuntu3.2",
2199- "name": "activity-log-manager-control-center",
2200- "description": "blacklist configuration for Zeitgeist (control center integration)"
2201- },
2202- {
2203- "status": "Installed",
2204- "desired": "Install",
2205- "version": "3.113ubuntu2",
2206- "name": "adduser",
2207- "description": "add and remove users and groups"
2208- },
2209- {
2210- "status": "Installed",
2211- "desired": "Install",
2212- "version": "0.3.2-0ubuntu1",
2213- "name": "adium-theme-ubuntu",
2214- "description": "Adium message style for Ubuntu"
2215- },
2216- {
2217- "status": "Installed",
2218- "desired": "Install",
2219- "version": "1:3.2.3.2-0ubuntu1",
2220- "name": "aisleriot",
2221- "description": "Solitaire card games"
2222- },
2223- {
2224- "status": "Installed",
2225- "desired": "Install",
2226- "version": "0.13.2-2ubuntu4",
2227- "name": "alacarte",
2228- "description": "easy GNOME menu editing tool"
2229- },
2230- {
2231- "status": "Installed",
2232- "desired": "Install",
2233- "version": "1.0.25+dfsg-0ubuntu1",
2234- "name": "alsa-base",
2235- "description": "ALSA driver configuration files"
2236- },
2237- {
2238- "status": "Installed",
2239- "desired": "Install",
2240- "version": "1.0.25-1ubuntu5",
2241- "name": "alsa-utils",
2242- "description": "Utilities for configuring and using ALSA"
2243- },
2244- {
2245- "status": "Installed",
2246- "desired": "Install",
2247- "version": "2.3-14ubuntu1",
2248- "name": "anacron",
2249- "description": "cron-like program that doesn't go by time"
2250- },
2251- {
2252- "status": "Installed",
2253- "desired": "Install",
2254- "version": "2.2.3.dfsg.1-2",
2255- "name": "apg",
2256- "description": "Automated Password Generator - Standalone version"
2257- },
2258- {
2259- "status": "Installed",
2260- "desired": "Install",
2261- "version": "0.12.04.4",
2262- "name": "app-install-data",
2263- "description": "Ubuntu applications (data files)"
2264- },
2265- {
2266- "status": "Installed",
2267- "desired": "Install",
2268- "version": "12.12.04.1",
2269- "name": "app-install-data-partner",
2270- "description": "Application Installer (data files for partner applications/repositories)"
2271- },
2272- {
2273- "status": "Installed",
2274- "desired": "Install",
2275- "version": "2.7.102-0ubuntu3.7",
2276- "name": "apparmor",
2277- "description": "User-space parser utility for AppArmor"
2278- },
2279- {
2280- "status": "Installed",
2281- "desired": "Install",
2282- "version": "0.3.92-0ubuntu1.1",
2283- "name": "appmenu-gtk",
2284- "description": "Export GTK menus over DBus"
2285- },
2286- {
2287- "status": "Installed",
2288- "desired": "Install",
2289- "version": "0.3.92-0ubuntu1.1",
2290- "name": "appmenu-gtk3",
2291- "description": "Export GTK menus over DBus"
2292- },
2293- {
2294- "status": "Installed",
2295- "desired": "Install",
2296- "version": "0.2.6-0ubuntu1",
2297- "name": "appmenu-qt",
2298- "description": "appmenu support for Qt"
2299- },
2300- {
2301- "status": "Installed",
2302- "desired": "Install",
2303- "version": "2.0.1-0ubuntu17.1",
2304- "name": "apport",
2305- "description": "automatically generate crash reports for debugging"
2306- },
2307- {
2308- "status": "Installed",
2309- "desired": "Install",
2310- "version": "2.0.1-0ubuntu17.1",
2311- "name": "apport-gtk",
2312- "description": "GTK+ frontend for the apport crash report system"
2313- },
2314- {
2315- "status": "Installed",
2316- "desired": "Install",
2317- "version": "0.16.1",
2318- "name": "apport-symptoms",
2319- "description": "symptom scripts for apport"
2320- },
2321- {
2322- "status": "Installed",
2323- "desired": "Install",
2324- "version": "0.8.16~exp12ubuntu10.7",
2325- "name": "apt",
2326- "description": "commandline package manager"
2327- },
2328- {
2329- "status": "Installed",
2330- "desired": "Install",
2331- "version": "2.5.0ubuntu1",
2332- "name": "apt-file",
2333- "description": "search for files within Debian packages (command-line interface)"
2334- },
2335- {
2336- "status": "Installed",
2337- "desired": "Install",
2338- "version": "0.8.16~exp12ubuntu10.7",
2339- "name": "apt-transport-https",
2340- "description": "https download transport for APT"
2341- },
2342- {
2343- "status": "Installed",
2344- "desired": "Install",
2345- "version": "0.8.16~exp12ubuntu10.7",
2346- "name": "apt-utils",
2347- "description": "package managment related utility programs"
2348- },
2349- {
2350- "status": "Installed",
2351- "desired": "Install",
2352- "version": "0.44ubuntu5",
2353- "name": "apt-xapian-index",
2354- "description": "maintenance and search tools for a Xapian index of Debian packages"
2355- },
2356- {
2357- "status": "Installed",
2358- "desired": "Install",
2359- "version": "0.43+bzr805-0ubuntu7",
2360- "name": "aptdaemon",
2361- "description": "transaction based package management service"
2362- },
2363- {
2364- "status": "Installed",
2365- "desired": "Install",
2366- "version": "0.43+bzr805-0ubuntu7",
2367- "name": "aptdaemon-data",
2368- "description": "data files for clients"
2369- },
2370- {
2371- "status": "Installed",
2372- "desired": "Install",
2373- "version": "0.5.1ubuntu3",
2374- "name": "apturl",
2375- "description": "install packages using the apt protocol - GTK+ frontend"
2376- },
2377- {
2378- "status": "Installed",
2379- "desired": "Install",
2380- "version": "0.5.1ubuntu3",
2381- "name": "apturl-common",
2382- "description": "install packages using the apt protocol - common data"
2383- },
2384- {
2385- "status": "Installed",
2386- "desired": "Install",
2387- "version": "0.1.4-1",
2388- "name": "arandr",
2389- "description": "Simple visual front end for XRandR"
2390- },
2391- {
2392- "status": "Installed",
2393- "desired": "Install",
2394- "version": "0.60.7~20110707-1",
2395- "name": "aspell",
2396- "description": "GNU Aspell spell-checker"
2397- },
2398- {
2399- "status": "Installed",
2400- "desired": "Install",
2401- "version": "6.0-0-6ubuntu2",
2402- "name": "aspell-en",
2403- "description": "English dictionary for GNU Aspell"
2404- },
2405- {
2406- "status": "Installed",
2407- "desired": "Install",
2408- "version": "3.1.13-1ubuntu1",
2409- "name": "at",
2410- "description": "Delayed job execution and batch processing"
2411- },
2412- {
2413- "status": "Installed",
2414- "desired": "Install",
2415- "version": "2.4.2-0ubuntu0.1",
2416- "name": "at-spi2-core",
2417- "description": "Assistive Technology Service Provider Interface (dbus core)"
2418- },
2419- {
2420- "status": "Installed",
2421- "desired": "Install",
2422- "version": "2.0.0-1ubuntu0.1",
2423- "name": "audacity",
2424- "description": "fast, cross-platform audio editor"
2425- },
2426- {
2427- "status": "Installed",
2428- "desired": "Install",
2429- "version": "2.0.0-1ubuntu0.1",
2430- "name": "audacity-data",
2431- "description": "fast, cross-platform audio editor (data)"
2432- },
2433- {
2434- "status": "Installed",
2435- "desired": "Install",
2436- "version": "2.68-1ubuntu2",
2437- "name": "autoconf",
2438- "description": "automatic configure script builder"
2439- },
2440- {
2441- "status": "Installed",
2442- "desired": "Install",
2443- "version": "1:1.11.3-1ubuntu2",
2444- "name": "automake",
2445- "description": "Tool for generating GNU Standards-compliant Makefiles"
2446- },
2447- {
2448- "status": "Installed",
2449- "desired": "Install",
2450- "version": "20120210.1ubuntu1",
2451- "name": "autotools-dev",
2452- "description": "Update infrastructure for config.{guess,sub} files"
2453- },
2454- {
2455- "status": "Installed",
2456- "desired": "Install",
2457- "version": "0.6.30-5ubuntu2",
2458- "name": "avahi-autoipd",
2459- "description": "Avahi IPv4LL network address configuration daemon"
2460- },
2461- {
2462- "status": "Installed",
2463- "desired": "Install",
2464- "version": "0.6.30-5ubuntu2",
2465- "name": "avahi-daemon",
2466- "description": "Avahi mDNS/DNS-SD daemon"
2467- },
2468- {
2469- "status": "Installed",
2470- "desired": "Install",
2471- "version": "0.6.30-5ubuntu2",
2472- "name": "avahi-utils",
2473- "description": "Avahi browsing, publishing and discovery utilities"
2474- },
2475- {
2476- "status": "Installed",
2477- "desired": "Install",
2478- "version": "0.2.124.2-0ubuntu1",
2479- "name": "bamfdaemon",
2480- "description": "Window matching library - daemon"
2481- },
2482- {
2483- "status": "Installed",
2484- "desired": "Install",
2485- "version": "3.4.1-0ubuntu1",
2486- "name": "baobab",
2487- "description": "GNOME disk usage analyzer"
2488- },
2489- {
2490- "status": "Installed",
2491- "desired": "Install",
2492- "version": "6.5ubuntu6.4",
2493- "name": "base-files",
2494- "description": "Debian base system miscellaneous files"
2495- },
2496- {
2497- "status": "Installed",
2498- "desired": "Install",
2499- "version": "3.5.24",
2500- "name": "base-passwd",
2501- "description": "Debian base system master password and group files"
2502- },
2503- {
2504- "status": "Installed",
2505- "desired": "Install",
2506- "version": "4.2-2ubuntu2",
2507- "name": "bash",
2508- "description": "GNU Bourne Again SHell"
2509- },
2510- {
2511- "status": "Installed",
2512- "desired": "Install",
2513- "version": "1:1.3-1ubuntu8",
2514- "name": "bash-completion",
2515- "description": "programmable completion for the bash shell"
2516- },
2517- {
2518- "status": "Installed",
2519- "desired": "Install",
2520- "version": "1.06.95-2",
2521- "name": "bc",
2522- "description": "The GNU bc arbitrary precision calculator language"
2523- },
2524- {
2525- "status": "Installed",
2526- "desired": "Install",
2527- "version": "1:9.8.1.dfsg.P1-4ubuntu0.5",
2528- "name": "bind9-host",
2529- "description": "Version of 'host' bundled with BIND 9.X"
2530- },
2531- {
2532- "status": "Installed",
2533- "desired": "Install",
2534- "version": "2.22-6ubuntu1",
2535- "name": "binutils",
2536- "description": "GNU assembler, linker and binary utilities"
2537- },
2538- {
2539- "status": "Installed",
2540- "desired": "Install",
2541- "version": "1.23-0ubuntu2.1",
2542- "name": "blueman",
2543- "description": "A Graphical bluetooth manager"
2544- },
2545- {
2546- "status": "Installed",
2547- "desired": "Install",
2548- "version": "4.98-2ubuntu7",
2549- "name": "bluez",
2550- "description": "Bluetooth tools and daemons"
2551- },
2552- {
2553- "status": "Installed",
2554- "desired": "Install",
2555- "version": "4.98-2ubuntu7",
2556- "name": "bluez-alsa",
2557- "description": "Bluetooth ALSA support"
2558- },
2559- {
2560- "status": "Installed",
2561- "desired": "Install",
2562- "version": "4.98-2ubuntu7",
2563- "name": "bluez-alsa:i386",
2564- "description": "Bluetooth ALSA support"
2565- },
2566- {
2567- "status": "Installed",
2568- "desired": "Install",
2569- "version": "4.98-2ubuntu7",
2570- "name": "bluez-cups",
2571- "description": "Bluetooth printer driver for CUPS"
2572- },
2573- {
2574- "status": "Installed",
2575- "desired": "Install",
2576- "version": "4.98-2ubuntu7",
2577- "name": "bluez-gstreamer",
2578- "description": "Bluetooth GStreamer support"
2579- },
2580- {
2581- "status": "Installed",
2582- "desired": "Install",
2583- "version": "1.96",
2584- "name": "bonnie++",
2585- "description": "Hard drive benchmark suite."
2586- },
2587- {
2588- "status": "Installed",
2589- "desired": "Install",
2590- "version": "0.90.2-8ubuntu1",
2591- "name": "bootchart",
2592- "description": "boot sequence auditing"
2593- },
2594- {
2595- "status": "Installed",
2596- "desired": "Install",
2597- "version": "0.7",
2598- "name": "branding-ubuntu",
2599- "description": "Replacement artwork with Ubuntu branding"
2600- },
2601- {
2602- "status": "Installed",
2603- "desired": "Install",
2604- "version": "3.4.1-0ubuntu1.1",
2605- "name": "brasero",
2606- "description": "CD/DVD burning application for GNOME"
2607- },
2608- {
2609- "status": "Installed",
2610- "desired": "Install",
2611- "version": "3.4.1-0ubuntu1.1",
2612- "name": "brasero-cdrkit",
2613- "description": "cdrkit extensions for the Brasero burning application"
2614- },
2615- {
2616- "status": "Installed",
2617- "desired": "Install",
2618- "version": "3.4.1-0ubuntu1.1",
2619- "name": "brasero-common",
2620- "description": "Common files for the Brasero CD burning application and library"
2621- },
2622- {
2623- "status": "Installed",
2624- "desired": "Install",
2625- "version": "1.5-2ubuntu7",
2626- "name": "bridge-utils",
2627- "description": "Utilities for configuring the Linux Ethernet bridge"
2628- },
2629- {
2630- "status": "Installed",
2631- "desired": "Install",
2632- "version": "4.3-1ubuntu5",
2633- "name": "brltty",
2634- "description": "Access software for a blind person using a braille display"
2635- },
2636- {
2637- "status": "Installed",
2638- "desired": "Install",
2639- "version": "8.2.3ubuntu1",
2640- "name": "bsdmainutils",
2641- "description": "collection of more utilities from FreeBSD"
2642- },
2643- {
2644- "status": "Installed",
2645- "desired": "Install",
2646- "version": "1:2.20.1-1ubuntu3",
2647- "name": "bsdutils",
2648- "description": "Basic utilities from 4.4BSD-Lite"
2649- },
2650- {
2651- "status": "Installed",
2652- "desired": "Install",
2653- "version": "11.5ubuntu2.1",
2654- "name": "build-essential",
2655- "description": "Informational list of build-essential packages"
2656- },
2657- {
2658- "status": "Installed",
2659- "desired": "Install",
2660- "version": "1:1.18.5-1ubuntu4.1",
2661- "name": "busybox-initramfs",
2662- "description": "Standalone shell setup for initramfs"
2663- },
2664- {
2665- "status": "Installed",
2666- "desired": "Install",
2667- "version": "1:1.18.5-1ubuntu4.1",
2668- "name": "busybox-static",
2669- "description": "Standalone rescue shell with tons of builtin utilities"
2670- },
2671- {
2672- "status": "Installed",
2673- "desired": "Install",
2674- "version": "5.17-0ubuntu1",
2675- "name": "byobu",
2676- "description": "powerful, text based window manager and shell multiplexer"
2677- },
2678- {
2679- "status": "Installed",
2680- "desired": "Install",
2681- "version": "1.0.6-1",
2682- "name": "bzip2",
2683- "description": "high-quality block-sorting file compressor - utilities"
2684- },
2685- {
2686- "status": "Installed",
2687- "desired": "Install",
2688- "version": "2.5.1-0ubuntu2",
2689- "name": "bzr",
2690- "description": "easy to use distributed version control system"
2691- },
2692- {
2693- "status": "Installed",
2694- "desired": "Install",
2695- "version": "2.8.4",
2696- "name": "bzr-builddeb",
2697- "description": "bzr plugin for Debian package management"
2698- },
2699- {
2700- "status": "Installed",
2701- "desired": "Install",
2702- "version": "0.7.2-0ubuntu1",
2703- "name": "bzr-builder",
2704- "description": "construct a bzr branch from a recipe"
2705- },
2706- {
2707- "status": "Installed",
2708- "desired": "Install",
2709- "version": "1.2.2-1",
2710- "name": "bzr-explorer",
2711- "description": "GUI application for using Bazaar"
2712- },
2713- {
2714- "status": "Installed",
2715- "desired": "Install",
2716- "version": "0.13.0-1",
2717- "name": "bzr-fastimport",
2718- "description": "Fast-import/fast-export plugin for Bazaar"
2719- },
2720- {
2721- "status": "Installed",
2722- "desired": "Install",
2723- "version": "20111211",
2724- "name": "ca-certificates",
2725- "description": "Common CA certificates"
2726- },
2727- {
2728- "status": "Installed",
2729- "desired": "Install",
2730- "version": "20110912ubuntu6",
2731- "name": "ca-certificates-java",
2732- "description": "Common CA certificates (JKS keystore)"
2733- },
2734- {
2735- "status": "Installed",
2736- "desired": "Install",
2737- "version": "0.4.100ubuntu2",
2738- "name": "cdbs",
2739- "description": "common build system for Debian packages"
2740- },
2741- {
2742- "status": "Installed",
2743- "desired": "Install",
2744- "version": "1.1.2",
2745- "name": "cgroup-lite",
2746- "description": "Light-weight package to set up cgroups at system boot"
2747- },
2748- {
2749- "status": "Installed",
2750- "desired": "Install",
2751- "version": "0.3+bzr167-3~precise1",
2752- "name": "charm-tools",
2753- "description": "tools for maintaining Juju charms"
2754- },
2755- {
2756- "status": "Installed",
2757- "desired": "Install",
2758- "version": "0.15.1+bzr1894+201301181105~precise1",
2759- "name": "checkbox",
2760- "description": "System testing application"
2761- },
2762- {
2763- "status": "Installed",
2764- "desired": "Install",
2765- "version": "0.15+bzr563+201301171917~precise1",
2766- "name": "checkbox-certification",
2767- "description": "Checkbox Certification Tests"
2768- },
2769- {
2770- "status": "Installed",
2771- "desired": "Install",
2772- "version": "0.15+bzr563+201301171917~precise1",
2773- "name": "checkbox-certification-client",
2774- "description": "Client Certification"
2775- },
2776- {
2777- "status": "Installed",
2778- "desired": "Install",
2779- "version": "0.15+bzr563+201301171917~precise1",
2780- "name": "checkbox-certification-tools",
2781- "description": "Checkbox Certification Tools"
2782- },
2783- {
2784- "status": "Installed",
2785- "desired": "Install",
2786- "version": "0.15.1+bzr1894+201301181105~precise1",
2787- "name": "checkbox-cli",
2788- "description": "Command line interface for checkbox"
2789- },
2790- {
2791- "status": "Installed",
2792- "desired": "Install",
2793- "version": "0.10-0precise1~rev150",
2794- "name": "checkbox-editor",
2795- "description": "Checkbox Editor"
2796- },
2797- {
2798- "status": "Installed",
2799- "desired": "Install",
2800- "version": "0.2-0precise1~rev19",
2801- "name": "checkbox-editor-oem-template",
2802- "description": "Checkbox editor template for OEM projects"
2803- },
2804- {
2805- "status": "Installed",
2806- "desired": "Install",
2807- "version": "0.15.1+bzr1894+201301181105~precise1",
2808- "name": "checkbox-gtk",
2809- "description": "GTK interface for checkbox"
2810- },
2811- {
2812- "status": "Installed",
2813- "desired": "Install",
2814- "version": "0.2",
2815- "name": "checkbox-ihv",
2816- "description": "Canonical hardware testing suite."
2817- },
2818- {
2819- "status": "Installed",
2820- "desired": "Install",
2821- "version": "0.2",
2822- "name": "checkbox-ihv-cli",
2823- "description": "Canonical hardware testing suite - cli version."
2824- },
2825- {
2826- "status": "Installed",
2827- "desired": "Install",
2828- "version": "0.2",
2829- "name": "checkbox-ihv-qt",
2830- "description": "Canonical hardware testing suite - qt version."
2831- },
2832- {
2833- "status": "Installed",
2834- "desired": "Install",
2835- "version": "0.45-0-precise1~rev614",
2836- "name": "checkbox-oem",
2837- "description": "Checkbox OEM Tests"
2838- },
2839- {
2840- "status": "Installed",
2841- "desired": "Install",
2842- "version": "1.0-2-precise1~rev4",
2843- "name": "checkbox-oem-bug",
2844- "description": "Checkbox OEM bug"
2845- },
2846- {
2847- "status": "Installed",
2848- "desired": "Install",
2849- "version": "0.45-0-precise1~rev614",
2850- "name": "checkbox-oem-gtk",
2851- "description": "Checkbox OEM GTK Interface"
2852- },
2853- {
2854- "status": "Installed",
2855- "desired": "Install",
2856- "version": "0.45-0-precise1~rev614",
2857- "name": "checkbox-oem-qt",
2858- "description": "Checkbox OEM Qt Interface"
2859- },
2860- {
2861- "status": "Installed",
2862- "desired": "Install",
2863- "version": "0.1-1precise1~rev18ubuntu1",
2864- "name": "checkbox-oem-stella",
2865- "description": "stella System Testing"
2866- },
2867- {
2868- "status": "Installed",
2869- "desired": "Install",
2870- "version": "0.1-1precise1~rev18ubuntu1",
2871- "name": "checkbox-oem-stella-gtk",
2872- "description": "Checkbox stella GTK Interface"
2873- },
2874- {
2875- "status": "Installed",
2876- "desired": "Install",
2877- "version": "0.15.1+bzr1894+201301181105~precise1",
2878- "name": "checkbox-qt",
2879- "description": "QT4 interface for checkbox"
2880- },
2881- {
2882- "status": "Installed",
2883- "desired": "Install",
2884- "version": "3.4.1-0ubuntu2.1",
2885- "name": "cheese",
2886- "description": "tool to take pictures and videos from your webcam"
2887- },
2888- {
2889- "status": "Installed",
2890- "desired": "Install",
2891- "version": "3.4.1-0ubuntu2.1",
2892- "name": "cheese-common",
2893- "description": "Common files for the Cheese tool to take pictures and videos"
2894- },
2895- {
2896- "status": "Installed",
2897- "desired": "Install",
2898- "version": "0.25-0ubuntu5",
2899- "name": "cloud-utils",
2900- "description": "cloud image management utilities"
2901- },
2902- {
2903- "status": "Installed",
2904- "desired": "Install",
2905- "version": "0+20090930-2",
2906- "name": "cmap-adobe-japan2",
2907- "description": "CMaps for Adobe-Japan2"
2908- },
2909- {
2910- "status": "Installed",
2911- "desired": "Install",
2912- "version": "0.1.16-2ubuntu0.1",
2913- "name": "colord",
2914- "description": "system service to manage device colour profiles -- system daemon"
2915- },
2916- {
2917- "status": "Installed",
2918- "desired": "Install",
2919- "version": "0.2.46ubuntu6",
2920- "name": "command-not-found",
2921- "description": "Suggest installation of packages in interactive bash sessions"
2922- },
2923- {
2924- "status": "Installed",
2925- "desired": "Install",
2926- "version": "0.2.46ubuntu6",
2927- "name": "command-not-found-data",
2928- "description": "Set of data files for command-not-found."
2929- },
2930- {
2931- "status": "Installed",
2932- "desired": "Install",
2933- "version": "1:0.9.7.12-0ubuntu1",
2934- "name": "compiz",
2935- "description": "OpenGL window and compositing manager"
2936- },
2937- {
2938- "status": "Installed",
2939- "desired": "Install",
2940- "version": "1:0.9.7.12-0ubuntu1",
2941- "name": "compiz-core",
2942- "description": "OpenGL window and compositing manager"
2943- },
2944- {
2945- "status": "Installed",
2946- "desired": "Install",
2947- "version": "1:0.9.7.12-0ubuntu1",
2948- "name": "compiz-gnome",
2949- "description": "OpenGL window and compositing manager - GNOME window decorator"
2950- },
2951- {
2952- "status": "Installed",
2953- "desired": "Install",
2954- "version": "1:0.9.7.12-0ubuntu1",
2955- "name": "compiz-plugins",
2956- "description": "OpenGL window and compositing manager - plugins"
2957- },
2958- {
2959- "status": "Installed",
2960- "desired": "Install",
2961- "version": "1:0.9.7.12-0ubuntu1",
2962- "name": "compiz-plugins-default",
2963- "description": "OpenGL window and compositing manager - default plugins"
2964- },
2965- {
2966- "status": "Installed",
2967- "desired": "Install",
2968- "version": "1:0.9.7.0~bzr19-0ubuntu10",
2969- "name": "compiz-plugins-main",
2970- "description": "Compiz plugins - main collection"
2971- },
2972- {
2973- "status": "Installed",
2974- "desired": "Install",
2975- "version": "1:0.9.7.0~bzr19-0ubuntu10",
2976- "name": "compiz-plugins-main-default",
2977- "description": "Compiz plugins - main default collection"
2978- },
2979- {
2980- "status": "Installed",
2981- "desired": "Install",
2982- "version": "0.9.5.92-0ubuntu5",
2983- "name": "compizconfig-backend-gconf",
2984- "description": "Compiz Fusion configuration system - gconf backend"
2985- },
2986- {
2987- "status": "Installed",
2988- "desired": "Install",
2989- "version": "0.9.5.92-0ubuntu3",
2990- "name": "compizconfig-settings-manager",
2991- "description": "Compiz configuration settings manager"
2992- },
2993- {
2994- "status": "Installed",
2995- "desired": "Install",
2996- "version": "1.70ubuntu5",
2997- "name": "console-setup",
2998- "description": "console font and keymap setup program"
2999- },
3000- {
3001- "status": "Installed",
3002- "desired": "Install",
3003- "version": "0.4.5-2",
3004- "name": "consolekit",
3005- "description": "framework for defining and tracking users, sessions and seats"
3006- },
3007- {
3008- "status": "Installed",
3009- "desired": "Install",
3010- "version": "8.13-3ubuntu3.2",
3011- "name": "coreutils",
3012- "description": "GNU core utilities"
3013- },
3014- {
3015- "status": "Installed",
3016- "desired": "Install",
3017- "version": "2.11-7ubuntu3",
3018- "name": "cpio",
3019- "description": "GNU cpio -- a program to manage archives of files"
3020- },
3021- {
3022- "status": "Installed",
3023- "desired": "Install",
3024- "version": "4:4.6.3-1ubuntu5",
3025- "name": "cpp",
3026- "description": "GNU C preprocessor (cpp)"
3027- },
3028- {
3029- "status": "Installed",
3030- "desired": "Install",
3031- "version": "4.6.3-1ubuntu5",
3032- "name": "cpp-4.6",
3033- "description": "GNU C preprocessor"
3034- },
3035- {
3036- "status": "Installed",
3037- "desired": "Install",
3038- "version": "0.7-0ubuntu1",
3039- "name": "cpu-checker",
3040- "description": "tools to help evaluate certain CPU (or BIOS) features"
3041- },
3042- {
3043- "status": "Installed",
3044- "desired": "Install",
3045- "version": "1.1.2-1ubuntu1",
3046- "name": "crda",
3047- "description": "wireless Central Regulatory Domain Agent"
3048- },
3049- {
3050- "status": "Installed",
3051- "desired": "Install",
3052- "version": "3.0pl1-120ubuntu4",
3053- "name": "cron",
3054- "description": "process scheduling daemon"
3055- },
3056- {
3057- "status": "Installed",
3058- "desired": "Install",
3059- "version": "2:1.4.1-2ubuntu4",
3060- "name": "cryptsetup-bin",
3061- "description": "disk encryption support - command line tools"
3062- },
3063- {
3064- "status": "Installed",
3065- "desired": "Install",
3066- "version": "1.5.3-0ubuntu6",
3067- "name": "cups",
3068- "description": "Common UNIX Printing System(tm) - server"
3069- },
3070- {
3071- "status": "Installed",
3072- "desired": "Install",
3073- "version": "1.5.3-0ubuntu6",
3074- "name": "cups-bsd",
3075- "description": "Common UNIX Printing System(tm) - BSD commands"
3076- },
3077- {
3078- "status": "Installed",
3079- "desired": "Install",
3080- "version": "1.5.3-0ubuntu6",
3081- "name": "cups-client",
3082- "description": "Common UNIX Printing System(tm) - client programs (SysV)"
3083- },
3084- {
3085- "status": "Installed",
3086- "desired": "Install",
3087- "version": "1.5.3-0ubuntu6",
3088- "name": "cups-common",
3089- "description": "Common UNIX Printing System(tm) - common files"
3090- },
3091- {
3092- "status": "Installed",
3093- "desired": "Install",
3094- "version": "1.0.18-0ubuntu0.1",
3095- "name": "cups-filters",
3096- "description": "OpenPrinting CUPS Filters"
3097- },
3098- {
3099- "status": "Installed",
3100- "desired": "Install",
3101- "version": "0.2.1.2-1ubuntu0.1",
3102- "name": "cups-pk-helper",
3103- "description": "PolicyKit helper to configure cups with fine-grained privileges"
3104- },
3105- {
3106- "status": "Installed",
3107- "desired": "Install",
3108- "version": "1.5.3-0ubuntu6",
3109- "name": "cups-ppdc",
3110- "description": "Common UNIX Printing System(tm) - PPD manipulation utilities"
3111- },
3112- {
3113- "status": "Installed",
3114- "desired": "Install",
3115- "version": "7.22.0-3ubuntu4",
3116- "name": "curl",
3117- "description": "Get a file from an HTTP, HTTPS or FTP server"
3118- },
3119- {
3120- "status": "Installed",
3121- "desired": "Install",
3122- "version": "2:1.12.13+real-8",
3123- "name": "cvs",
3124- "description": "Concurrent Versions System"
3125- },
3126- {
3127- "status": "Installed",
3128- "desired": "Install",
3129- "version": "0.15.1-1ubuntu1",
3130- "name": "cython",
3131- "description": "C-Extensions for Python"
3132- },
3133- {
3134- "status": "Installed",
3135- "desired": "Install",
3136- "version": "0.5.7-2ubuntu2",
3137- "name": "dash",
3138- "description": "POSIX-compliant shell"
3139- },
3140- {
3141- "status": "Installed",
3142- "desired": "Install",
3143- "version": "1.4.18-1ubuntu1.3",
3144- "name": "dbus",
3145- "description": "simple interprocess messaging system (daemon and utilities)"
3146- },
3147- {
3148- "status": "Installed",
3149- "desired": "Install",
3150- "version": "1.4.18-1ubuntu1.3",
3151- "name": "dbus-x11",
3152- "description": "simple interprocess messaging system (X11 deps)"
3153- },
3154- {
3155- "status": "Installed",
3156- "desired": "Install",
3157- "version": "1.06.95-2",
3158- "name": "dc",
3159- "description": "The GNU dc arbitrary precision reverse-polish calculator"
3160- },
3161- {
3162- "status": "Installed",
3163- "desired": "Install",
3164- "version": "0.12.0-0ubuntu1.1",
3165- "name": "dconf-gsettings-backend",
3166- "description": "simple configuration storage system - GSettings back-end"
3167- },
3168- {
3169- "status": "Installed",
3170- "desired": "Install",
3171- "version": "0.12.0-0ubuntu1.1",
3172- "name": "dconf-service",
3173- "description": "simple configuration storage system - D-Bus service"
3174- },
3175- {
3176- "status": "Installed",
3177- "desired": "Install",
3178- "version": "0.12.0-0ubuntu1.1",
3179- "name": "dconf-tools",
3180- "description": "simple configuration storage system - utilities"
3181- },
3182- {
3183- "status": "Installed",
3184- "desired": "Install",
3185- "version": "2.18ubuntu1",
3186- "name": "dctrl-tools",
3187- "description": "Command-line tools to process Debian package information"
3188- },
3189- {
3190- "status": "Installed",
3191- "desired": "Install",
3192- "version": "1.5.42ubuntu1",
3193- "name": "debconf",
3194- "description": "Debian configuration management system"
3195- },
3196- {
3197- "status": "Installed",
3198- "desired": "Install",
3199- "version": "1.5.42ubuntu1",
3200- "name": "debconf-i18n",
3201- "description": "full internationalization support for debconf"
3202- },
3203- {
3204- "status": "Installed",
3205- "desired": "Install",
3206- "version": "9.20120115ubuntu3",
3207- "name": "debhelper",
3208- "description": "helper programs for debian/rules"
3209- },
3210- {
3211- "status": "Installed",
3212- "desired": "Install",
3213- "version": "2010.08.28",
3214- "name": "debian-archive-keyring",
3215- "description": "GnuPG archive keys of the Debian archive"
3216- },
3217- {
3218- "status": "Installed",
3219- "desired": "Install",
3220- "version": "2012.02.22",
3221- "name": "debian-keyring",
3222- "description": "GnuPG keys of Debian Developers"
3223- },
3224- {
3225- "status": "Installed",
3226- "desired": "Install",
3227- "version": "4.2.1ubuntu2",
3228- "name": "debianutils",
3229- "description": "Miscellaneous utilities specific to Debian"
3230- },
3231- {
3232- "status": "Installed",
3233- "desired": "Install",
3234- "version": "1.0.39ubuntu0.2",
3235- "name": "debootstrap",
3236- "description": "Bootstrap a basic Debian system"
3237- },
3238- {
3239- "status": "Installed",
3240- "desired": "Install",
3241- "version": "22.0-0ubuntu2",
3242- "name": "deja-dup",
3243- "description": "Back up your files"
3244- },
3245- {
3246- "status": "Installed",
3247- "desired": "Install",
3248- "version": "0.20-0ubuntu3",
3249- "name": "desktop-file-utils",
3250- "description": "Utilities for .desktop files"
3251- },
3252- {
3253- "status": "Installed",
3254- "desired": "Install",
3255- "version": "3.4.1-0ubuntu1",
3256- "name": "devhelp",
3257- "description": "GNOME developers help program"
3258- },
3259- {
3260- "status": "Installed",
3261- "desired": "Install",
3262- "version": "3.4.1-0ubuntu1",
3263- "name": "devhelp-common",
3264- "description": "Common files for devhelp and its library"
3265- },
3266- {
3267- "status": "Installed",
3268- "desired": "Install",
3269- "version": "2.11.6ubuntu1.4",
3270- "name": "devscripts",
3271- "description": "scripts to make the life of a Debian Package maintainer easier"
3272- },
3273- {
3274- "status": "Installed",
3275- "desired": "Install",
3276- "version": "2.7.102-0ubuntu3.7",
3277- "name": "dh-apparmor",
3278- "description": "AppArmor debhelper routines"
3279- },
3280- {
3281- "status": "Installed",
3282- "desired": "Install",
3283- "version": "0.59ubuntu1",
3284- "name": "dh-make",
3285- "description": "tool that converts source archives into Debian package source"
3286- },
3287- {
3288- "status": "Installed",
3289- "desired": "Install",
3290- "version": "116",
3291- "name": "dh-translations",
3292- "description": "debhelper extension for translation support"
3293- },
3294- {
3295- "status": "Installed",
3296- "desired": "Install",
3297- "version": "0.97.2-5",
3298- "name": "dia-common",
3299- "description": "Diagram editor (common files)"
3300- },
3301- {
3302- "status": "Installed",
3303- "desired": "Install",
3304- "version": "0.97.2-5",
3305- "name": "dia-gnome",
3306- "description": "Diagram editor (GNOME version)"
3307- },
3308- {
3309- "status": "Installed",
3310- "desired": "Install",
3311- "version": "0.97.2-5",
3312- "name": "dia-libs",
3313- "description": "Diagram editor (library files)"
3314- },
3315- {
3316- "status": "Installed",
3317- "desired": "Install",
3318- "version": "1.12.1ubuntu2",
3319- "name": "dictionaries-common",
3320- "description": "Common utilities for spelling dictionary tools"
3321- },
3322- {
3323- "status": "Installed",
3324- "desired": "Install",
3325- "version": "1.54-1",
3326- "name": "diffstat",
3327- "description": "produces graph of changes introduced by a diff file"
3328- },
3329- {
3330- "status": "Installed",
3331- "desired": "Install",
3332- "version": "1:3.2-1ubuntu1",
3333- "name": "diffutils",
3334- "description": "File comparison utilities"
3335- },
3336- {
3337- "status": "Installed",
3338- "desired": "Install",
3339- "version": "0.8.2",
3340- "name": "distro-info",
3341- "description": "provides information about the distributions' releases"
3342- },
3343- {
3344- "status": "Installed",
3345- "desired": "Install",
3346- "version": "0.8ubuntu0.2",
3347- "name": "distro-info-data",
3348- "description": "information about the distributions' releases (data files)"
3349- },
3350- {
3351- "status": "Installed",
3352- "desired": "Install",
3353- "version": "2.2.0.3-1ubuntu3.1",
3354- "name": "dkms",
3355- "description": "Dynamic Kernel Module Support Framework"
3356- },
3357- {
3358- "status": "Installed",
3359- "desired": "Install",
3360- "version": "2.11-4",
3361- "name": "dmidecode",
3362- "description": "SMBIOS/DMI table decoder"
3363- },
3364- {
3365- "status": "Installed",
3366- "desired": "Install",
3367- "version": "2:1.02.48-4ubuntu7.1",
3368- "name": "dmsetup",
3369- "description": "The Linux Kernel Device Mapper userspace library"
3370- },
3371- {
3372- "status": "Installed",
3373- "desired": "Install",
3374- "version": "0.4.3",
3375- "name": "dmz-cursor-theme",
3376- "description": "Style neutral, scalable cursor theme"
3377- },
3378- {
3379- "status": "Installed",
3380- "desired": "Install",
3381- "version": "2.59-4",
3382- "name": "dnsmasq-base",
3383- "description": "Small caching DNS proxy and DHCP/TFTP server"
3384- },
3385- {
3386- "status": "Installed",
3387- "desired": "Install",
3388- "version": "1:9.8.1.dfsg.P1-4ubuntu0.5",
3389- "name": "dnsutils",
3390- "description": "Clients provided with BIND"
3391- },
3392- {
3393- "status": "Installed",
3394- "desired": "Install",
3395- "version": "0.10.3",
3396- "name": "doc-base",
3397- "description": "utilities to manage online documentation"
3398- },
3399- {
3400- "status": "Installed",
3401- "desired": "Install",
3402- "version": "4.5-7ubuntu1",
3403- "name": "docbook-xml",
3404- "description": "standard XML documentation system for software and systems"
3405- },
3406- {
3407- "status": "Installed",
3408- "desired": "Install",
3409- "version": "1.76.1+dfsg-1ubuntu1",
3410- "name": "docbook-xsl",
3411- "description": "stylesheets for processing DocBook XML to various output formats"
3412- },
3413- {
3414- "status": "Installed",
3415- "desired": "Install",
3416- "version": "0.12-0ubuntu1~rev479~precise1",
3417- "name": "doit",
3418- "description": "Automation Tool"
3419- },
3420- {
3421- "status": "Installed",
3422- "desired": "Install",
3423- "version": "3.0.12-1ubuntu1",
3424- "name": "dosfstools",
3425- "description": "utilities for making and checking MS-DOS FAT filesystems"
3426- },
3427- {
3428- "status": "Installed",
3429- "desired": "Install",
3430- "version": "1.16.1.2ubuntu7.1",
3431- "name": "dpkg",
3432- "description": "Debian package management system"
3433- },
3434- {
3435- "status": "Installed",
3436- "desired": "Install",
3437- "version": "1.16.1.2ubuntu7.1",
3438- "name": "dpkg-dev",
3439- "description": "Debian package development tools"
3440- },
3441- {
3442- "status": "Installed",
3443- "desired": "Install",
3444- "version": "0.9.6.2ubuntu1",
3445- "name": "dput",
3446- "description": "Debian package upload tool"
3447- },
3448- {
3449- "status": "Installed",
3450- "desired": "Install",
3451- "version": "0.6.1+repack-1",
3452- "name": "drobo-utils",
3453- "description": "manage data robotics storage units (drobos)"
3454- },
3455- {
3456- "status": "Installed",
3457- "desired": "Install",
3458- "version": "0.6.18-0ubuntu3.1",
3459- "name": "duplicity",
3460- "description": "encrypted bandwidth-efficient backup"
3461- },
3462- {
3463- "status": "Installed",
3464- "desired": "Install",
3465- "version": "7.1-10",
3466- "name": "dvd+rw-tools",
3467- "description": "DVD+-RW/R tools"
3468- },
3469- {
3470- "status": "Installed",
3471- "desired": "Install",
3472- "version": "1.42-1ubuntu2",
3473- "name": "e2fslibs",
3474- "description": "ext2/ext3/ext4 file system libraries"
3475- },
3476- {
3477- "status": "Installed",
3478- "desired": "Install",
3479- "version": "1.42-1ubuntu2",
3480- "name": "e2fsprogs",
3481- "description": "ext2/ext3/ext4 file system utilities"
3482- },
3483- {
3484- "status": "Installed",
3485- "desired": "Install",
3486- "version": "2.0.9.2-2ubuntu2",
3487- "name": "ebtables",
3488- "description": "Ethernet bridge frame table administration"
3489- },
3490- {
3491- "status": "Installed",
3492- "desired": "Install",
3493- "version": "1.5-3",
3494- "name": "ed",
3495- "description": "classic UNIX line editor"
3496- },
3497- {
3498- "status": "Installed",
3499- "desired": "Install",
3500- "version": "2.1.5+deb1+cvs20081104-9",
3501- "name": "eject",
3502- "description": "ejects CDs and operates CD-Changers under Linux"
3503- },
3504- {
3505- "status": "Installed",
3506- "desired": "Install",
3507- "version": "3.4.2.3-0ubuntu1",
3508- "name": "empathy",
3509- "description": "GNOME multi-protocol chat and call client"
3510- },
3511- {
3512- "status": "Installed",
3513- "desired": "Install",
3514- "version": "3.4.2.3-0ubuntu1",
3515- "name": "empathy-common",
3516- "description": "GNOME multi-protocol chat and call client (common files)"
3517- },
3518- {
3519- "status": "Installed",
3520- "desired": "Install",
3521- "version": "1.6.0-7",
3522- "name": "enchant",
3523- "description": "Wrapper for various spell checker engines (binary programs)"
3524- },
3525- {
3526- "status": "Installed",
3527- "desired": "Install",
3528- "version": "2:1.4.6-0ubuntu0.12.04.1",
3529- "name": "enigmail",
3530- "description": "GPG support for Thunderbird and Debian Icedove"
3531- },
3532- {
3533- "status": "Installed",
3534- "desired": "Install",
3535- "version": "3.4.2-0ubuntu1.1",
3536- "name": "eog",
3537- "description": "Eye of GNOME graphics viewer program"
3538- },
3539- {
3540- "status": "Installed",
3541- "desired": "Install",
3542- "version": "0.2.41-10build3",
3543- "name": "esound-common",
3544- "description": "Enlightened Sound Daemon - Common files"
3545- },
3546- {
3547- "status": "Installed",
3548- "desired": "Install",
3549- "version": "1.46.02-0ubuntu1",
3550- "name": "espeak",
3551- "description": "Multi-lingual software speech synthesizer"
3552- },
3553- {
3554- "status": "Installed",
3555- "desired": "Install",
3556- "version": "1.46.02-0ubuntu1",
3557- "name": "espeak-data",
3558- "description": "Multi-lingual software speech synthesizer: speech data files"
3559- },
3560- {
3561- "status": "Installed",
3562- "desired": "Install",
3563- "version": "1:3.1-1",
3564- "name": "ethtool",
3565- "description": "display or change Ethernet device settings"
3566- },
3567- {
3568- "status": "Installed",
3569- "desired": "Install",
3570- "version": "2.0.0~bzr516-0ubuntu3.1",
3571- "name": "euca2ools",
3572- "description": "managing cloud instances for Eucalyptus"
3573- },
3574- {
3575- "status": "Installed",
3576- "desired": "Install",
3577- "version": "3.4.0-0ubuntu1.4",
3578- "name": "evince",
3579- "description": "Document (PostScript, PDF) viewer"
3580- },
3581- {
3582- "status": "Installed",
3583- "desired": "Install",
3584- "version": "3.4.0-0ubuntu1.4",
3585- "name": "evince-common",
3586- "description": "Document (PostScript, PDF) viewer - common files"
3587- },
3588- {
3589- "status": "Installed",
3590- "desired": "Install",
3591- "version": "2.0.2",
3592- "name": "evoluspencil",
3593- "description": "Evolus Pencil"
3594- },
3595- {
3596- "status": "Installed",
3597- "desired": "Install",
3598- "version": "3.2.3-0ubuntu7",
3599- "name": "evolution-data-server",
3600- "description": "evolution database backend server"
3601- },
3602- {
3603- "status": "Installed",
3604- "desired": "Install",
3605- "version": "3.2.3-0ubuntu7",
3606- "name": "evolution-data-server-common",
3607- "description": "architecture independent files for Evolution Data Server"
3608- },
3609- {
3610- "status": "Installed",
3611- "desired": "Install",
3612- "version": "46",
3613- "name": "example-content",
3614- "description": "Ubuntu example content"
3615- },
3616- {
3617- "status": "Installed",
3618- "desired": "Install",
3619- "version": "1.3.2-5",
3620- "name": "fabric",
3621- "description": "Simple Pythonic remote deployment tool"
3622- },
3623- {
3624- "status": "Installed",
3625- "desired": "Install",
3626- "version": "1.18.2-1",
3627- "name": "fakeroot",
3628- "description": "tool for simulating superuser privileges"
3629- },
3630- {
3631- "status": "Installed",
3632- "desired": "Install",
3633- "version": "4:0.8.4-0ubuntu0.12.04.1",
3634- "name": "ffmpeg",
3635- "description": "Multimedia player, server, encoder and transcoder (transitional package)"
3636- },
3637- {
3638- "status": "Installed",
3639- "desired": "Install",
3640- "version": "5.09-2",
3641- "name": "file",
3642- "description": "Determines file type using \"magic\" numbers"
3643- },
3644- {
3645- "status": "Installed",
3646- "desired": "Install",
3647- "version": "3.4.1-0ubuntu1",
3648- "name": "file-roller",
3649- "description": "archive manager for GNOME"
3650- },
3651- {
3652- "status": "Installed",
3653- "desired": "Install",
3654- "version": "4.4.2-4ubuntu1",
3655- "name": "findutils",
3656- "description": "utilities for finding files--find, xargs"
3657- },
3658- {
3659- "status": "Installed",
3660- "desired": "Install",
3661- "version": "18.0.1+build1-0ubuntu0.12.04.1",
3662- "name": "firefox",
3663- "description": "Safe and easy web browser from Mozilla"
3664- },
3665- {
3666- "status": "Installed",
3667- "desired": "Install",
3668- "version": "18.0.1+build1-0ubuntu0.12.04.1",
3669- "name": "firefox-globalmenu",
3670- "description": "Unity appmenu integration for Firefox"
3671- },
3672- {
3673- "status": "Installed",
3674- "desired": "Install",
3675- "version": "18.0.1+build1-0ubuntu0.12.04.1",
3676- "name": "firefox-gnome-support",
3677- "description": "Safe and easy web browser from Mozilla - GNOME support"
3678- },
3679- {
3680- "status": "Installed",
3681- "desired": "Install",
3682- "version": "0.4",
3683- "name": "firefox-launchpad-plugin",
3684- "description": "Launchpad firefox integration"
3685- },
3686- {
3687- "status": "Installed",
3688- "desired": "Install",
3689- "version": "18.0.1+build1-0ubuntu0.12.04.1",
3690- "name": "firefox-locale-en",
3691- "description": "English language pack for Firefox"
3692- },
3693- {
3694- "status": "Installed",
3695- "desired": "Install",
3696- "version": "11.2.202.261ubuntu0.12.04.1",
3697- "name": "flashplugin-installer",
3698- "description": "Adobe Flash Player plugin installer"
3699- },
3700- {
3701- "status": "Installed",
3702- "desired": "Install",
3703- "version": "2.5.35-10ubuntu3",
3704- "name": "flex",
3705- "description": "A fast lexical analyzer generator."
3706- },
3707- {
3708- "status": "Installed",
3709- "desired": "Install",
3710- "version": "0.6.8-2",
3711- "name": "folks-common",
3712- "description": "library to aggregates people into metacontacts (common files)"
3713- },
3714- {
3715- "status": "Installed",
3716- "desired": "Install",
3717- "version": "2.8.0-3ubuntu9.1",
3718- "name": "fontconfig",
3719- "description": "generic font configuration library - support binaries"
3720- },
3721- {
3722- "status": "Installed",
3723- "desired": "Install",
3724- "version": "2.8.0-3ubuntu9.1",
3725- "name": "fontconfig-config",
3726- "description": "generic font configuration library - configuration"
3727- },
3728- {
3729- "status": "Installed",
3730- "desired": "Install",
3731- "version": "2.01+mry-3",
3732- "name": "fonts-kacst",
3733- "description": "KACST free TrueType Arabic fonts"
3734- },
3735- {
3736- "status": "Installed",
3737- "desired": "Install",
3738- "version": "5.0+svn11846-2",
3739- "name": "fonts-kacst-one",
3740- "description": "TrueType font designed for Arabic language"
3741- },
3742- {
3743- "status": "Installed",
3744- "desired": "Install",
3745- "version": "5.0-5ubuntu1",
3746- "name": "fonts-khmeros-core",
3747- "description": "KhmerOS Unicode fonts for the Khmer language of Cambodia"
3748- },
3749- {
3750- "status": "Installed",
3751- "desired": "Install",
3752- "version": "0.0.20060226-8",
3753- "name": "fonts-lao",
3754- "description": "TrueType font for Lao language"
3755- },
3756- {
3757- "status": "Installed",
3758- "desired": "Install",
3759- "version": "1.07.0-2ubuntu0.1",
3760- "name": "fonts-liberation",
3761- "description": "Fonts with the same metrics as Times, Arial and Courier"
3762- },
3763- {
3764- "status": "Installed",
3765- "desired": "Install",
3766- "version": "3.010-2",
3767- "name": "fonts-nanum",
3768- "description": "Nanum Korean fonts"
3769- },
3770- {
3771- "status": "Installed",
3772- "desired": "Install",
3773- "version": "2:102.2+LibO3.5.4-0ubuntu1.1",
3774- "name": "fonts-opensymbol",
3775- "description": "OpenSymbol TrueType font"
3776- },
3777- {
3778- "status": "Installed",
3779- "desired": "Install",
3780- "version": "003.02.01-5ubuntu1",
3781- "name": "fonts-takao-pgothic",
3782- "description": "Japanese TrueType font set, Takao P Gothic Fonts"
3783- },
3784- {
3785- "status": "Installed",
3786- "desired": "Install",
3787- "version": "1:0.4.17-1ubuntu1",
3788- "name": "fonts-thai-tlwg",
3789- "description": "Thai fonts maintained by TLWG (meta package)"
3790- },
3791- {
3792- "status": "Installed",
3793- "desired": "Install",
3794- "version": "1:0.4.17-1ubuntu1",
3795- "name": "fonts-tlwg-garuda",
3796- "description": "Thai Garuda font"
3797- },
3798- {
3799- "status": "Installed",
3800- "desired": "Install",
3801- "version": "1:0.4.17-1ubuntu1",
3802- "name": "fonts-tlwg-kinnari",
3803- "description": "Thai Kinnari font"
3804- },
3805- {
3806- "status": "Installed",
3807- "desired": "Install",
3808- "version": "1:0.4.17-1ubuntu1",
3809- "name": "fonts-tlwg-loma",
3810- "description": "Thai Loma font"
3811- },
3812- {
3813- "status": "Installed",
3814- "desired": "Install",
3815- "version": "1:0.4.17-1ubuntu1",
3816- "name": "fonts-tlwg-mono",
3817- "description": "Thai TlwgMono font"
3818- },
3819- {
3820- "status": "Installed",
3821- "desired": "Install",
3822- "version": "1:0.4.17-1ubuntu1",
3823- "name": "fonts-tlwg-norasi",
3824- "description": "Thai Norasi font"
3825- },
3826- {
3827- "status": "Installed",
3828- "desired": "Install",
3829- "version": "1:0.4.17-1ubuntu1",
3830- "name": "fonts-tlwg-purisa",
3831- "description": "Thai Purisa font"
3832- },
3833- {
3834- "status": "Installed",
3835- "desired": "Install",
3836- "version": "1:0.4.17-1ubuntu1",
3837- "name": "fonts-tlwg-sawasdee",
3838- "description": "Thai Sawasdee font"
3839- },
3840- {
3841- "status": "Installed",
3842- "desired": "Install",
3843- "version": "1:0.4.17-1ubuntu1",
3844- "name": "fonts-tlwg-typewriter",
3845- "description": "Thai TlwgTypewriter font"
3846- },
3847- {
3848- "status": "Installed",
3849- "desired": "Install",
3850- "version": "1:0.4.17-1ubuntu1",
3851- "name": "fonts-tlwg-typist",
3852- "description": "Thai TlwgTypist font"
3853- },
3854- {
3855- "status": "Installed",
3856- "desired": "Install",
3857- "version": "1:0.4.17-1ubuntu1",
3858- "name": "fonts-tlwg-typo",
3859- "description": "Thai TlwgTypo font"
3860- },
3861- {
3862- "status": "Installed",
3863- "desired": "Install",
3864- "version": "1:0.4.17-1ubuntu1",
3865- "name": "fonts-tlwg-umpush",
3866- "description": "Thai Umpush font"
3867- },
3868- {
3869- "status": "Installed",
3870- "desired": "Install",
3871- "version": "1:0.4.17-1ubuntu1",
3872- "name": "fonts-tlwg-waree",
3873- "description": "Thai Waree font"
3874- },
3875- {
3876- "status": "Installed",
3877- "desired": "Install",
3878- "version": "20120322-0ubuntu1",
3879- "name": "foomatic-db-compressed-ppds",
3880- "description": "OpenPrinting printer support - Compressed PPDs derived from the database"
3881- },
3882- {
3883- "status": "Installed",
3884- "desired": "Install",
3885- "version": "4.0.8-2ubuntu1",
3886- "name": "foomatic-db-engine",
3887- "description": "OpenPrinting printer support - programs"
3888- },
3889- {
3890- "status": "Installed",
3891- "desired": "Install",
3892- "version": "4.0.16-0ubuntu0.2",
3893- "name": "foomatic-filters",
3894- "description": "OpenPrinting printer support - filters"
3895- },
3896- {
3897- "status": "Installed",
3898- "desired": "Install",
3899- "version": "2.6.0-1ubuntu3",
3900- "name": "freeglut3",
3901- "description": "OpenGL Utility Toolkit"
3902- },
3903- {
3904- "status": "Installed",
3905- "desired": "Install",
3906- "version": "2.6.0-1ubuntu3",
3907- "name": "freeglut3-dev",
3908- "description": "OpenGL Utility Toolkit development files"
3909- },
3910- {
3911- "status": "Installed",
3912- "desired": "Install",
3913- "version": "20060219-1",
3914- "name": "freepats",
3915- "description": "Free patch set for MIDI audio synthesis"
3916- },
3917- {
3918- "status": "Installed",
3919- "desired": "Install",
3920- "version": "0.2.25",
3921- "name": "friendly-recovery",
3922- "description": "Make recovery more user-friendly"
3923- },
3924- {
3925- "status": "Installed",
3926- "desired": "Install",
3927- "version": "20101118-2",
3928- "name": "fswebcam",
3929- "description": "Tiny and flexible webcam program"
3930- },
3931- {
3932- "status": "Installed",
3933- "desired": "Install",
3934- "version": "0.17-25",
3935- "name": "ftp",
3936- "description": "classical file transfer client"
3937- },
3938- {
3939- "status": "Installed",
3940- "desired": "Install",
3941- "version": "2.8.6-2ubuntu2",
3942- "name": "fuse",
3943- "description": "Filesystem in Userspace"
3944- },
3945- {
3946- "status": "Installed",
3947- "desired": "Install",
3948- "version": "0.25.06precise1",
3949- "name": "fwts",
3950- "description": "FirmWare Test Suite"
3951- },
3952- {
3953- "status": "Installed",
3954- "desired": "Install",
3955- "version": "4:4.6.3-1ubuntu5",
3956- "name": "g++",
3957- "description": "GNU C++ compiler"
3958- },
3959- {
3960- "status": "Installed",
3961- "desired": "Install",
3962- "version": "4.6.3-1ubuntu5",
3963- "name": "g++-4.6",
3964- "description": "GNU C++ compiler"
3965- },
3966- {
3967- "status": "Installed",
3968- "desired": "Install",
3969- "version": "1:3.1.8+dfsg-0.1ubuntu1",
3970- "name": "gawk",
3971- "description": "GNU awk, a pattern scanning and processing language"
3972- },
3973- {
3974- "status": "Installed",
3975- "desired": "Install",
3976- "version": "6.4.1.1-0ubuntu3",
3977- "name": "gcalctool",
3978- "description": "GNOME desktop calculator"
3979- },
3980- {
3981- "status": "Installed",
3982- "desired": "Install",
3983- "version": "4:4.6.3-1ubuntu5",
3984- "name": "gcc",
3985- "description": "GNU C compiler"
3986- },
3987- {
3988- "status": "Installed",
3989- "desired": "Install",
3990- "version": "4.6.3-1ubuntu5",
3991- "name": "gcc-4.6",
3992- "description": "GNU C compiler"
3993- },
3994- {
3995- "status": "Installed",
3996- "desired": "Install",
3997- "version": "4.6.3-1ubuntu5",
3998- "name": "gcc-4.6-base",
3999- "description": "GCC, the GNU Compiler Collection (base package)"
4000- },
4001- {
4002- "status": "Installed",
4003- "desired": "Install",
4004- "version": "4.6.3-1ubuntu5",
4005- "name": "gcc-4.6-base:i386",
4006- "description": "GCC, the GNU Compiler Collection (base package)"
4007- },
4008- {
4009- "status": "Installed",
4010- "desired": "Install",
4011- "version": "3.2.5-0ubuntu2",
4012- "name": "gconf-defaults-service",
4013- "description": "GNOME configuration database system (system defaults service)"
4014- },
4015- {
4016- "status": "Installed",
4017- "desired": "Install",
4018- "version": "3.0.1-1ubuntu2",
4019- "name": "gconf-editor",
4020- "description": "editor for the GConf configuration system"
4021- },
4022- {
4023- "status": "Installed",
4024- "desired": "Install",
4025- "version": "3.2.5-0ubuntu2",
4026- "name": "gconf-service",
4027- "description": "GNOME configuration database system (D-Bus service)"
4028- },
4029- {
4030- "status": "Installed",
4031- "desired": "Install",
4032- "version": "3.2.5-0ubuntu2",
4033- "name": "gconf-service-backend",
4034- "description": "GNOME configuration database system (D-Bus service)"
4035- },
4036- {
4037- "status": "Installed",
4038- "desired": "Install",
4039- "version": "3.2.5-0ubuntu2",
4040- "name": "gconf2",
4041- "description": "GNOME configuration database system (support tools)"
4042- },
4043- {
4044- "status": "Installed",
4045- "desired": "Install",
4046- "version": "3.2.5-0ubuntu2",
4047- "name": "gconf2-common",
4048- "description": "GNOME configuration database system (common files)"
4049- },
4050- {
4051- "status": "Installed",
4052- "desired": "Install",
4053- "version": "7.4-2012.04-0ubuntu2.1",
4054- "name": "gdb",
4055- "description": "The GNU Debugger"
4056- },
4057- {
4058- "status": "Installed",
4059- "desired": "Install",
4060- "version": "0.8.5build1",
4061- "name": "gdebi",
4062- "description": "simple tool to install deb files - GNOME GUI"
4063- },
4064- {
4065- "status": "Installed",
4066- "desired": "Install",
4067- "version": "0.8.5build1",
4068- "name": "gdebi-core",
4069- "description": "simple tool to install deb files"
4070- },
4071- {
4072- "status": "Installed",
4073- "desired": "Install",
4074- "version": "0.21.dfsg-1ubuntu4",
4075- "name": "geany",
4076- "description": "fast and lightweight IDE"
4077- },
4078- {
4079- "status": "Installed",
4080- "desired": "Install",
4081- "version": "0.21.dfsg-1ubuntu4",
4082- "name": "geany-common",
4083- "description": "fast and lightweight IDE -- common files"
4084- },
4085- {
4086- "status": "Installed",
4087- "desired": "Install",
4088- "version": "0.21.1.dfsg-2",
4089- "name": "geany-plugin-treebrowser",
4090- "description": "tree browser plugin for Geany"
4091- },
4092- {
4093- "status": "Installed",
4094- "desired": "Install",
4095- "version": "0.21.1.dfsg-2",
4096- "name": "geany-plugins-common",
4097- "description": "set of plugins for Geany (translations)"
4098- },
4099- {
4100- "status": "Installed",
4101- "desired": "Install",
4102- "version": "3.4.1-0ubuntu1",
4103- "name": "gedit",
4104- "description": "official text editor of the GNOME desktop environment"
4105- },
4106- {
4107- "status": "Installed",
4108- "desired": "Install",
4109- "version": "3.4.1-0ubuntu1",
4110- "name": "gedit-common",
4111- "description": "official text editor of the GNOME desktop environment (support files)"
4112- },
4113- {
4114- "status": "Installed",
4115- "desired": "Install",
4116- "version": "9:1.1.11-2ubuntu2",
4117- "name": "genisoimage",
4118- "description": "Creates ISO-9660 CD-ROM filesystem images"
4119- },
4120- {
4121- "status": "Installed",
4122- "desired": "Install",
4123- "version": "0.12.0-1ubuntu12",
4124- "name": "geoclue",
4125- "description": "Geographic information framework"
4126- },
4127- {
4128- "status": "Installed",
4129- "desired": "Install",
4130- "version": "0.0.2-0ubuntu6",
4131- "name": "geoclue-ubuntu-geoip",
4132- "description": "Provide positioning for GeoClue via Ubuntu GeoIP services"
4133- },
4134- {
4135- "status": "Installed",
4136- "desired": "Install",
4137- "version": "20111220-1",
4138- "name": "geoip-database",
4139- "description": "IP lookup command line tools that use the GeoIP library (country database)"
4140- },
4141- {
4142- "status": "Installed",
4143- "desired": "Install",
4144- "version": "0.18.1.1-5ubuntu3",
4145- "name": "gettext",
4146- "description": "GNU Internationalization utilities"
4147- },
4148- {
4149- "status": "Installed",
4150- "desired": "Install",
4151- "version": "0.18.1.1-5ubuntu3",
4152- "name": "gettext-base",
4153- "description": "GNU Internationalization utilities for the base system"
4154- },
4155- {
4156- "status": "Installed",
4157- "desired": "Install",
4158- "version": "9.05~dfsg-0ubuntu4.2",
4159- "name": "ghostscript",
4160- "description": "interpreter for the PostScript language and for PDF"
4161- },
4162- {
4163- "status": "Installed",
4164- "desired": "Install",
4165- "version": "9.05~dfsg-0ubuntu4.2",
4166- "name": "ghostscript-cups",
4167- "description": "interpreter for the PostScript language and for PDF - CUPS filters"
4168- },
4169- {
4170- "status": "Installed",
4171- "desired": "Install",
4172- "version": "9.05~dfsg-0ubuntu4.2",
4173- "name": "ghostscript-x",
4174- "description": "interpreter for the PostScript language and for PDF - X11 support"
4175- },
4176- {
4177- "status": "Installed",
4178- "desired": "Install",
4179- "version": "2.6.12-1ubuntu1.2",
4180- "name": "gimp",
4181- "description": "The GNU Image Manipulation Program"
4182- },
4183- {
4184- "status": "Installed",
4185- "desired": "Install",
4186- "version": "2.6.12-1ubuntu1.2",
4187- "name": "gimp-data",
4188- "description": "Data files for GIMP"
4189- },
4190- {
4191- "status": "Installed",
4192- "desired": "Install",
4193- "version": "0.2.4.1-0ubuntu1",
4194- "name": "ginn",
4195- "description": "Gesture Injector: No-GEIS, No-Toolkits"
4196- },
4197- {
4198- "status": "Installed",
4199- "desired": "Install",
4200- "version": "0.6.15-2ubuntu9.4",
4201- "name": "gir1.2-accountsservice-1.0",
4202- "description": "GObject introspection data for AccountService"
4203- },
4204- {
4205- "status": "Installed",
4206- "desired": "Install",
4207- "version": "0.4.92-0ubuntu1",
4208- "name": "gir1.2-appindicator3-0.1",
4209- "description": "Typelib files for libappindicator3-1."
4210- },
4211- {
4212- "status": "Installed",
4213- "desired": "Install",
4214- "version": "2.4.0-0ubuntu1",
4215- "name": "gir1.2-atk-1.0",
4216- "description": "ATK accessibility toolkit (GObject introspection)"
4217- },
4218- {
4219- "status": "Installed",
4220- "desired": "Install",
4221- "version": "2.4.2-0ubuntu0.1",
4222- "name": "gir1.2-atspi-2.0",
4223- "description": "Assistive Technology Service Provider (GObject introspection)"
4224- },
4225- {
4226- "status": "Installed",
4227- "desired": "Install",
4228- "version": "0.4.2-1ubuntu1",
4229- "name": "gir1.2-caribou-1.0",
4230- "description": "GObject introspection for the Caribou library"
4231- },
4232- {
4233- "status": "Installed",
4234- "desired": "Install",
4235- "version": "1.10.6-1~precise1",
4236- "name": "gir1.2-clutter-1.0",
4237- "description": "GObject introspection data for the Clutter 1.0 library"
4238- },
4239- {
4240- "status": "Installed",
4241- "desired": "Install",
4242- "version": "1.10.0-0ubuntu2",
4243- "name": "gir1.2-cogl-1.0",
4244- "description": "GObject introspection data for the Cogl 1.0 library"
4245- },
4246- {
4247- "status": "Installed",
4248- "desired": "Install",
4249- "version": "1.10.0-0ubuntu2",
4250- "name": "gir1.2-coglpango-1.0",
4251- "description": "GObject introspection data for the CoglPango 1.0 library"
4252- },
4253- {
4254- "status": "Installed",
4255- "desired": "Install",
4256- "version": "0.6.2-0ubuntu0.1",
4257- "name": "gir1.2-dbusmenu-glib-0.4",
4258- "description": "typelib file for libdbusmenu-glib4"
4259- },
4260- {
4261- "status": "Installed",
4262- "desired": "Install",
4263- "version": "0.6.2-0ubuntu0.1",
4264- "name": "gir1.2-dbusmenu-gtk-0.4",
4265- "description": "typelib file for libdbusmenu-gtk4"
4266- },
4267- {
4268- "status": "Installed",
4269- "desired": "Install",
4270- "version": "1.0.10-0ubuntu1",
4271- "name": "gir1.2-dee-1.0",
4272- "description": "GObject introspection data for the Dee library"
4273- },
4274- {
4275- "status": "Installed",
4276- "desired": "Install",
4277- "version": "0.6.8-2",
4278- "name": "gir1.2-folks-0.6",
4279- "description": "library to aggregates people into metacontacts - GObject-Introspection"
4280- },
4281- {
4282- "status": "Installed",
4283- "desired": "Install",
4284- "version": "1.32.0-1",
4285- "name": "gir1.2-freedesktop",
4286- "description": "Introspection data for some FreeDesktop components"
4287- },
4288- {
4289- "status": "Installed",
4290- "desired": "Install",
4291- "version": "3.2.5-0ubuntu2",
4292- "name": "gir1.2-gconf-2.0",
4293- "description": "GNOME configuration database system (GObject-Introspection)"
4294- },
4295- {
4296- "status": "Installed",
4297- "desired": "Install",
4298- "version": "3.4.1-0ubuntu1",
4299- "name": "gir1.2-gdesktopenums-3.0",
4300- "description": "GObject introspection for GSettings desktop-wide schemas"
4301- },
4302- {
4303- "status": "Installed",
4304- "desired": "Install",
4305- "version": "2.26.1-1",
4306- "name": "gir1.2-gdkpixbuf-2.0",
4307- "description": "GDK Pixbuf library - GObject-Introspection"
4308- },
4309- {
4310- "status": "Installed",
4311- "desired": "Install",
4312- "version": "0.6.4-1",
4313- "name": "gir1.2-gee-1.0",
4314- "description": "GLib Telepathy connection manager library (GObject-Introspection)"
4315- },
4316- {
4317- "status": "Installed",
4318- "desired": "Install",
4319- "version": "1.32.0-1ubuntu1",
4320- "name": "gir1.2-gjsdbus-1.0",
4321- "description": "GObject introspection data for GJS"
4322- },
4323- {
4324- "status": "Installed",
4325- "desired": "Install",
4326- "version": "3.4.0.2-1",
4327- "name": "gir1.2-gkbd-3.0",
4328- "description": "GObject introspection data for the GnomeKbd library"
4329- },
4330- {
4331- "status": "Installed",
4332- "desired": "Install",
4333- "version": "1.32.0-1",
4334- "name": "gir1.2-glib-2.0",
4335- "description": "Introspection data for GLib, GObject, Gio and GModule"
4336- },
4337- {
4338- "status": "Installed",
4339- "desired": "Install",
4340- "version": "3.4.0-0ubuntu1",
4341- "name": "gir1.2-gmenu-3.0",
4342- "description": "GObject introspection data for the GNOME menu library"
4343- },
4344- {
4345- "status": "Installed",
4346- "desired": "Install",
4347- "version": "3.2.2-0ubuntu5",
4348- "name": "gir1.2-gnomebluetooth-1.0",
4349- "description": "Introspection data for GnomeBluetooth"
4350- },
4351- {
4352- "status": "Installed",
4353- "desired": "Install",
4354- "version": "3.2.2-2",
4355- "name": "gir1.2-gnomekeyring-1.0",
4356- "description": "GNOME keyring services library - introspection data"
4357- },
4358- {
4359- "status": "Installed",
4360- "desired": "Install",
4361- "version": "0.10.36-1ubuntu0.1",
4362- "name": "gir1.2-gst-plugins-base-0.10",
4363- "description": "Description: GObject introspection data for the GStreamer Plugins Base library"
4364- },
4365- {
4366- "status": "Installed",
4367- "desired": "Install",
4368- "version": "0.10.36-1ubuntu1",
4369- "name": "gir1.2-gstreamer-0.10",
4370- "description": "Description: GObject introspection data for the GStreamer library"
4371- },
4372- {
4373- "status": "Installed",
4374- "desired": "Install",
4375- "version": "2.24.10-0ubuntu6",
4376- "name": "gir1.2-gtk-2.0",
4377- "description": "GTK+ graphical user interface library -- gir bindings"
4378- },
4379- {
4380- "status": "Installed",
4381- "desired": "Install",
4382- "version": "3.4.2-0ubuntu0.5",
4383- "name": "gir1.2-gtk-3.0",
4384- "description": "GTK+ graphical user interface library -- gir bindings"
4385- },
4386- {
4387- "status": "Installed",
4388- "desired": "Install",
4389- "version": "3.4.2-0ubuntu1",
4390- "name": "gir1.2-gtksource-3.0",
4391- "description": "gir files for the GTK+ syntax highlighting widget"
4392- },
4393- {
4394- "status": "Installed",
4395- "desired": "Install",
4396- "version": "175-0ubuntu9.2",
4397- "name": "gir1.2-gudev-1.0",
4398- "description": "libgudev-1.0 introspection data"
4399- },
4400- {
4401- "status": "Installed",
4402- "desired": "Install",
4403- "version": "0.6.92-0ubuntu1",
4404- "name": "gir1.2-indicate-0.7",
4405- "description": "Typelib file for libindicate5"
4406- },
4407- {
4408- "status": "Installed",
4409- "desired": "Install",
4410- "version": "1.8.3-0ubuntu0.12.04.1",
4411- "name": "gir1.2-javascriptcoregtk-1.0",
4412- "description": "GObject introspection data for the GTK+-based JavaScriptCore library"
4413- },
4414- {
4415- "status": "Installed",
4416- "desired": "Install",
4417- "version": "1.8.3-0ubuntu0.12.04.1",
4418- "name": "gir1.2-javascriptcoregtk-3.0",
4419- "description": "GObject introspection data for the GTK+-based JavaScriptCore library"
4420- },
4421- {
4422- "status": "Installed",
4423- "desired": "Install",
4424- "version": "0.14.2-1",
4425- "name": "gir1.2-json-1.0",
4426- "description": "GLib JSON manipulation library (introspection data)"
4427- },
4428- {
4429- "status": "Installed",
4430- "desired": "Install",
4431- "version": "0.1.56.1",
4432- "name": "gir1.2-launchpad-integration-3.0",
4433- "description": "library for launchpad integration (gir files)"
4434- },
4435- {
4436- "status": "Installed",
4437- "desired": "Install",
4438- "version": "3.4.1-0ubuntu1",
4439- "name": "gir1.2-mutter-3.0",
4440- "description": "GObject introspection data for Mutter"
4441- },
4442- {
4443- "status": "Installed",
4444- "desired": "Install",
4445- "version": "0.9.4.0-0ubuntu4.2",
4446- "name": "gir1.2-networkmanager-1.0",
4447- "description": "GObject introspection data for NetworkManager"
4448- },
4449- {
4450- "status": "Installed",
4451- "desired": "Install",
4452- "version": "0.7.5-1",
4453- "name": "gir1.2-notify-0.7",
4454- "description": "sends desktop notifications to a notification daemon (Introspection files)"
4455- },
4456- {
4457- "status": "Installed",
4458- "desired": "Install",
4459- "version": "1:3.4.1-0ubuntu1.1",
4460- "name": "gir1.2-panelapplet-4.0",
4461- "description": "GObject introspection for the GNOME Panel Applet library"
4462- },
4463- {
4464- "status": "Installed",
4465- "desired": "Install",
4466- "version": "1.30.0-0ubuntu3.1",
4467- "name": "gir1.2-pango-1.0",
4468- "description": "Layout and rendering of internationalized text - gir bindings"
4469- },
4470- {
4471- "status": "Installed",
4472- "desired": "Install",
4473- "version": "1.2.0-1ubuntu1",
4474- "name": "gir1.2-peas-1.0",
4475- "description": "Application plugin library (introspection files)"
4476- },
4477- {
4478- "status": "Installed",
4479- "desired": "Install",
4480- "version": "0.104-1ubuntu1",
4481- "name": "gir1.2-polkit-1.0",
4482- "description": "GObject introspection data for PolicyKit"
4483- },
4484- {
4485- "status": "Installed",
4486- "desired": "Install",
4487- "version": "2.96-0ubuntu4.2",
4488- "name": "gir1.2-rb-3.0",
4489- "description": "GObject introspection data for the rhythmbox music player"
4490- },
4491- {
4492- "status": "Installed",
4493- "desired": "Install",
4494- "version": "2.38.1-1",
4495- "name": "gir1.2-soup-2.4",
4496- "description": "GObject introspection data for the libsoup HTTP library"
4497- },
4498- {
4499- "status": "Installed",
4500- "desired": "Install",
4501- "version": "0.18.0-1ubuntu1",
4502- "name": "gir1.2-telepathyglib-0.12",
4503- "description": "GLib Telepathy connection manager library (GObject-Introspection)"
4504- },
4505- {
4506- "status": "Installed",
4507- "desired": "Install",
4508- "version": "0.4.0-0ubuntu1",
4509- "name": "gir1.2-telepathylogger-0.2",
4510- "description": "Telepathy logger service - introspection"
4511- },
4512- {
4513- "status": "Installed",
4514- "desired": "Install",
4515- "version": "3.0.1-0ubuntu21.1",
4516- "name": "gir1.2-totem-1.0",
4517- "description": "GObject introspection data for Totem media player"
4518- },
4519- {
4520- "status": "Installed",
4521- "desired": "Install",
4522- "version": "3.4.1-1",
4523- "name": "gir1.2-totem-plparser-1.0",
4524- "description": "GObject introspection data for the Totem Playlist Parser library"
4525- },
4526- {
4527- "status": "Installed",
4528- "desired": "Install",
4529- "version": "3.0.1-0ubuntu1",
4530- "name": "gir1.2-ubuntuoneui-3.0",
4531- "description": "Ubuntu One widget library"
4532- },
4533- {
4534- "status": "Installed",
4535- "desired": "Install",
4536- "version": "3.0.2-1",
4537- "name": "gir1.2-unique-3.0",
4538- "description": "GObject introspection data for the Unique library"
4539- },
4540- {
4541- "status": "Installed",
4542- "desired": "Install",
4543- "version": "5.12.0-0ubuntu1.1",
4544- "name": "gir1.2-unity-5.0",
4545- "description": "GObject introspection data for the Unity library"
4546- },
4547- {
4548- "status": "Installed",
4549- "desired": "Install",
4550- "version": "0.9.15-3git1",
4551- "name": "gir1.2-upowerglib-1.0",
4552- "description": "GObject introspection data for upower"
4553- },
4554- {
4555- "status": "Installed",
4556- "desired": "Install",
4557- "version": "1:0.32.1-0ubuntu1",
4558- "name": "gir1.2-vte-2.90",
4559- "description": "GObject introspection data for the VTE library"
4560- },
4561- {
4562- "status": "Installed",
4563- "desired": "Install",
4564- "version": "1.8.3-0ubuntu0.12.04.1",
4565- "name": "gir1.2-webkit-1.0",
4566- "description": "GObject introspection data for the WebKit library"
4567- },
4568- {
4569- "status": "Installed",
4570- "desired": "Install",
4571- "version": "1.8.3-0ubuntu0.12.04.1",
4572- "name": "gir1.2-webkit-3.0",
4573- "description": "GObject introspection data for the WebKit library"
4574- },
4575- {
4576- "status": "Installed",
4577- "desired": "Install",
4578- "version": "3.4.0-0ubuntu1",
4579- "name": "gir1.2-wnck-3.0",
4580- "description": "GObject introspection data for the WNCK library"
4581- },
4582- {
4583- "status": "Installed",
4584- "desired": "Install",
4585- "version": "5.2.1-1ubuntu1",
4586- "name": "gir1.2-xkl-1.0",
4587- "description": "X Keyboard Extension high-level API - introspection data"
4588- },
4589- {
4590- "status": "Installed",
4591- "desired": "Install",
4592- "version": "1:1.7.9.5-1",
4593- "name": "git",
4594- "description": "fast, scalable, distributed revision control system"
4595- },
4596- {
4597- "status": "Installed",
4598- "desired": "Install",
4599- "version": "1:1.7.9.5-1",
4600- "name": "git-core",
4601- "description": "fast, scalable, distributed revision control system (obsolete)"
4602- },
4603- {
4604- "status": "Installed",
4605- "desired": "Install",
4606- "version": "1:1.7.9.5-1",
4607- "name": "git-email",
4608- "description": "fast, scalable, distributed revision control system (email add-on)"
4609- },
4610- {
4611- "status": "Installed",
4612- "desired": "Install",
4613- "version": "1:1.7.9.5-1",
4614- "name": "git-gui",
4615- "description": "fast, scalable, distributed revision control system (GUI)"
4616- },
4617- {
4618- "status": "Installed",
4619- "desired": "Install",
4620- "version": "1:1.7.9.5-1",
4621- "name": "git-man",
4622- "description": "fast, scalable, distributed revision control system (manual pages)"
4623- },
4624- {
4625- "status": "Installed",
4626- "desired": "Install",
4627- "version": "1:1.7.9.5-1",
4628- "name": "gitk",
4629- "description": "fast, scalable, distributed revision control system (revision tree visualizer)"
4630- },
4631- {
4632- "status": "Installed",
4633- "desired": "Install",
4634- "version": "1.32.0-1ubuntu1",
4635- "name": "gjs",
4636- "description": "Mozilla-based javascript bindings for the GNOME platform"
4637- },
4638- {
4639- "status": "Installed",
4640- "desired": "Install",
4641- "version": "2.0.2-6ubuntu1",
4642- "name": "gksu",
4643- "description": "graphical frontend to su"
4644- },
4645- {
4646- "status": "Installed",
4647- "desired": "Install",
4648- "version": "3.12.1-0ubuntu1",
4649- "name": "glade",
4650- "description": "GTK+ User Interface Builder"
4651- },
4652- {
4653- "status": "Installed",
4654- "desired": "Install",
4655- "version": "3.8.0-0ubuntu4",
4656- "name": "glade-gtk2",
4657- "description": "GTK+ 2 User Interface Builder"
4658- },
4659- {
4660- "status": "Installed",
4661- "desired": "Install",
4662- "version": "2.32.1-1ubuntu2",
4663- "name": "glib-networking",
4664- "description": "network-related giomodules for GLib"
4665- },
4666- {
4667- "status": "Installed",
4668- "desired": "Install",
4669- "version": "2.32.1-1ubuntu2",
4670- "name": "glib-networking:i386",
4671- "description": "network-related giomodules for GLib"
4672- },
4673- {
4674- "status": "Installed",
4675- "desired": "Install",
4676- "version": "2.32.1-1ubuntu2",
4677- "name": "glib-networking-common",
4678- "description": "network-related giomodules for GLib - data files"
4679- },
4680- {
4681- "status": "Installed",
4682- "desired": "Install",
4683- "version": "2.32.1-1ubuntu2",
4684- "name": "glib-networking-services",
4685- "description": "network-related giomodules for GLib - D-Bus services"
4686- },
4687- {
4688- "status": "Installed",
4689- "desired": "Install",
4690- "version": "2011.09-0ubuntu1",
4691- "name": "glmark2",
4692- "description": "OpenGL (ES) 2.0 benchmark"
4693- },
4694- {
4695- "status": "Installed",
4696- "desired": "Install",
4697- "version": "2011.09-0ubuntu1",
4698- "name": "glmark2-data",
4699- "description": "data files for the glmark2 OpenGL (ES) 2.0 benchmark"
4700- },
4701- {
4702- "status": "Installed",
4703- "desired": "Install",
4704- "version": "2011.09-0ubuntu1",
4705- "name": "glmark2-es2",
4706- "description": "OpenGL (ES) 2.0 benchmark"
4707- },
4708- {
4709- "status": "Installed",
4710- "desired": "Install",
4711- "version": "3.4.1-0ubuntu1.2",
4712- "name": "gnome-accessibility-themes",
4713- "description": "accessibility themes for the GNOME desktop"
4714- },
4715- {
4716- "status": "Installed",
4717- "desired": "Install",
4718- "version": "3.4.1-0ubuntu1",
4719- "name": "gnome-applets",
4720- "description": "Various applets for the GNOME panel - binary files"
4721- },
4722- {
4723- "status": "Installed",
4724- "desired": "Install",
4725- "version": "3.4.1-0ubuntu1",
4726- "name": "gnome-applets-data",
4727- "description": "Various applets for the GNOME panel - data files"
4728- },
4729- {
4730- "status": "Installed",
4731- "desired": "Install",
4732- "version": "3.2.2-0ubuntu5",
4733- "name": "gnome-bluetooth",
4734- "description": "GNOME Bluetooth tools"
4735- },
4736- {
4737- "status": "Installed",
4738- "desired": "Install",
4739- "version": "3.4.0-1",
4740- "name": "gnome-contacts",
4741- "description": "Contacts manager for GNOME"
4742- },
4743- {
4744- "status": "Installed",
4745- "desired": "Install",
4746- "version": "1:3.4.2-0ubuntu0.8",
4747- "name": "gnome-control-center",
4748- "description": "utilities to configure the GNOME desktop"
4749- },
4750- {
4751- "status": "Installed",
4752- "desired": "Install",
4753- "version": "1:3.4.2-0ubuntu0.8",
4754- "name": "gnome-control-center-data",
4755- "description": "configuration applets for GNOME - data files"
4756- },
4757- {
4758- "status": "Installed",
4759- "desired": "Install",
4760- "version": "3.4.2-0ubuntu0.1",
4761- "name": "gnome-desktop3-data",
4762- "description": "Common files for GNOME desktop apps"
4763- },
4764- {
4765- "status": "Installed",
4766- "desired": "Install",
4767- "version": "3.0.2-2ubuntu7",
4768- "name": "gnome-disk-utility",
4769- "description": "manage and configure disk drives and media"
4770- },
4771- {
4772- "status": "Installed",
4773- "desired": "Install",
4774- "version": "3.4.0-1",
4775- "name": "gnome-font-viewer",
4776- "description": "font viewer for GNOME"
4777- },
4778- {
4779- "status": "Installed",
4780- "desired": "Install",
4781- "version": "1:3.4.1-0ubuntu2.2",
4782- "name": "gnome-games-data",
4783- "description": "data files for the GNOME games"
4784- },
4785- {
4786- "status": "Installed",
4787- "desired": "Install",
4788- "version": "3.4.0-0ubuntu1.1",
4789- "name": "gnome-icon-theme",
4790- "description": "GNOME Desktop icon theme (small subset)"
4791- },
4792- {
4793- "status": "Installed",
4794- "desired": "Install",
4795- "version": "3.4.0-0ubuntu1.1",
4796- "name": "gnome-icon-theme-full",
4797- "description": "GNOME Desktop icon theme"
4798- },
4799- {
4800- "status": "Installed",
4801- "desired": "Install",
4802- "version": "3.4.0-1",
4803- "name": "gnome-icon-theme-symbolic",
4804- "description": "GNOME desktop icon theme (symbolic icons)"
4805- },
4806- {
4807- "status": "Installed",
4808- "desired": "Install",
4809- "version": "3.2.2-2ubuntu4",
4810- "name": "gnome-keyring",
4811- "description": "GNOME keyring services (daemon and tools)"
4812- },
4813- {
4814- "status": "Installed",
4815- "desired": "Install",
4816- "version": "3.4.0-0ubuntu3.1",
4817- "name": "gnome-media",
4818- "description": "GNOME media utilities"
4819- },
4820- {
4821- "status": "Installed",
4822- "desired": "Install",
4823- "version": "3.4.0-0ubuntu1",
4824- "name": "gnome-menus",
4825- "description": "GNOME implementation of the freedesktop menu specification"
4826- },
4827- {
4828- "status": "Installed",
4829- "desired": "Install",
4830- "version": "1.0.5-1",
4831- "name": "gnome-mplayer",
4832- "description": "A GTK+ interface for MPlayer"
4833- },
4834- {
4835- "status": "Installed",
4836- "desired": "Install",
4837- "version": "3.2.0-0ubuntu1",
4838- "name": "gnome-nettool",
4839- "description": "network information tool for GNOME"
4840- },
4841- {
4842- "status": "Installed",
4843- "desired": "Install",
4844- "version": "3.4.0-0ubuntu1",
4845- "name": "gnome-online-accounts",
4846- "description": "GNOME Online Accounts"
4847- },
4848- {
4849- "status": "Installed",
4850- "desired": "Install",
4851- "version": "3.4.2-0ubuntu0.1",
4852- "name": "gnome-orca",
4853- "description": "Scriptable screen reader"
4854- },
4855- {
4856- "status": "Installed",
4857- "desired": "Install",
4858- "version": "1:3.4.1-0ubuntu1.1",
4859- "name": "gnome-panel",
4860- "description": "launcher and docking facility for GNOME"
4861- },
4862- {
4863- "status": "Installed",
4864- "desired": "Install",
4865- "version": "1:3.4.1-0ubuntu1.1",
4866- "name": "gnome-panel-data",
4867- "description": "common files for the GNOME Panel"
4868- },
4869- {
4870- "status": "Installed",
4871- "desired": "Install",
4872- "version": "3.4.0-0ubuntu1.1",
4873- "name": "gnome-power-manager",
4874- "description": "power management tool for the GNOME desktop"
4875- },
4876- {
4877- "status": "Installed",
4878- "desired": "Install",
4879- "version": "3.4.1-0ubuntu1",
4880- "name": "gnome-screensaver",
4881- "description": "GNOME screen saver and locker"
4882- },
4883- {
4884- "status": "Installed",
4885- "desired": "Install",
4886- "version": "3.4.1-0ubuntu1",
4887- "name": "gnome-screenshot",
4888- "description": "screenshot application for GNOME"
4889- },
4890- {
4891- "status": "Installed",
4892- "desired": "Install",
4893- "version": "3.2.1-0ubuntu8",
4894- "name": "gnome-session",
4895- "description": "GNOME Session Manager - GNOME 3 session"
4896- },
4897- {
4898- "status": "Installed",
4899- "desired": "Install",
4900- "version": "3.2.1-0ubuntu8",
4901- "name": "gnome-session-bin",
4902- "description": "GNOME Session Manager - Minimal runtime"
4903- },
4904- {
4905- "status": "Installed",
4906- "desired": "Install",
4907- "version": "0.28-3ubuntu3",
4908- "name": "gnome-session-canberra",
4909- "description": "GNOME session log in and log out sound events"
4910- },
4911- {
4912- "status": "Installed",
4913- "desired": "Install",
4914- "version": "3.2.1-0ubuntu8",
4915- "name": "gnome-session-common",
4916- "description": "GNOME Session Manager - common files"
4917- },
4918- {
4919- "status": "Installed",
4920- "desired": "Install",
4921- "version": "3.2.1-0ubuntu8",
4922- "name": "gnome-session-fallback",
4923- "description": "GNOME Session Manager - GNOME fallback session"
4924- },
4925- {
4926- "status": "Installed",
4927- "desired": "Install",
4928- "version": "3.4.2-0ubuntu0.6",
4929- "name": "gnome-settings-daemon",
4930- "description": "daemon handling the GNOME session settings"
4931- },
4932- {
4933- "status": "Installed",
4934- "desired": "Install",
4935- "version": "3.4.1-0ubuntu2",
4936- "name": "gnome-shell",
4937- "description": "graphical shell for the GNOME desktop"
4938- },
4939- {
4940- "status": "Installed",
4941- "desired": "Install",
4942- "version": "3.4.1-0ubuntu2",
4943- "name": "gnome-shell-common",
4944- "description": "common files for the GNOME graphical shell"
4945- },
4946- {
4947- "status": "Installed",
4948- "desired": "Install",
4949- "version": "1:3.4.1-0ubuntu2.2",
4950- "name": "gnome-sudoku",
4951- "description": "Sudoku puzzle game for GNOME"
4952- },
4953- {
4954- "status": "Installed",
4955- "desired": "Install",
4956- "version": "3.4.1-0ubuntu1",
4957- "name": "gnome-system-log",
4958- "description": "system log viewer for GNOME"
4959- },
4960- {
4961- "status": "Installed",
4962- "desired": "Install",
4963- "version": "3.4.1-0ubuntu1",
4964- "name": "gnome-system-monitor",
4965- "description": "Process viewer and system resource monitor for GNOME"
4966- },
4967- {
4968- "status": "Installed",
4969- "desired": "Install",
4970- "version": "3.0.0-2ubuntu1",
4971- "name": "gnome-system-tools",
4972- "description": "Cross-platform configuration utilities for GNOME"
4973- },
4974- {
4975- "status": "Installed",
4976- "desired": "Install",
4977- "version": "3.4.1.1-0ubuntu1",
4978- "name": "gnome-terminal",
4979- "description": "GNOME terminal emulator application"
4980- },
4981- {
4982- "status": "Installed",
4983- "desired": "Install",
4984- "version": "3.4.1.1-0ubuntu1",
4985- "name": "gnome-terminal-data",
4986- "description": "Data files for the GNOME terminal emulator"
4987- },
4988- {
4989- "status": "Installed",
4990- "desired": "Install",
4991- "version": "3.4.1-0ubuntu1.2",
4992- "name": "gnome-themes-standard",
4993- "description": "Standard gnome themes"
4994- },
4995- {
4996- "status": "Installed",
4997- "desired": "Install",
4998- "version": "3.3.4-0ubuntu1",
4999- "name": "gnome-tweak-tool",
5000- "description": "tool to adjust advanced configuration settings for GNOME"
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches