3
4
from twisted.internet.defer import Deferred, succeed
5
6
from landscape.lib.dbus_util import get_bus
6
7
from landscape.lib.lock import lock_path, LockError
7
8
from landscape.lib.log import log_failure
9
from landscape.lib.command import run_command, CommandError
8
10
from landscape.deployment import Configuration, init_logging
9
from landscape.package.store import PackageStore
11
from landscape.package.store import PackageStore, InvalidHashIdDb
10
12
from landscape.broker.remote import RemoteBroker
15
17
queue_name = "default"
17
def __init__(self, package_store, package_facade, remote_broker):
19
def __init__(self, package_store, package_facade, remote_broker, config):
18
20
self._store = package_store
19
21
self._facade = package_facade
20
22
self._broker = remote_broker
21
24
self._channels_reloaded = False
25
self._server_uuid = None
23
27
def ensure_channels_reloaded(self):
24
28
if not self._channels_reloaded:
53
57
def handle_task(self, task):
54
58
return succeed(None)
60
def use_hash_id_db(self):
62
Attach the appropriate pre-canned hash=>id database to our store.
65
def use_it(hash_id_db_filename):
67
if hash_id_db_filename is None:
68
# Couldn't determine which hash=>id database to use,
69
# just ignore the failure and go on
72
if not os.path.exists(hash_id_db_filename):
73
# The appropriate database isn't there, but nevermind
78
self._store.add_hash_id_db(hash_id_db_filename)
79
except InvalidHashIdDb:
80
# The appropriate database is there but broken,
81
# let's remove it and go on
82
logging.warning("Invalid hash=>id database %s" %
84
os.remove(hash_id_db_filename)
87
result = self._determine_hash_id_db_filename()
88
result.addCallback(use_it)
91
def _determine_hash_id_db_filename(self):
92
"""Build up the filename of the hash=>id database to use.
94
@return: a deferred resulting in the filename to use or C{None}
98
def got_server_uuid(server_uuid):
100
warning = "Couldn't determine which hash=>id database to use: %s"
102
if server_uuid is None:
103
logging.warning(warning % "server UUID not available")
107
# XXX replace this with a L{SmartFacade} method
108
codename = run_command("lsb_release -cs")
109
except CommandError, error:
110
logging.warning(warning % str(error))
113
arch = self._facade.get_arch()
115
# The Smart code should always return a proper string, so this
116
# branch shouldn't get executed at all. However this check is
117
# kept as an extra paranoia sanity check.
118
logging.warning(warning % "unknown dpkg architecture")
121
package_directory = os.path.join(self._config.data_path, "package")
122
hash_id_db_directory = os.path.join(package_directory, "hash-id")
124
return os.path.join(hash_id_db_directory,
125
"%s_%s_%s" % (server_uuid,
129
result = self._broker.get_server_uuid()
130
result.addCallback(got_server_uuid)
57
134
def run_task_handler(cls, args, reactor=None):
58
135
from twisted.internet.glib2reactor import install
71
148
package_directory = os.path.join(config.data_path, "package")
72
if not os.path.isdir(package_directory):
73
os.mkdir(package_directory)
149
hash_id_directory = os.path.join(package_directory, "hash-id")
150
for directory in [package_directory, hash_id_directory]:
151
if not os.path.isdir(directory):
75
154
lock_filename = os.path.join(package_directory, program_name + ".lock")
98
177
package_facade = SmartFacade()
99
178
remote = RemoteBroker(get_bus(config.bus))
101
handler = cls(package_store, package_facade, remote)
180
handler = cls(package_store, package_facade, remote, config)
103
182
def got_err(failure):
104
183
log_failure(failure)