Merge lp:~therve/landscape-client/lshw into lp:~landscape/landscape-client/trunk

Proposed by Thomas Herve
Status: Merged
Approved by: Mike Milner
Approved revision: 417
Merged at revision: 414
Proposed branch: lp:~therve/landscape-client/lshw
Merge into: lp:~landscape/landscape-client/trunk
Diff against target: 1816 lines (+103/-1159)
41 files modified
README (+1/-10)
dbus/landscape.conf (+0/-62)
debian/control (+2/-3)
debian/landscape-client.install (+0/-2)
debian/landscape-client.postinst (+0/-11)
debian/rules (+6/-9)
landscape/broker/exchange.py (+1/-3)
landscape/configuration.py (+0/-4)
landscape/hal.py (+0/-52)
landscape/lib/bpickle_dbus.py (+0/-63)
landscape/lib/tests/test_bpickle_dbus.py (+0/-75)
landscape/manager/config.py (+1/-1)
landscape/manager/hardwareinfo.py (+27/-0)
landscape/manager/tests/test_config.py (+2/-1)
landscape/manager/tests/test_hardwareinfo.py (+29/-0)
landscape/manager/tests/test_service.py (+3/-9)
landscape/message_schemas.py (+5/-1)
landscape/monitor/config.py (+4/-5)
landscape/monitor/hardwareinventory.py (+0/-114)
landscape/monitor/mountinfo.py (+2/-65)
landscape/monitor/tests/test_hardwareinventory.py (+0/-273)
landscape/monitor/tests/test_mountinfo.py (+0/-76)
landscape/monitor/tests/test_service.py (+3/-9)
landscape/package/releaseupgrader.py (+0/-21)
landscape/package/tests/test_releaseupgrader.py (+0/-54)
landscape/reactor.py (+2/-13)
landscape/service.py (+0/-6)
landscape/tests/test_configuration.py (+1/-1)
landscape/tests/test_hal.py (+0/-87)
landscape/tests/test_service.py (+0/-9)
landscape/tests/test_textmessage.py (+2/-2)
landscape/textmessage.py (+1/-2)
landscape/watchdog.py (+7/-10)
man/landscape-client.1 (+1/-6)
man/landscape-client.txt (+0/-2)
man/landscape-config.1 (+1/-6)
man/landscape-config.txt (+0/-2)
man/landscape-message.1 (+1/-5)
man/landscape-message.txt (+0/-1)
scripts/landscape-dbus-proxy (+0/-82)
setup.py (+1/-2)
To merge this branch: bzr merge lp:~therve/landscape-client/lshw
Reviewer Review Type Date Requested Status
Mike Milner (community) Approve
Alberto Donato (community) Approve
Review via email: mp+84225@code.launchpad.net

Description of the change

The branch ought to be really small, but I removed the code for HAL support, and what was remaining of DBus.

The only part remaining is the old message schemas, but it needs to be removed on the server first.

To post a comment you must log in.
lp:~therve/landscape-client/lshw updated
416. By Thomas Herve

Lints

Revision history for this message
Alberto Donato (ack) wrote :

Looks good! +1

review: Approve
lp:~therve/landscape-client/lshw updated
417. By Thomas Herve

Fix man pages dates

Revision history for this message
Mike Milner (milner) wrote :

Looks good - I love it when code goes away! +1

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'README'
2--- README 2008-12-22 17:21:04 +0000
3+++ README 2011-12-02 09:56:24 +0000
4@@ -23,14 +23,6 @@
5
6 == Developing ==
7
8-To run the full test suite, you must have a dbus session bus
9-running. If you don't have one (for example, if you're running the
10-tests in an ssh session), run the following command:
11-
12-export DBUS_SESSION_BUS_ADDRESS=`dbus-daemon --print-address=1 --session --fork`
13-
14-Then your tests should pass.
15-
16 When you want to test the landscape client manually without management
17 features, you can simply run:
18
19@@ -39,8 +31,7 @@
20 This defaults to the 'landscape-client.conf' configuration file.
21
22 When you want to test management features manually, you'll need to run as root.
23-There's a configuration file 'root-client.conf' which specifies use of the
24-system bus.
25+There's a configuration file 'root-client.conf'.
26
27 $ sudo ./scripts/landscape-client -c root-client.conf
28
29
30=== removed directory 'dbus'
31=== removed file 'dbus/landscape.conf'
32--- dbus/landscape.conf 2010-06-10 13:30:58 +0000
33+++ dbus/landscape.conf 1970-01-01 00:00:00 +0000
34@@ -1,62 +0,0 @@
35-<!DOCTYPE busconfig PUBLIC
36- "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
37- "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
38-<busconfig>
39-
40- <policy user="landscape">
41- <allow own="com.canonical.landscape.Broker" />
42- <allow own="com.canonical.landscape.Monitor" />
43-
44- <allow send_destination="com.canonical.landscape.Broker" />
45- <allow receive_sender="com.canonical.landscape.Broker" />
46-
47- <allow send_destination="com.canonical.landscape.Monitor" />
48- <allow receive_sender="com.canonical.landscape.Monitor" />
49-
50- <allow send_destination="com.canonical.landscape.Manager" />
51- <allow receive_sender="com.canonical.landscape.Manager" />
52-
53- <allow send_interface="org.freedesktop.Hal.Manager" />
54- <allow send_interface="org.freedesktop.Hal.Device" />
55-
56- </policy>
57-
58- <!-- this is a horrible hack -->
59- <policy user="haldaemon">
60-
61- <allow receive_sender="com.canonical.landscape.Manager" />
62- <allow receive_sender="com.canonical.landscape.Monitor" />
63- <allow receive_sender="com.canonical.landscape.Broker" />
64-
65- </policy>
66-
67- <policy user="root">
68- <allow own="com.canonical.landscape.Manager" />
69-
70- <allow send_destination="com.canonical.landscape.Broker" />
71- <allow receive_sender="com.canonical.landscape.Broker" />
72-
73- <allow send_destination="com.canonical.landscape.Monitor" />
74- <allow receive_sender="com.canonical.landscape.Monitor" />
75-
76- <allow send_destination="com.canonical.landscape.Manager" />
77- <allow receive_sender="com.canonical.landscape.Manager" />
78- </policy>
79-
80- <policy context="default">
81- <deny own="com.canonical.landscape.Broker" />
82- <deny own="com.canonical.landscape.Monitor" />
83- <deny own="com.canonical.landscape.Manager" />
84-
85- <deny send_destination="com.canonical.landscape.Broker" />
86- <deny receive_sender="com.canonical.landscape.Broker" />
87-
88- <deny send_destination="com.canonical.landscape.Monitor" />
89- <deny receive_sender="com.canonical.landscape.Monitor" />
90-
91- <deny send_destination="com.canonical.landscape.Manager" />
92- <deny receive_sender="com.canonical.landscape.Manager" />
93-
94- </policy>
95-
96-</busconfig>
97
98=== modified file 'debian/control'
99--- debian/control 2011-01-31 11:04:34 +0000
100+++ debian/control 2011-12-02 09:56:24 +0000
101@@ -12,15 +12,14 @@
102 Depends: ${python:Depends}, ${misc:Depends}, ${extra:Depends},
103 python-gnupginterface,
104 python-twisted-core,
105- python-gobject,
106 python-apt,
107 ca-certificates,
108- perl-modules,
109 python-gdbm,
110 lsb-release,
111 lsb-base,
112 adduser,
113- bc
114+ bc,
115+ lshw
116 Suggests: ${extra:Suggests}
117 Replaces: landscape-client (<= 1.0.23-0ubuntu0.8.10)
118 Description: The Landscape administration system client
119
120=== modified file 'debian/landscape-client.install'
121--- debian/landscape-client.install 2010-06-10 13:30:58 +0000
122+++ debian/landscape-client.install 2011-12-02 09:56:24 +0000
123@@ -8,7 +8,5 @@
124 usr/bin/landscape-package-reporter
125 usr/bin/landscape-release-upgrader
126 usr/bin/landscape-is-cloud-managed
127-usr/bin/landscape-dbus-proxy
128 usr/share/landscape/cloud-default.conf
129-etc/dbus-1/system.d/landscape.conf
130 usr/lib/landscape
131
132=== modified file 'debian/landscape-client.postinst'
133--- debian/landscape-client.postinst 2011-11-04 11:42:10 +0000
134+++ debian/landscape-client.postinst 2011-12-02 09:56:24 +0000
135@@ -123,17 +123,6 @@
136 if [ -e $very_old_cron_job ]; then
137 rm $very_old_cron_job
138 fi
139-
140- # Check if we're upgrading from a D-Bus version
141- if ! [ -z $2 ]; then
142- if dpkg --compare-versions $2 lt 1.5.1; then
143- # Launch a proxy service that will forward requests over DBus
144- # from the old package-changer to the new AMP-based broker. This
145- # is a one-off only needed for the DBus->AMP upgrade
146- start-stop-daemon -x /usr/bin/landscape-dbus-proxy -b -c landscape -u landscape -S
147- fi
148- fi
149-
150 ;;
151
152 abort-upgrade|abort-remove|abort-deconfigure)
153
154=== modified file 'debian/rules'
155--- debian/rules 2011-11-04 11:42:10 +0000
156+++ debian/rules 2011-12-02 09:56:24 +0000
157@@ -60,7 +60,6 @@
158 install -D -o root -g root -m 644 debian/cloud-default.conf $(root_dir)/usr/share/landscape/cloud-default.conf
159 install -D -o root -g root -m 755 smart-update/smart-update $(root_dir)/usr/lib/landscape/smart-update
160 install -D -o root -g root -m 755 apt-update/apt-update $(root_dir)/usr/lib/landscape/apt-update
161- install -D -o root -g root -m 644 dbus/landscape.conf $(root_dir)/etc/dbus-1/system.d/landscape.conf
162
163 binary-indep:
164 # do nothing
165@@ -84,24 +83,22 @@
166
167 ifneq (,$(findstring $(dist_release),"dapper"))
168 # We need python2.4-pysqlite2 and a non-buggy libcurl3-gnutls on dapper
169- echo "extra:Depends=python2.4-pysqlite2, libcurl3-gnutls (>= 7.15.1-1ubuntu3), python-smartpm (>= 1.1.1~bzr20081010-0ubuntu1.6.06.0), python2.4-dbus" >> $(landscape_common_substvars)
170- echo "extra:Depends=python2.4-pycurl, hal" >> $(landscape_client_substvars)
171+ echo "extra:Depends=python2.4-pysqlite2, libcurl3-gnutls (>= 7.15.1-1ubuntu3), python-smartpm (>= 1.1.1~bzr20081010-0ubuntu1.6.06.0)" >> $(landscape_common_substvars)
172+ echo "extra:Depends=python2.4-pycurl" >> $(landscape_client_substvars)
173 endif
174 ifneq (,$(findstring $(dist_release),"hardy"))
175 # We want the smart 1.1.1 from the Landscape repository on hardy
176- echo "extra:Depends=python-smartpm (>= 1.1.1~bzr20081010-0ubuntu1.8.04.1), python-dbus" >> $(landscape_common_substvars)
177- echo "extra:Depends=python-pycurl, hal" >> $(landscape_client_substvars)
178+ echo "extra:Depends=python-smartpm (>= 1.1.1~bzr20081010-0ubuntu1.8.04.1)" >> $(landscape_common_substvars)
179+ echo "extra:Depends=python-pycurl" >> $(landscape_client_substvars)
180 endif
181 ifneq (,$(filter $(dist_release),karmic lucid maverick))
182 # We want libpam-modules in karmic, and smart 1.2
183- echo "extra:Depends=libpam-modules (>= 1.0.1-9ubuntu3), python-smartpm (>= 1.2-4), python-dbus" >> $(landscape_common_substvars)
184- echo "extra:Depends=python-pycurl, hal" >> $(landscape_client_substvars)
185+ echo "extra:Depends=libpam-modules (>= 1.0.1-9ubuntu3), python-smartpm (>= 1.2-4)" >> $(landscape_common_substvars)
186+ echo "extra:Depends=python-pycurl" >> $(landscape_client_substvars)
187 endif
188 ifeq (,$(filter $(dist_release),dapper hardy karmic lucid maverick))
189- # Starting natty, no more hal or dbus
190 echo "extra:Depends=libpam-modules (>= 1.0.1-9ubuntu3), python-smartpm (>= 1.2-4)" >> $(landscape_common_substvars)
191 echo "extra:Depends=python-pycurl, gir1.2-gudev-1.0 (>= 165-0ubuntu2)" >> $(landscape_client_substvars)
192- echo "extra:Suggests=python-dbus, hal" >> $(landscape_client_substvars)
193 endif
194 ifeq (,$(filter $(dist_release),dapper hardy karmic))
195 # The python-image-store-proxy package is needed for the eucalyptus plugin
196
197=== modified file 'landscape/broker/exchange.py'
198--- landscape/broker/exchange.py 2011-07-18 13:35:59 +0000
199+++ landscape/broker/exchange.py 2011-12-02 09:56:24 +0000
200@@ -422,9 +422,7 @@
201 handler(message)
202
203 def register_client_accepted_message_type(self, type):
204- # stringify the type because it's a dbus.String. It should work
205- # anyway, but this is just for sanity and less confusing logs.
206- self._client_accepted_types.add(str(type))
207+ self._client_accepted_types.add(type)
208
209 def get_client_accepted_message_types(self):
210 return sorted(self._client_accepted_types)
211
212=== modified file 'landscape/configuration.py'
213--- landscape/configuration.py 2011-11-11 12:34:57 +0000
214+++ landscape/configuration.py 2011-12-02 09:56:24 +0000
215@@ -541,10 +541,6 @@
216 connector.disconnect()
217
218 def catch_all(failure):
219- # We catch SecurityError here too, because on some DBUS configurations
220- # if you try to connect to a dbus name that doesn't have a listener,
221- # it'll try auto-starting the service, but then the StartServiceByName
222- # call can raise a SecurityError.
223 print_text(failure.getTraceback(), error=True)
224 print_text("Unknown error occurred.", error=True)
225 stop()
226
227=== removed file 'landscape/hal.py'
228--- landscape/hal.py 2011-06-13 23:58:09 +0000
229+++ landscape/hal.py 1970-01-01 00:00:00 +0000
230@@ -1,52 +0,0 @@
231-import logging
232-
233-from dbus import Interface, SystemBus
234-from dbus.exceptions import DBusException
235-
236-
237-class HALManager(object):
238-
239- def __init__(self, bus=None):
240- try:
241- self._bus = bus or SystemBus()
242- manager = self._bus.get_object("org.freedesktop.Hal",
243- "/org/freedesktop/Hal/Manager")
244- except DBusException:
245- logging.error("Couldn't to connect to Hal via DBus")
246- self._manager = None
247- else:
248- self._manager = Interface(manager, "org.freedesktop.Hal.Manager")
249-
250- def get_devices(self):
251- """Returns a list of HAL devices.
252-
253- @note: If it wasn't possible to connect to HAL over DBus, then an
254- empty list will be returned. This can happen if the HAL or DBus
255- services are not running.
256- """
257- if not self._manager:
258- return []
259- devices = []
260- for udi in self._manager.GetAllDevices():
261- device = self._bus.get_object("org.freedesktop.Hal", udi)
262- device = Interface(device, "org.freedesktop.Hal.Device")
263- device = HALDevice(device)
264- devices.append(device)
265- return devices
266-
267-
268-class HALDevice(object):
269-
270- def __init__(self, device):
271- self._children = []
272- self._device = device
273- self.properties = device.GetAllProperties()
274- self.udi = self.properties["info.udi"]
275- self.parent = None
276-
277- def add_child(self, device):
278- self._children.append(device)
279- device.parent = self
280-
281- def get_children(self):
282- return self._children
283
284=== removed file 'landscape/lib/bpickle_dbus.py'
285--- landscape/lib/bpickle_dbus.py 2008-06-10 10:56:01 +0000
286+++ landscape/lib/bpickle_dbus.py 1970-01-01 00:00:00 +0000
287@@ -1,63 +0,0 @@
288-"""
289-Different versions of the Python DBus bindings return different types
290-to represent integers, strings, lists, etc. Older versions return
291-builtin Python types: C{int}, C{str}, C{list}, etc. Newer versions
292-return DBus-specific wrappers: C{Int16}, C{String}, C{Array}, etc.
293-Failures occur when DBus types are used because bpickle doesn't know
294-that an C{Int16} is really an C{int} and that an C{Array} is really a
295-C{list}.
296-
297-L{install} and L{uninstall} can install and remove extensions that
298-make bpickle work with DBus types.
299-"""
300-
301-import dbus
302-
303-from landscape.lib import bpickle
304-
305-
306-def install():
307- """Install bpickle extensions for DBus types."""
308- for type, function in get_dbus_types():
309- bpickle.dumps_table[type] = function
310-
311-
312-def uninstall():
313- """Uninstall bpickle extensions for DBus types."""
314- for type, function in get_dbus_types():
315- del bpickle.dumps_table[type]
316-
317-
318-def dumps_utf8string(obj):
319- """
320- Convert the specified L{dbus.types.UTF8String} to bpickle's
321- representation for C{unicode} data.
322- """
323- return "u%s:%s" % (len(obj), obj)
324-
325-def dumps_double(obj):
326- """
327- Convert a dbus.types.Double into a floating point representation.
328- """
329- return "f%r;" % float(obj)
330-
331-def get_dbus_types():
332- """
333- Generator yields C{(type, bpickle_function)} for available DBus
334- types.
335- """
336- for (type_name, function) in [("Boolean", bpickle.dumps_bool),
337- ("Int16", bpickle.dumps_int),
338- ("UInt16", bpickle.dumps_int),
339- ("Int32", bpickle.dumps_int),
340- ("UInt32", bpickle.dumps_int),
341- ("Int64", bpickle.dumps_int),
342- ("UInt64", bpickle.dumps_int),
343- ("Double", dumps_double),
344- ("Array", bpickle.dumps_list),
345- ("Dictionary", bpickle.dumps_dict),
346- ("String", bpickle.dumps_unicode),
347- ("UTF8String", dumps_utf8string),]:
348- type = getattr(dbus.types, type_name, None)
349- if type is not None:
350- yield type, function
351
352=== removed file 'landscape/lib/tests/test_bpickle_dbus.py'
353--- landscape/lib/tests/test_bpickle_dbus.py 2011-07-05 05:09:11 +0000
354+++ landscape/lib/tests/test_bpickle_dbus.py 1970-01-01 00:00:00 +0000
355@@ -1,75 +0,0 @@
356-import unittest
357-
358-from dbus.types import Double
359-
360-from landscape.lib import bpickle
361-from landscape.lib.bpickle_dbus import install, uninstall, dumps_utf8string
362-
363-
364-original = dict(bpickle.dumps_table)
365-
366-
367-class DBusBPickleExtensionsTest(unittest.TestCase):
368-
369- def tearDown(self):
370- # Mutate the original object back to the original version
371- # because rebinding it will cause bizarre failures.
372- bpickle.dumps_table.clear()
373- bpickle.dumps_table.update(original)
374-
375- def test_install(self):
376- """
377- Installing bpickle extensions for DBus types should add to the
378- existing table. Existing bpickle mappings shouldn't be
379- changed.
380- """
381- install()
382- self.assertNotEquals(original, bpickle.dumps_table)
383- pre = set(original.iteritems())
384- post = set(bpickle.dumps_table.iteritems())
385- self.assertTrue(pre.issubset(post))
386-
387- def test_uninstall(self):
388- """
389- Uninstalling bpickle extensions for DBus types should remove
390- whatever was added during installation. Extensions installed
391- by external components should not be affected by this
392- operation.
393- """
394- install()
395- self.assertFalse(object in bpickle.dumps_table)
396- bpickle.dumps_table[object] = lambda obj: None
397-
398- uninstall()
399- pre = set(original.iteritems())
400- post = set(bpickle.dumps_table.iteritems())
401- self.assertTrue(pre.issubset(post))
402- self.assertTrue(object in bpickle.dumps_table)
403- self.assertTrue(len(original) + 1, len(bpickle.dumps_table))
404-
405- def test_dumps_utf8string(self):
406- """
407- Dumping a L{dbus.types.UTF8String} should produce the same
408- bpickle output as would be produced for a C{unicode} value.
409- """
410- try:
411- from dbus.types import UTF8String
412-
413- value = UTF8String("")
414- self.assertEqual(dumps_utf8string(value), "u0:")
415- value = UTF8String("Charlie!")
416- self.assertEqual(dumps_utf8string(value), "u8:Charlie!")
417- except ImportError:
418- pass
419-
420- def test_dumps_double(self):
421- """
422- Dumping and restoring a L{dbus.types.Double} should result in the
423- same value.
424- """
425- install()
426- try:
427- value = Double(480.0, variant_level=1)
428- except TypeError:
429- value = Double(480.0)
430- self.assertAlmostEquals(bpickle.loads(bpickle.dumps(value)), 480.0)
431
432=== modified file 'landscape/manager/config.py'
433--- landscape/manager/config.py 2011-04-14 09:58:34 +0000
434+++ landscape/manager/config.py 2011-12-02 09:56:24 +0000
435@@ -5,7 +5,7 @@
436
437
438 ALL_PLUGINS = ["ProcessKiller", "PackageManager", "UserManager",
439- "ShutdownManager", "Eucalyptus", "AptSources"]
440+ "ShutdownManager", "Eucalyptus", "AptSources", "HardwareInfo"]
441
442
443 class ManagerConfiguration(Configuration):
444
445=== added file 'landscape/manager/hardwareinfo.py'
446--- landscape/manager/hardwareinfo.py 1970-01-01 00:00:00 +0000
447+++ landscape/manager/hardwareinfo.py 2011-12-02 09:56:24 +0000
448@@ -0,0 +1,27 @@
449+import os
450+
451+from twisted.internet.utils import getProcessOutput
452+
453+from landscape.manager.plugin import ManagerPlugin
454+
455+
456+class HardwareInfo(ManagerPlugin):
457+ """A plugin to retrieve hardware information."""
458+
459+ message_type = "hardware-info"
460+ run_interval = 60 * 60 * 24
461+ run_immediately = True
462+ command = "/usr/bin/lshw"
463+
464+ def run(self):
465+ return self.registry.broker.call_if_accepted(
466+ self.message_type, self.send_message)
467+
468+ def send_message(self):
469+ result = getProcessOutput(
470+ self.command, args=["-xml", "-quiet"], env=os.environ, path=None)
471+ return result.addCallback(self._got_output)
472+
473+ def _got_output(self, output):
474+ message = {"type": self.message_type, "data": output}
475+ return self.registry.broker.send_message(message)
476
477=== modified file 'landscape/manager/tests/test_config.py'
478--- landscape/manager/tests/test_config.py 2011-07-05 05:09:11 +0000
479+++ landscape/manager/tests/test_config.py 2011-12-02 09:56:24 +0000
480@@ -12,7 +12,8 @@
481 def test_plugin_factories(self):
482 """By default all plugins are enabled."""
483 self.assertEqual(["ProcessKiller", "PackageManager", "UserManager",
484- "ShutdownManager", "Eucalyptus", "AptSources"],
485+ "ShutdownManager", "Eucalyptus", "AptSources",
486+ "HardwareInfo"],
487 ALL_PLUGINS)
488 self.assertEqual(ALL_PLUGINS, self.config.plugin_factories)
489
490
491=== added file 'landscape/manager/tests/test_hardwareinfo.py'
492--- landscape/manager/tests/test_hardwareinfo.py 1970-01-01 00:00:00 +0000
493+++ landscape/manager/tests/test_hardwareinfo.py 2011-12-02 09:56:24 +0000
494@@ -0,0 +1,29 @@
495+from landscape.tests.helpers import LandscapeTest, ManagerHelper
496+
497+from landscape.manager.hardwareinfo import HardwareInfo
498+
499+
500+class HardwareInfoTests(LandscapeTest):
501+ helpers = [ManagerHelper]
502+
503+ def setUp(self):
504+ super(HardwareInfoTests, self).setUp()
505+ self.info = HardwareInfo()
506+ self.info.command = "/bin/echo"
507+ self.manager.add(self.info)
508+
509+ service = self.broker_service
510+ service.message_store.set_accepted_types(["hardware-info"])
511+
512+ def test_message(self):
513+ """
514+ L{HardwareInfo} sends the output of its command when running.
515+ """
516+ deferred = self.info.run()
517+
518+ def check(ignored):
519+ self.assertMessages(
520+ self.broker_service.message_store.get_pending_messages(),
521+ [{"data": u"-xml -quiet\n", "type": "hardware-info"}])
522+
523+ return deferred.addCallback(check)
524
525=== modified file 'landscape/manager/tests/test_service.py'
526--- landscape/manager/tests/test_service.py 2011-07-05 05:09:11 +0000
527+++ landscape/manager/tests/test_service.py 2011-12-02 09:56:24 +0000
528@@ -1,4 +1,3 @@
529-from landscape.tests.mocker import ANY
530 from landscape.tests.helpers import (
531 LandscapeTest, FakeBrokerServiceHelper)
532 from landscape.reactor import FakeReactor
533@@ -42,15 +41,10 @@
534 The L{ManagerService.startService} method connects to the broker,
535 starts the plugins and register the manager as broker client.
536 """
537- # FIXME: don't actually run the real register method, because at the
538- # moment the UserManager plugin still depends on DBus. We can probably
539- # drop this mocking once the AMP migration is completed.
540- for plugin in self.service.plugins:
541- plugin.register = self.mocker.mock()
542- plugin.register(ANY)
543- self.mocker.replay()
544-
545 def stop_service(ignored):
546+ for plugin in self.service.plugins:
547+ if getattr(plugin, "stop", None) is not None:
548+ plugin.stop()
549 [connector] = self.broker_service.broker.get_connectors()
550 connector.disconnect()
551 self.service.stopService()
552
553=== modified file 'landscape/message_schemas.py'
554--- landscape/message_schemas.py 2011-11-11 12:30:53 +0000
555+++ landscape/message_schemas.py 2011-12-02 09:56:24 +0000
556@@ -99,6 +99,10 @@
557 )})
558
559
560+HARDWARE_INFO = Message("hardware-info", {
561+ "data": utf8})
562+
563+
564 LOAD_AVERAGE = Message("load-average", {
565 "load-averages": List(Tuple(Int(), Float())),
566 })
567@@ -392,7 +396,7 @@
568 message_schemas = {}
569 for schema in [ACTIVE_PROCESS_INFO, COMPUTER_UPTIME, CLIENT_UPTIME,
570 OPERATION_RESULT, COMPUTER_INFO, DISTRIBUTION_INFO,
571- HARDWARE_INVENTORY, LOAD_AVERAGE, MEMORY_INFO,
572+ HARDWARE_INVENTORY, HARDWARE_INFO, LOAD_AVERAGE, MEMORY_INFO,
573 RESYNCHRONIZE, MOUNT_ACTIVITY, MOUNT_INFO, FREE_SPACE,
574 REGISTER, REGISTER_CLOUD_VM, REGISTER_PROVISIONED_MACHINE,
575 TEMPERATURE, PROCESSOR_INFO, USERS, PACKAGES, PACKAGE_LOCKS,
576
577=== modified file 'landscape/monitor/config.py'
578--- landscape/monitor/config.py 2010-05-04 17:23:45 +0000
579+++ landscape/monitor/config.py 2011-12-02 09:56:24 +0000
580@@ -1,11 +1,10 @@
581 from landscape.deployment import Configuration
582
583
584-ALL_PLUGINS = ["ActiveProcessInfo", "ComputerInfo", "HardwareInventory",
585- "LoadAverage", "MemoryInfo", "MountInfo", "ProcessorInfo",
586- "Temperature", "PackageMonitor", "UserMonitor",
587- "RebootRequired", "AptPreferences", "NetworkActivity",
588- "NetworkDevice"]
589+ALL_PLUGINS = ["ActiveProcessInfo", "ComputerInfo", "LoadAverage",
590+ "MemoryInfo", "MountInfo", "ProcessorInfo", "Temperature",
591+ "PackageMonitor", "UserMonitor", "RebootRequired",
592+ "AptPreferences", "NetworkActivity", "NetworkDevice"]
593
594
595 class MonitorConfiguration(Configuration):
596
597=== removed file 'landscape/monitor/hardwareinventory.py'
598--- landscape/monitor/hardwareinventory.py 2011-01-28 09:37:10 +0000
599+++ landscape/monitor/hardwareinventory.py 1970-01-01 00:00:00 +0000
600@@ -1,114 +0,0 @@
601-import logging
602-
603-from twisted.internet.defer import succeed
604-
605-from landscape.lib.log import log_failure
606-
607-from landscape.diff import diff
608-from landscape.monitor.plugin import MonitorPlugin
609-
610-
611-class HardwareInventory(MonitorPlugin):
612-
613- persist_name = "hardware-inventory"
614-
615- def __init__(self, hal_manager=None):
616- super(HardwareInventory, self).__init__()
617- self._persist_sets = []
618- self._persist_removes = []
619- self.enabled = True
620- try:
621- from landscape.hal import HALManager
622- except ImportError:
623- self.enabled = False
624- else:
625- self._hal_manager = hal_manager or HALManager()
626-
627- def register(self, manager):
628- if not self.enabled:
629- return
630- super(HardwareInventory, self).register(manager)
631- self.call_on_accepted("hardware-inventory", self.exchange, True)
632-
633- def send_message(self, urgent):
634- devices = self.create_message()
635- if devices:
636- message = {"type": "hardware-inventory", "devices": devices}
637- result = self.registry.broker.send_message(message, urgent=urgent)
638- result.addCallback(self.persist_data)
639- result.addErrback(log_failure)
640- logging.info("Queueing a message with hardware-inventory "
641- "information.")
642- else:
643- result = succeed(None)
644- return result
645-
646- def exchange(self, urgent=False):
647- if not self.enabled:
648- return
649- return self.registry.broker.call_if_accepted("hardware-inventory",
650- self.send_message, urgent)
651-
652- def persist_data(self, message_id):
653- for key, udi, value in self._persist_sets:
654- self._persist.set((key, udi), value)
655- for key in self._persist_removes:
656- self._persist.remove(key)
657- del self._persist_sets[:]
658- del self._persist_removes[:]
659- # This forces the registry to write the persistent store to disk
660- # This means that the persistent data reflects the state of the
661- # messages sent.
662- self.registry.flush()
663-
664- def create_message(self):
665- # FIXME Using persist to keep track of changes here uses a
666- # fair amount of memory. On my machine a rough test seemed to
667- # indicate that memory usage grew by 1.3mb, about 12% of the
668- # overall process size. Look here to save memory.
669- del self._persist_sets[:]
670- del self._persist_removes[:]
671- devices = []
672- previous_devices = self._persist.get("devices", {})
673- current_devices = set()
674-
675- for device in self._hal_manager.get_devices():
676- previous_properties = previous_devices.get(device.udi)
677- if not previous_properties:
678- devices.append(("create", device.properties))
679- elif previous_properties != device.properties:
680- creates, updates, deletes = diff(previous_properties,
681- device.properties)
682- devices.append(("update", device.udi,
683- creates, updates, deletes))
684- current_devices.add(device.udi)
685- self._persist_sets.append(
686- ("devices", device.udi, device.properties))
687-
688- items_with_parents = {}
689- deleted_devices = set()
690- for udi, value in previous_devices.iteritems():
691- if udi not in current_devices:
692- if "info.parent" in value:
693- items_with_parents[udi] = value["info.parent"]
694- deleted_devices.add(udi)
695-
696- # We remove the deleted devices from our persistent store it's
697- # only the information we're sending to the server that we're
698- # compressing.
699- for udi in deleted_devices:
700- self._persist_removes.append(("devices", udi))
701-
702- # We can now flatten the list of devices we send to the server
703- # For each of the items_with_parents, if both the item and it's parent
704- # are in the deleted_devices set, then we can remove this item from the
705- # set.
706- minimal_deleted_devices = deleted_devices.copy()
707- for child, parent in items_with_parents.iteritems():
708- if child in deleted_devices and parent in deleted_devices:
709- minimal_deleted_devices.remove(child)
710- # We now build the deleted devices message
711- for udi in minimal_deleted_devices:
712- devices.append(("delete", udi))
713-
714- return devices
715
716=== modified file 'landscape/monitor/mountinfo.py'
717--- landscape/monitor/mountinfo.py 2011-04-08 09:01:42 +0000
718+++ landscape/monitor/mountinfo.py 2011-12-02 09:56:24 +0000
719@@ -15,7 +15,7 @@
720
721 def __init__(self, interval=300, monitor_interval=60 * 60,
722 mounts_file="/proc/mounts", create_time=time.time,
723- statvfs=None, hal_manager=None, mtab_file="/etc/mtab"):
724+ statvfs=None, mtab_file="/etc/mtab"):
725 self.run_interval = interval
726 self._monitor_interval = monitor_interval
727 self._create_time = create_time
728@@ -29,12 +29,6 @@
729 self._mount_info = []
730 self._mount_info_to_persist = None
731 try:
732- from landscape.hal import HALManager
733- except ImportError:
734- self._hal_manager = hal_manager
735- else:
736- self._hal_manager = hal_manager or HALManager()
737- try:
738 from gi.repository import GUdev
739 except ImportError:
740 self._gudev_client = None
741@@ -122,9 +116,7 @@
742 current_mount_points.add(mount_point)
743
744 def _get_removable_devices(self):
745- if self._hal_manager is not None:
746- return self._get_hal_removable_devices()
747- elif self._gudev_client is not None:
748+ if self._gudev_client is not None:
749 return self._get_udev_removable_devices()
750 else:
751 return set()
752@@ -138,61 +130,6 @@
753 return False
754 return is_removable()
755
756- def _get_hal_removable_devices(self):
757- block_devices = {} # {udi: [device, ...]}
758- children = {} # {parent_udi: [child_udi, ...]}
759- removable = set()
760-
761- # We walk the list of devices building up a dictionary of all removable
762- # devices, and a mapping of {UDI => [block devices]}
763- # We differentiate between devices that we definitely know are
764- # removable and devices that _may_ be removable, depending on their
765- # parent device, e.g. /dev/sdb1 isn't flagged as removable, but
766- # /dev/sdb may well be removable.
767-
768- # Unfortunately, HAL doesn't guarantee the order of the devices
769- # returned from get_devices(), so we may not know that a parent device
770- # is removable when we find it's first child.
771- devices = self._hal_manager.get_devices()
772- for device in devices:
773- block_device = device.properties.get("block.device")
774- if block_device:
775- if device.properties.get("storage.removable"):
776- removable.add(device.udi)
777-
778- try:
779- block_devices[device.udi].append(block_device)
780- except KeyError:
781- block_devices[device.udi] = [block_device]
782-
783- parent_udi = device.properties.get("info.parent")
784- if parent_udi is not None:
785- try:
786- children[parent_udi].append(device.udi)
787- except KeyError:
788- children[parent_udi] = [device.udi]
789-
790- # Propagate the removable flag from each node all the way to
791- # its leaf children.
792- updated = True
793- while updated:
794- updated = False
795- for parent_udi in children:
796- if parent_udi in removable:
797- for child_udi in children[parent_udi]:
798- if child_udi not in removable:
799- removable.add(child_udi)
800- updated = True
801-
802- # We've now seen _all_ devices, and have the definitive list of
803- # removable UDIs, so we can now find all the removable devices in the
804- # system.
805- removable_devices = set()
806- for udi in removable:
807- removable_devices.update(block_devices[udi])
808-
809- return removable_devices
810-
811 def _get_mount_info(self):
812 """Generator yields local mount points worth recording data for."""
813 removable_devices = self._get_removable_devices()
814
815=== removed file 'landscape/monitor/tests/test_hardwareinventory.py'
816--- landscape/monitor/tests/test_hardwareinventory.py 2011-07-05 05:09:11 +0000
817+++ landscape/monitor/tests/test_hardwareinventory.py 1970-01-01 00:00:00 +0000
818@@ -1,273 +0,0 @@
819-from twisted.internet.defer import fail, succeed
820-
821-from landscape.monitor.hardwareinventory import HardwareInventory
822-from landscape.tests.test_hal import MockHALManager, MockRealHALDevice
823-from landscape.tests.helpers import LandscapeTest, MonitorHelper
824-from landscape.tests.mocker import ANY
825-from landscape.message_schemas import HARDWARE_INVENTORY
826-
827-
828-class HardwareInventoryTest(LandscapeTest):
829-
830- helpers = [MonitorHelper]
831-
832- def setUp(self):
833- super(HardwareInventoryTest, self).setUp()
834- self.mstore.set_accepted_types(["hardware-inventory"])
835- devices = [MockRealHALDevice({u"info.udi": u"wubble",
836- u"info.product": u"Wubble"}),
837- MockRealHALDevice({u"info.udi": u"ooga",
838- u"info.product": u"Ooga"})]
839- self.hal_manager = MockHALManager(devices)
840- self.plugin = HardwareInventory(hal_manager=self.hal_manager)
841- self.monitor.add(self.plugin)
842-
843- def assertSchema(self, devices):
844- full_message = {"type": "hardware-inventory", "devices": devices}
845- self.assertEqual(HARDWARE_INVENTORY.coerce(full_message),
846- full_message)
847-
848- def test_hal_devices(self):
849- """
850- The first time the plugin runs it should report information
851- about all HAL devices found on the system. Every UDI provided
852- by HAL should be present in the devices list as is from HAL.
853- """
854- message = self.plugin.create_message()
855- actual_udis = [part[1][u"info.udi"] for part in message]
856- expected_udis = [device.udi for device
857- in self.hal_manager.get_devices()]
858- self.assertEqual(set(actual_udis), set(expected_udis))
859-
860- def test_first_message(self):
861- """
862- The first time the plugin runs it should report information
863- about all HAL devices found on the system. All new devices
864- will be reported with 'create' actions.
865- """
866- message = self.plugin.create_message()
867- actions = [part[0] for part in message]
868- self.assertEqual(set(actions), set(["create"]))
869- self.assertSchema(message)
870-
871- def test_no_changes(self):
872- """
873- Messages should not be created if hardware information is
874- unchanged since the last server exchange.
875- """
876- self.plugin.exchange()
877- self.assertNotEquals(len(self.mstore.get_pending_messages()), 0)
878-
879- messages = self.mstore.get_pending_messages()
880- self.plugin.exchange()
881- self.assertEqual(self.mstore.get_pending_messages(), messages)
882-
883- def test_update(self):
884- """
885- If a change is detected for a device that was previously
886- reported to the server, the changed device should be reported
887- with an 'update' action. Property changes are reported at a
888- key/value pair level.
889- """
890- self.hal_manager.devices = [
891- MockRealHALDevice({u"info.udi": u"wubble",
892- u"info.product": u"Wubble"})]
893- registry_mocker = self.mocker.replace(self.plugin.registry)
894- registry_mocker.flush()
895- self.mocker.count(2)
896- self.mocker.result(None)
897- self.mocker.replay()
898- message = self.plugin.create_message()
899- self.plugin.persist_data(None)
900- self.assertEqual(message, [("create", {u"info.udi": u"wubble",
901- u"info.product": u"Wubble"})])
902-
903- self.hal_manager.devices[0] = MockRealHALDevice(
904- {u"info.udi": u"wubble", u"info.product": u"Ooga"})
905- message = self.plugin.create_message()
906- self.plugin.persist_data(None)
907- self.assertEqual(message, [("update", u"wubble",
908- {}, {u"info.product": u"Ooga"}, {})])
909- self.assertSchema(message)
910- self.assertEqual(self.plugin.create_message(), [])
911-
912- def test_update_list(self):
913- """
914- An update should be sent to the server when a strlist device
915- property changes. No updates should be sent if a device is
916- unchanged.
917- """
918- self.hal_manager.devices = [
919- MockRealHALDevice({u"info.udi": u"wubble",
920- u"info.product": u"Wubble",
921- u"info.capabilities": [u"foo", u"bar"]})]
922-
923- message = self.plugin.create_message()
924- self.plugin.persist_data(None)
925- self.assertEqual(message, [("create",
926- {u"info.udi": u"wubble",
927- u"info.product": u"Wubble",
928- u"info.capabilities": [u"foo", u"bar"]}),
929- ])
930-
931- self.assertSchema(message)
932-
933- self.hal_manager.devices[0] = MockRealHALDevice(
934- {u"info.udi": u"wubble", u"info.product": u"Wubble",
935- u"info.capabilities": [u"foo"]})
936- message = self.plugin.create_message()
937- self.plugin.persist_data(None)
938- self.assertEqual(message, [("update", u"wubble",
939- {}, {u"info.capabilities": [u"foo"]}, {}),
940- ])
941- self.assertSchema(message)
942-
943- self.assertEqual(self.plugin.create_message(), [])
944-
945- def test_update_complex(self):
946- """
947- The 'update' action reports property create, update and
948- delete changes.
949- """
950- self.hal_manager.devices = [
951- MockRealHALDevice({u"info.udi": u"wubble",
952- u"info.product": u"Wubble",
953- u"linux.acpi_type": 11})]
954-
955- message = self.plugin.create_message()
956- self.plugin.persist_data(None)
957- self.assertEqual(message, [("create", {u"info.udi": u"wubble",
958- u"info.product": u"Wubble",
959- u"linux.acpi_type": 11})])
960-
961- self.hal_manager.devices[0] = MockRealHALDevice(
962- {u"info.udi": u"wubble", u"info.product": u"Ooga",
963- u"info.category": u"unittest"})
964- message = self.plugin.create_message()
965- self.plugin.persist_data(None)
966- self.assertEqual(message, [("update", u"wubble",
967- {u"info.category": u"unittest"},
968- {u"info.product": u"Ooga"},
969- {u"linux.acpi_type": 11})])
970- self.assertSchema(message)
971-
972- self.assertEqual(self.plugin.create_message(), [])
973-
974- def test_delete(self):
975- """
976- If a device that was previously reported is no longer present
977- in a system a device entry should be created with a 'delete'
978- action.
979- """
980- self.hal_manager.devices = [
981- MockRealHALDevice({u"info.udi": u"wubble",
982- u"info.product": u"Wubble"}),
983- MockRealHALDevice({u"info.udi": u"ooga",
984- u"info.product": u"Ooga"})]
985-
986- message = self.plugin.create_message()
987- self.plugin.persist_data(None)
988- self.assertEqual(message, [("create", {u"info.udi": u"wubble",
989- u"info.product": u"Wubble"}),
990- ("create", {u"info.udi": u"ooga",
991- u"info.product": u"Ooga"})])
992- self.assertSchema(message)
993-
994- self.hal_manager.devices.pop(1)
995- message = self.plugin.create_message()
996- self.plugin.persist_data(None)
997- self.assertEqual(message, [("delete", u"ooga")])
998- self.assertSchema(message)
999- self.assertEqual(self.plugin.create_message(), [])
1000-
1001- def test_minimal_delete(self):
1002- self.hal_manager.devices = [
1003- MockRealHALDevice({u"info.udi": u"wubble",
1004- u"block.device": u"/dev/scd",
1005- u"storage.removable": True}),
1006- MockRealHALDevice({u"info.udi": u"wubble0",
1007- u"block.device": u"/dev/scd0",
1008- u"info.parent": u"wubble"}),
1009- MockRealHALDevice({u"info.udi": u"wubble1",
1010- u"block.device": u"/dev/scd1",
1011- u"info.parent": u"wubble"}),
1012- MockRealHALDevice({u"info.udi": u"wubble2",
1013- u"block.device": u"/dev/scd1",
1014- u"info.parent": u"wubble0"}),
1015- MockRealHALDevice({u"info.udi": u"wubble3",
1016- u"block.device": u"/dev/scd1",
1017- u"info.parent": u"wubble2"})]
1018-
1019- message = self.plugin.create_message()
1020- self.plugin.persist_data(None)
1021-
1022- del self.hal_manager.devices[:]
1023-
1024- message = self.plugin.create_message()
1025- self.plugin.persist_data(None)
1026-
1027- self.assertEqual(message, [("delete", u"wubble")])
1028- self.assertEqual(self.plugin.create_message(), [])
1029-
1030- def test_resynchronize(self):
1031- """
1032- If a 'resynchronize' reactor event is fired, the plugin should
1033- send a message that contains all data as if the server has
1034- none.
1035- """
1036- self.plugin.exchange()
1037- self.reactor.fire("resynchronize")
1038- self.plugin.exchange()
1039-
1040- messages = self.mstore.get_pending_messages()
1041- self.assertEqual(len(messages), 2)
1042- self.assertEqual(messages[0]["devices"], messages[1]["devices"])
1043-
1044- def test_call_on_accepted(self):
1045- remote_broker_mock = self.mocker.replace(self.remote)
1046- remote_broker_mock.send_message(ANY, urgent=True)
1047- self.mocker.result(succeed(None))
1048- self.mocker.replay()
1049-
1050- self.reactor.fire(("message-type-acceptance-changed",
1051- "hardware-inventory"),
1052- True)
1053-
1054- def test_no_message_if_not_accepted(self):
1055- """
1056- Don't add any messages at all if the broker isn't currently
1057- accepting their type.
1058- """
1059- self.mstore.set_accepted_types([])
1060- self.reactor.advance(self.monitor.step_size * 2)
1061- self.monitor.exchange()
1062-
1063- self.mstore.set_accepted_types(["hardware-inventory"])
1064- self.assertMessages(list(self.mstore.get_pending_messages()), [])
1065-
1066- def test_do_not_persist_changes_when_send_message_fails(self):
1067- """
1068- When the plugin is run it persists data that it uses on
1069- subsequent checks to calculate the delta to send. It should
1070- only persist data when the broker confirms that the message
1071- sent by the plugin has been sent.
1072- """
1073-
1074- class MyException(Exception):
1075- pass
1076-
1077- self.log_helper.ignore_errors(MyException)
1078-
1079- broker_mock = self.mocker.replace(self.monitor.broker)
1080- broker_mock.send_message(ANY, urgent=ANY)
1081- self.mocker.result(fail(MyException()))
1082- self.mocker.replay()
1083-
1084- message = self.plugin.create_message()
1085-
1086- def assert_message(message_id):
1087- self.assertEqual(message, self.plugin.create_message())
1088-
1089- result = self.plugin.exchange()
1090- result.addCallback(assert_message)
1091- return result
1092
1093=== modified file 'landscape/monitor/tests/test_mountinfo.py'
1094--- landscape/monitor/tests/test_mountinfo.py 2011-07-05 05:09:11 +0000
1095+++ landscape/monitor/tests/test_mountinfo.py 2011-12-02 09:56:24 +0000
1096@@ -3,7 +3,6 @@
1097 from twisted.internet.defer import succeed
1098
1099 from landscape.monitor.mountinfo import MountInfo
1100-from landscape.tests.test_hal import MockHALManager, MockRealHALDevice
1101 from landscape.tests.helpers import LandscapeTest, mock_counter, MonitorHelper
1102 from landscape.tests.mocker import ANY
1103
1104@@ -22,8 +21,6 @@
1105 self.log_helper.ignore_errors("Typelib file for namespace")
1106
1107 def get_mount_info(self, *args, **kwargs):
1108- hal_devices = kwargs.pop("hal_devices", [])
1109- kwargs["hal_manager"] = MockHALManager(hal_devices)
1110 if "statvfs" not in kwargs:
1111 kwargs["statvfs"] = lambda path: (0,) * 10
1112 return MountInfo(*args, **kwargs)
1113@@ -323,51 +320,8 @@
1114 message = plugin.create_mount_info_message()
1115 self.assertEqual(message, None)
1116
1117- def test_ignore_removable_partitions(self):
1118- """
1119- Partitions on removable devices don't directly report
1120- storage.removable : True, but they do point to their parent and the
1121- parent will be marked removable if appropriate.
1122- """
1123- devices = [MockRealHALDevice({"info.udi": "wubble",
1124- "block.device": "/dev/scd",
1125- "storage.removable": True}),
1126- MockRealHALDevice({"info.udi": "wubble0",
1127- "block.device": "/dev/scd0",
1128- "info.parent": "wubble"})]
1129-
1130- filename = self.makeFile("""\
1131-/dev/scd0 /media/Xerox_M750 iso9660 ro,nosuid,nodev,uid=1000,utf8 0 0
1132-""")
1133- plugin = self.get_mount_info(mounts_file=filename, hal_devices=devices,
1134- mtab_file=filename)
1135- self.monitor.add(plugin)
1136- plugin.run()
1137-
1138- message = plugin.create_mount_info_message()
1139- self.assertEqual(message, None)
1140-
1141 def test_ignore_removable_devices(self):
1142 """
1143- The mount info plugin should only report data about
1144- non-removable devices.
1145- """
1146- devices = [MockRealHALDevice({"info.udi": "wubble",
1147- "block.device": "/dev/scd0",
1148- "storage.removable": True})]
1149- filename = self.makeFile("""\
1150-/dev/scd0 /media/Xerox_M750 iso9660 ro,nosuid,nodev,uid=1000,utf8 0 0
1151-""")
1152- plugin = self.get_mount_info(mounts_file=filename, hal_devices=devices,
1153- mtab_file=filename)
1154- self.monitor.add(plugin)
1155- plugin.run()
1156-
1157- message = plugin.create_mount_info_message()
1158- self.assertEqual(message, None)
1159-
1160- def test_ignore_removable_devices_gudev(self):
1161- """
1162 The mount info plugin uses gudev to retrieve removable information
1163 about devices.
1164 """
1165@@ -376,7 +330,6 @@
1166 """)
1167 plugin = self.get_mount_info(mounts_file=filename,
1168 mtab_file=filename)
1169- plugin._hal_manager = None
1170
1171 class MockDevice(object):
1172 def get_sysfs_attr_as_boolean(self, attr):
1173@@ -395,35 +348,6 @@
1174 message = plugin.create_mount_info_message()
1175 self.assertEqual(message, None)
1176
1177- def test_ignore_multiparented_removable_devices(self):
1178- """
1179- Some removable devices might be the grand-children of a device that is
1180- marked as "storage.removable".
1181- """
1182- devices = [MockRealHALDevice({"info.udi": "wubble",
1183- "block.device": "/dev/scd",
1184- "storage.removable": True}),
1185- MockRealHALDevice({"info.udi": "wubble0",
1186- "block.device": "/dev/scd0",
1187- "info.parent": "wubble"}),
1188- MockRealHALDevice({"info.udi": "wubble0a",
1189- "block.device": "/dev/scd0a",
1190- "info.parent": "wubble0"}),
1191- MockRealHALDevice({"info.udi": "wubble0b",
1192- "block.device": "/dev/scd0b",
1193- "info.parent": "wubble0"})]
1194-
1195- filename = self.makeFile("""\
1196-/dev/scd0a /media/Xerox_M750 iso9660 ro,nosuid,nodev,uid=1000,utf8 0 0
1197-""")
1198- plugin = self.get_mount_info(mounts_file=filename, hal_devices=devices,
1199- mtab_file=filename)
1200- self.monitor.add(plugin)
1201- plugin.run()
1202-
1203- message = plugin.create_mount_info_message()
1204- self.assertEqual(message, None)
1205-
1206 def test_sample_free_space(self):
1207 """Test collecting information about free space."""
1208 def statvfs(path, multiplier=mock_counter(1).next):
1209
1210=== modified file 'landscape/monitor/tests/test_service.py'
1211--- landscape/monitor/tests/test_service.py 2011-07-05 05:09:11 +0000
1212+++ landscape/monitor/tests/test_service.py 2011-12-02 09:56:24 +0000
1213@@ -1,4 +1,3 @@
1214-from landscape.tests.mocker import ANY
1215 from landscape.tests.helpers import LandscapeTest, FakeBrokerServiceHelper
1216 from landscape.reactor import FakeReactor
1217 from landscape.monitor.config import MonitorConfiguration, ALL_PLUGINS
1218@@ -46,15 +45,10 @@
1219 starts the plugins and register the monitor as broker client. It also
1220 start listening on its own socket for incoming connections.
1221 """
1222- # FIXME: don't actually run the real register method, because at the
1223- # moment the UserMonitor plugin still depends on DBus. We can probably
1224- # drop this mocking once the AMP migration is completed.
1225- for plugin in self.service.plugins:
1226- plugin.register = self.mocker.mock()
1227- plugin.register(ANY)
1228- self.mocker.replay()
1229-
1230 def stop_service(ignored):
1231+ for plugin in self.service.plugins:
1232+ if getattr(plugin, "stop", None) is not None:
1233+ plugin.stop()
1234 [connector] = self.broker_service.broker.get_connectors()
1235 connector.disconnect()
1236 self.service.stopService()
1237
1238=== modified file 'landscape/package/releaseupgrader.py'
1239--- landscape/package/releaseupgrader.py 2011-07-06 12:34:11 +0000
1240+++ landscape/package/releaseupgrader.py 2011-12-02 09:56:24 +0000
1241@@ -188,32 +188,11 @@
1242 config.add_section("NonInteractive")
1243 config.set("NonInteractive", "ForceOverwrite", "no")
1244
1245- # Workaround for Bug #174148, which prevents dbus from restarting
1246- # after a dapper->hardy upgrade
1247- if not config.has_section("Distro"):
1248- config.add_section("Distro")
1249- if not config.has_option("Distro", "PostInstallScripts"):
1250- config.set("Distro", "PostInstallScripts", "./dbus.sh")
1251- else:
1252- scripts = config.get("Distro", "PostInstallScripts")
1253- scripts += ", ./dbus.sh"
1254- config.set("Distro", "PostInstallScripts", scripts)
1255-
1256 # Write config changes to disk
1257 fd = open(config_filename, "w")
1258 config.write(fd)
1259 fd.close()
1260
1261- # Generate the post-install script that starts DBus
1262- dbus_sh_filename = os.path.join(upgrade_tool_directory,
1263- "dbus.sh")
1264- fd = open(dbus_sh_filename, "w")
1265- fd.write("#!/bin/sh\n"
1266- "/etc/init.d/dbus start\n"
1267- "sleep 10\n")
1268- fd.close()
1269- os.chmod(dbus_sh_filename, 0755)
1270-
1271 # On some releases the upgrade-tool doesn't support the allow third
1272 # party environment variable, so this trick is needed to make it
1273 # possible to upgrade against testing client packages from the
1274
1275=== modified file 'landscape/package/tests/test_releaseupgrader.py'
1276--- landscape/package/tests/test_releaseupgrader.py 2011-11-15 09:57:05 +0000
1277+++ landscape/package/tests/test_releaseupgrader.py 2011-12-02 09:56:24 +0000
1278@@ -245,60 +245,6 @@
1279 result.addCallback(check_result)
1280 return result
1281
1282- def test_tweak_sets_dbus_start_script(self):
1283- """
1284- The L{ReleaseUpgrader.tweak} method adds to the upgrade-tool
1285- configuration a little script that starts dbus after the upgrade.
1286- """
1287- config_filename = os.path.join(self.config.upgrade_tool_directory,
1288- "DistUpgrade.cfg.dapper")
1289- self.makeFile(path=config_filename,
1290- content="[Distro]\n"
1291- "PostInstallScripts=/foo.sh\n")
1292-
1293- def check_result(ignored):
1294- config = ConfigParser.ConfigParser()
1295- config.read(config_filename)
1296- self.assertEqual(config.get("Distro", "PostInstallScripts"),
1297- "/foo.sh, ./dbus.sh")
1298- dbus_sh = os.path.join(self.config.upgrade_tool_directory,
1299- "dbus.sh")
1300- self.assertFileContent(dbus_sh,
1301- "#!/bin/sh\n"
1302- "/etc/init.d/dbus start\n"
1303- "sleep 10\n")
1304-
1305- result = self.upgrader.tweak("dapper")
1306- result.addCallback(check_result)
1307- return result
1308-
1309- def test_tweak_sets_dbus_start_script_with_no_post_install_scripts(self):
1310- """
1311- The L{ReleaseUpgrader.tweak} method adds to the upgrade-tool
1312- configuration a little script that starts dbus after the upgrade. This
1313- works even when the config file doesn't have a PostInstallScripts entry
1314- yet.
1315- """
1316- config_filename = os.path.join(self.config.upgrade_tool_directory,
1317- "DistUpgrade.cfg.dapper")
1318- self.makeFile(path=config_filename, content="")
1319-
1320- def check_result(ignored):
1321- config = ConfigParser.ConfigParser()
1322- config.read(config_filename)
1323- self.assertEqual(config.get("Distro", "PostInstallScripts"),
1324- "./dbus.sh")
1325- dbus_sh = os.path.join(self.config.upgrade_tool_directory,
1326- "dbus.sh")
1327- self.assertFileContent(dbus_sh,
1328- "#!/bin/sh\n"
1329- "/etc/init.d/dbus start\n"
1330- "sleep 10\n")
1331-
1332- result = self.upgrader.tweak("dapper")
1333- result.addCallback(check_result)
1334- return result
1335-
1336 def test_default_logs_directory(self):
1337 """
1338 The default directory for the upgrade-tool logs is the system one.
1339
1340=== modified file 'landscape/reactor.py'
1341--- landscape/reactor.py 2011-07-21 23:55:47 +0000
1342+++ landscape/reactor.py 2011-12-02 09:56:24 +0000
1343@@ -16,10 +16,6 @@
1344 """Raised when an invalid ID is used with reactor.cancel_call()."""
1345
1346
1347-class CallHookError(Exception):
1348- """Raised when hooking on a reactor incorrectly."""
1349-
1350-
1351 class EventID(object):
1352 """Unique identifier for an event handler.
1353
1354@@ -147,13 +143,6 @@
1355 except Exception, e:
1356 logging.exception(e)
1357
1358- def _hook_threaded_callbacks(self):
1359- id = self.call_every(0.5, self._run_threaded_callbacks)
1360- self._run_threaded_callbacks_id = id
1361-
1362- def _unhook_threaded_callbacks(self):
1363- self.cancel_call(self._run_threaded_callbacks_id)
1364-
1365
1366 class UnixReactorMixin(object):
1367
1368@@ -289,12 +278,12 @@
1369 try:
1370 # is it an IP address?
1371 socket.inet_aton(hostname)
1372- except socket.error: # no
1373+ except socket.error: # no
1374 if hostname in self.hosts:
1375 return succeed(self.hosts[hostname])
1376 else:
1377 return fail(DNSLookupError(hostname))
1378- else: # yes
1379+ else: # yes
1380 return succeed(hostname)
1381
1382
1383
1384=== modified file 'landscape/service.py'
1385--- landscape/service.py 2011-10-13 06:53:24 +0000
1386+++ landscape/service.py 2011-12-02 09:56:24 +0000
1387@@ -28,12 +28,6 @@
1388
1389 def __init__(self, config):
1390 self.config = config
1391- try:
1392- from landscape.lib import bpickle_dbus
1393- except ImportError:
1394- pass
1395- else:
1396- bpickle_dbus.install()
1397 self.reactor = self.reactor_factory()
1398 if self.persist_filename:
1399 self.persist = get_versioned_persist(self)
1400
1401=== modified file 'landscape/tests/test_configuration.py'
1402--- landscape/tests/test_configuration.py 2011-11-14 17:28:04 +0000
1403+++ landscape/tests/test_configuration.py 2011-12-02 09:56:24 +0000
1404@@ -1856,7 +1856,7 @@
1405
1406 def test_register_bus_connection_failure_ok_no_register(self):
1407 """
1408- Exit code 0 will be returned if we can't contact Landscape via DBus and
1409+ Exit code 0 will be returned if we can't contact Landscape and
1410 --ok-no-register was passed.
1411 """
1412 print_text_mock = self.mocker.replace(print_text)
1413
1414=== removed file 'landscape/tests/test_hal.py'
1415--- landscape/tests/test_hal.py 2011-07-05 05:09:11 +0000
1416+++ landscape/tests/test_hal.py 1970-01-01 00:00:00 +0000
1417@@ -1,87 +0,0 @@
1418-from dbus import SystemBus, Interface
1419-from dbus.exceptions import DBusException
1420-
1421-from landscape.hal import HALDevice, HALManager
1422-from landscape.tests.helpers import LandscapeTest
1423-
1424-
1425-class HALManagerTest(LandscapeTest):
1426-
1427- def setUp(self):
1428- super(HALManagerTest, self).setUp()
1429- self.bus = SystemBus()
1430-
1431- def test_get_devices(self):
1432- """
1433- A HALManager can return a flat list of devices. All available
1434- devices should be included in the returned list.
1435- """
1436- devices = HALManager().get_devices()
1437- manager = self.bus.get_object("org.freedesktop.Hal",
1438- "/org/freedesktop/Hal/Manager")
1439- manager = Interface(manager, "org.freedesktop.Hal.Manager")
1440- expected_devices = manager.GetAllDevices()
1441- actual_devices = [device.udi for device in devices]
1442- self.assertEqual(set(expected_devices), set(actual_devices))
1443-
1444- def test_get_devices_with_dbus_error(self):
1445- """
1446- If the L{HALManager} fails connecting to HAL over D-Bus, then the
1447- L{HALManager.get_devices} method returns an empty list.
1448- """
1449- self.log_helper.ignore_errors("Couldn't to connect to Hal via DBus")
1450- bus = self.mocker.mock()
1451- bus.get_object("org.freedesktop.Hal", "/org/freedesktop/Hal/Manager")
1452- self.mocker.throw(DBusException())
1453- self.mocker.replay()
1454- devices = HALManager(bus=bus).get_devices()
1455- self.assertEqual(devices, [])
1456-
1457- def test_get_devices_with_no_server(self):
1458- """
1459- If the L{HALManager} fails connecting to HAL over D-Bus, for example
1460- because the DBus server is not running at all, then the
1461- L{HALManager.get_devices} method returns an empty list.
1462- """
1463- self.log_helper.ignore_errors("Couldn't to connect to Hal via DBus")
1464- bus_mock = self.mocker.replace("dbus.SystemBus")
1465- bus_mock()
1466- self.mocker.throw(DBusException())
1467- self.mocker.replay()
1468- devices = HALManager().get_devices()
1469- self.assertEqual(devices, [])
1470-
1471-
1472-class MockHALManager(object):
1473-
1474- def __init__(self, devices):
1475- self.devices = devices
1476-
1477- def get_devices(self):
1478- return [HALDevice(device) for device in self.devices]
1479-
1480-
1481-class MockRealHALDevice(object):
1482-
1483- def __init__(self, properties):
1484- self._properties = properties
1485- self.udi = properties.get("info.udi", "fake_udi")
1486-
1487- def GetAllProperties(self):
1488- return self._properties
1489-
1490-
1491-class HALDeviceTest(LandscapeTest):
1492-
1493- def test_init(self):
1494- device = HALDevice(MockRealHALDevice({"info.udi": "wubble"}))
1495- self.assertEqual(device.properties, {"info.udi": "wubble"})
1496- self.assertEqual(device.udi, "wubble")
1497- self.assertEqual(device.parent, None)
1498-
1499- def test_add_child(self):
1500- parent = HALDevice(MockRealHALDevice({"info.udi": "wubble"}))
1501- child = HALDevice(MockRealHALDevice({"info.udi": "ooga"}))
1502- parent.add_child(child)
1503- self.assertEqual(parent.get_children(), [child])
1504- self.assertEqual(child.parent, parent)
1505
1506=== modified file 'landscape/tests/test_service.py'
1507--- landscape/tests/test_service.py 2011-07-05 05:09:11 +0000
1508+++ landscape/tests/test_service.py 2011-12-02 09:56:24 +0000
1509@@ -56,15 +56,6 @@
1510 service = TestService(self.config)
1511 self.assertFalse(hasattr(service, "persist"))
1512
1513- def test_install_bpickle_dbus(self):
1514- """
1515- A L{LandscapeService} installs the DBus extensions of bpickle.
1516- """
1517- dbus_mock = self.mocker.replace("landscape.lib.bpickle_dbus.install")
1518- dbus_mock()
1519- self.mocker.replay()
1520- TestService(self.config)
1521-
1522 def test_usr1_rotates_logs(self):
1523 """
1524 SIGUSR1 should cause logs to be reopened.
1525
1526=== modified file 'landscape/tests/test_textmessage.py'
1527--- landscape/tests/test_textmessage.py 2011-07-05 05:09:11 +0000
1528+++ landscape/tests/test_textmessage.py 2011-12-02 09:56:24 +0000
1529@@ -13,8 +13,8 @@
1530
1531 def test_send_message(self):
1532 """
1533- L{send_message} should send a message of type
1534- C{text-message} to the landscape dbus messaging service.
1535+ L{send_message} should send a message of type C{text-message} to the
1536+ landscape messaging service.
1537 """
1538 service = self.broker_service
1539 service.message_store.set_accepted_types(["text-message"])
1540
1541=== modified file 'landscape/textmessage.py'
1542--- landscape/textmessage.py 2010-04-23 10:57:57 +0000
1543+++ landscape/textmessage.py 2011-12-02 09:56:24 +0000
1544@@ -1,7 +1,6 @@
1545 """
1546 Support code for the C{landscape-message} utility, which sends a text
1547-message to the Landscape web UI via the landscape-client's dbus
1548-messaging service (see L{landscape.plugins.dbus_message}).
1549+message to the Landscape web UI via the landscape-client's messaging service.
1550 """
1551
1552 import sys
1553
1554=== modified file 'landscape/watchdog.py'
1555--- landscape/watchdog.py 2011-10-13 06:53:24 +0000
1556+++ landscape/watchdog.py 2011-12-02 09:56:24 +0000
1557@@ -57,8 +57,6 @@
1558 @cvar program: The name of the executable program that will start this
1559 daemon.
1560 @cvar username: The name of the user to switch to, by default.
1561- @cvar service: The DBus service name that the program will be expected to
1562- listen on.
1563 @cvar max_retries: The maximum number of retries before giving up when
1564 trying to connect to the watched daemon.
1565 @cvar factor: The factor by which the delay between subsequent connection
1566@@ -173,8 +171,7 @@
1567
1568 def is_running(self):
1569 # FIXME Error cases may not be handled in the best possible way
1570- # here. We're basically return False if any error happens from the
1571- # dbus ping.
1572+ # here. We're basically return False if any error happens.
1573 return self._connect_and_call("ping")
1574
1575 def wait(self):
1576@@ -362,7 +359,7 @@
1577 def start(self):
1578 """
1579 Start all daemons. The broker will be started first, and no other
1580- daemons will be started before it is running and responding to DBUS
1581+ daemons will be started before it is running and responding to
1582 messages.
1583
1584 @return: A deferred which fires when all services have successfully
1585@@ -463,11 +460,11 @@
1586
1587 def daemonize():
1588 # See http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16
1589- if os.fork(): # launch child and...
1590- os._exit(0) # kill off parent
1591+ if os.fork(): # launch child and...
1592+ os._exit(0) # kill off parent
1593 os.setsid()
1594- if os.fork(): # launch child and...
1595- os._exit(0) # kill off parent again.
1596+ if os.fork(): # launch child and...
1597+ os._exit(0) # kill off parent again.
1598 # some argue that this umask should be 0, but that's annoying.
1599 os.umask(077)
1600 null = os.open('/dev/null', os.O_RDWR)
1601@@ -505,7 +502,7 @@
1602 error("ERROR: The following daemons are already running: %s"
1603 % (", ".join(x.program for x in running_daemons)))
1604 self.exit_code = 1
1605- reactor.crash() # so stopService isn't called.
1606+ reactor.crash() # so stopService isn't called.
1607 return
1608 self._daemonize()
1609 info("Watchdog watching for daemons.")
1610
1611=== modified file 'man/landscape-client.1'
1612--- man/landscape-client.1 2010-01-18 17:26:36 +0000
1613+++ man/landscape-client.1 2011-12-02 09:56:24 +0000
1614@@ -1,5 +1,5 @@
1615 .\"Text automatically generated by txt2man
1616-.TH landscape-client "18 January 2010" "" ""
1617+.TH landscape-client 1 "02 December 2011" "" ""
1618 .SH NAME
1619 \fBlandscape-client \fP- Landscape system client
1620 \fB
1621@@ -35,11 +35,6 @@
1622 \fIoptions\fP override settings from the file).
1623 .TP
1624 .B
1625-\fB--bus\fP=BUS
1626-Which DBUS bus to use. One of 'session' or
1627-'system'.
1628-.TP
1629-.B
1630 \fB-d\fP PATH, \fB--data-path\fP=PATH
1631 The directory to store data files in.
1632 .TP
1633
1634=== modified file 'man/landscape-client.txt'
1635--- man/landscape-client.txt 2010-01-18 16:33:51 +0000
1636+++ man/landscape-client.txt 2011-12-02 09:56:24 +0000
1637@@ -17,8 +17,6 @@
1638 -h, --help Show this help message and exit.
1639 -c FILE, --config=FILE Use config from this file (any command line
1640 options override settings from the file).
1641- --bus=BUS Which DBUS bus to use. One of 'session' or
1642- 'system'.
1643 -d PATH, --data-path=PATH The directory to store data files in.
1644 -q, --quiet Do not log to the standard output.
1645 -l FILE, --log-dir=FILE The directory to write log files to.
1646
1647=== modified file 'man/landscape-config.1'
1648--- man/landscape-config.1 2010-01-18 17:26:36 +0000
1649+++ man/landscape-config.1 2011-12-02 09:56:24 +0000
1650@@ -1,5 +1,5 @@
1651 .\"Text automatically generated by txt2man
1652-.TH landscape-config "18 January 2010" "" ""
1653+.TH landscape-config 1 "02 December 2011" "" ""
1654 .SH NAME
1655 \fBlandscape-config \fP- configure the Landscape management client
1656 \fB
1657@@ -46,11 +46,6 @@
1658 '/etc/landscape/client.conf').
1659 .TP
1660 .B
1661-\fB--bus\fP=BUS
1662-Which DBUS bus to use. One of 'session' or 'system'
1663-(default: 'system').
1664-.TP
1665-.B
1666 \fB-d\fP PATH, \fB--data-path\fP=PATH
1667 The directory to store data files in (default:
1668 '/var/lib/landscape/client').
1669
1670=== modified file 'man/landscape-config.txt'
1671--- man/landscape-config.txt 2010-01-18 17:20:34 +0000
1672+++ man/landscape-config.txt 2011-12-02 09:56:24 +0000
1673@@ -28,8 +28,6 @@
1674 -c FILE, --config=FILE Use config from this file (any command line options
1675 override settings from the file) (default:
1676 '/etc/landscape/client.conf').
1677- --bus=BUS Which DBUS bus to use. One of 'session' or 'system'
1678- (default: 'system').
1679 -d PATH, --data-path=PATH The directory to store data files in (default:
1680 '/var/lib/landscape/client').
1681 -q, --quiet Do not log to the standard output.
1682
1683=== modified file 'man/landscape-message.1'
1684--- man/landscape-message.1 2010-01-18 17:26:36 +0000
1685+++ man/landscape-message.1 2011-12-02 09:56:24 +0000
1686@@ -1,5 +1,5 @@
1687 .\"Text automatically generated by txt2man
1688-.TH landscape-message "18 January 2010" "" ""
1689+.TH landscape-message 1 "02 December 2011" "" ""
1690 .SH NAME
1691 \fBlandscape-message \fP- Send a message to the landscape web interface
1692 \fB
1693@@ -31,10 +31,6 @@
1694 .B
1695 \fB-h\fP, \fB--help\fP
1696 Show this help message and exit.
1697-.TP
1698-.B
1699-\fB-b\fP BUS, \fB--bus\fP=BUS
1700-The DBUS bus to use to send the message.
1701 .SH EXAMPLES
1702
1703 \fBlandscape-message\fP Hello administrator
1704
1705=== modified file 'man/landscape-message.txt'
1706--- man/landscape-message.txt 2010-01-18 16:33:51 +0000
1707+++ man/landscape-message.txt 2011-12-02 09:56:24 +0000
1708@@ -16,7 +16,6 @@
1709 OPTIONS
1710 --version Show program's version number and exit.
1711 -h, --help Show this help message and exit.
1712- -b BUS, --bus=BUS The DBUS bus to use to send the message.
1713
1714 EXAMPLES
1715
1716
1717=== removed file 'scripts/landscape-dbus-proxy'
1718--- scripts/landscape-dbus-proxy 2011-06-13 23:58:09 +0000
1719+++ scripts/landscape-dbus-proxy 1970-01-01 00:00:00 +0000
1720@@ -1,82 +0,0 @@
1721-#!/usr/bin/env python
1722-
1723-import os
1724-import dbus
1725-import dbus.service
1726-import dbus.glib # This as side effects, don't remove it!
1727-
1728-from dbus.service import Object, BusName, method
1729-
1730-from twisted.internet import glib2reactor
1731-glib2reactor.install()
1732-from twisted.internet import reactor
1733-
1734-from landscape.lib.bpickle import loads
1735-from landscape.lib.lock import lock_path, LockError
1736-from landscape.reactor import TwistedReactor
1737-from landscape.deployment import Configuration
1738-from landscape.broker.amp import RemoteBrokerConnector
1739-
1740-
1741-BUS_NAME = "com.canonical.landscape.Broker"
1742-OBJECT_PATH = "/com/canonical/landscape/Broker"
1743-
1744-
1745-def array_to_string(array):
1746- """Convert an L{Array} of L{Byte}s (or integers) to a Python str."""
1747- result = []
1748- for item in array:
1749- if item < 0:
1750- item = item + 256
1751- result.append(chr(item))
1752- return "".join(result)
1753-
1754-
1755-class BrokerDBusObject(Object):
1756- """A DBus-published object proxying L{RemoteBroker.send_message}.
1757-
1758- It is used when upgrading from a DBus-based version of the Landscape client
1759- to the newer AMP-based one, for letting the old package-changer process
1760- performing the upgrade communicate with the new version of the client.
1761- """
1762-
1763- bus_name = BUS_NAME
1764- object_path = OBJECT_PATH
1765-
1766- def __init__(self, config):
1767- super(BrokerDBusObject, self).__init__(BusName(
1768- self.bus_name, dbus.SystemBus()), object_path=self.object_path)
1769- self.config = config
1770-
1771- @method(BUS_NAME)
1772- def send_message(self, message, urgent=True):
1773- """Queue the given message in the message exchange."""
1774- message = loads(array_to_string(message))
1775-
1776- def cb_connected(broker):
1777- result = broker.send_message(message, urgent=True)
1778- return result.addCallback(cb_done)
1779-
1780- def cb_done(ignored):
1781- return reactor.stop()
1782-
1783- twisted_reactor = TwistedReactor()
1784- connector = RemoteBrokerConnector(twisted_reactor, self.config)
1785- connected = connector.connect()
1786- connected.addCallback(cb_connected)
1787-
1788-
1789-if __name__ == "__main__":
1790- config = Configuration()
1791- lock_dir = os.path.join(config.data_path, "package")
1792- if os.path.isdir(lock_dir):
1793- lock_filename = os.path.join(lock_dir, "changer.lock")
1794- try:
1795- lock_path(lock_filename)
1796- except LockError:
1797- # The package-changer is running, this means that we're upgrading from
1798- # a non-AMP version and that the upgrade is Landscape driven, so let's
1799- # expose the DBus broker proxy to give a chance to the package-changer
1800- # to send its result message.
1801- remote = BrokerDBusObject(config)
1802- reactor.run()
1803
1804=== modified file 'setup.py'
1805--- setup.py 2010-06-10 13:30:58 +0000
1806+++ setup.py 2011-12-02 09:56:24 +0000
1807@@ -29,8 +29,7 @@
1808 "scripts/landscape-package-reporter",
1809 "scripts/landscape-release-upgrader",
1810 "scripts/landscape-sysinfo",
1811- "scripts/landscape-is-cloud-managed",
1812- "scripts/landscape-dbus-proxy"],
1813+ "scripts/landscape-is-cloud-managed"],
1814 ext_modules=[Extension("landscape.lib.initgroups",
1815 ["landscape/lib/initgroups.c"])]
1816 )

Subscribers

People subscribed via source and target branches

to all changes: