4
from landscape.patch import UpgradeManager
5
from landscape.lib.persist import Persist
6
from landscape.package.store import PackageStore
9
upgrade_manager = UpgradeManager()
12
def migrate_data_file(data_dir,
13
filename="data.bpickle",
14
broker_filename="broker.bpickle",
15
monitor_filename="monitor.bpickle",
16
hashdb_filename="hash.db",
17
sqlite_filename="hash.sqlite",
18
manager=upgrade_manager):
20
This function is triggered by the post-inst script when landscape
21
is upgraded. It applies all the upgraders to the old monolithic
22
persist data file and then splits the file up into multiple
23
persist files for each new per-process service.
25
filename = os.path.join(data_dir, filename)
26
broker_filename = os.path.join(data_dir, broker_filename)
27
monitor_filename = os.path.join(data_dir, monitor_filename)
28
hashdb_filename = os.path.join(data_dir, hashdb_filename)
29
sqlite_filename = os.path.join(data_dir, sqlite_filename)
31
# Make sure all the legacy upgraders up to this point have been
32
# applied if an upgrade manager was passed in.
33
persist = Persist(filename=filename)
34
if os.path.exists(filename):
35
manager.apply(persist)
37
manager.initialize(persist)
40
# Migrate broker data.
41
broker_persist = Persist(filename=broker_filename)
42
broker_persist.set("message-store", persist.get("message-store"))
43
broker_persist.set("message-exchange", persist.get("message-exchange"))
44
broker_persist.set("registration", persist.get("registration"))
47
# Migrate monitor data.
48
monitor_persist = Persist(filename=monitor_filename)
49
for plugin in ["client-uptime", "computer-uptime", "computer-info",
50
"load-average", "memory-info", "mount-info",
51
"processor-info", "temperature", "hardware-inventory",
53
if persist.has(plugin):
54
monitor_persist.set(plugin, persist.get(plugin))
55
monitor_persist.save()
57
# package data needs to be migrated to a sqlite db
58
if os.path.exists(hashdb_filename):
59
hashdb = gdbm.open(hashdb_filename, "r")
60
store = PackageStore(sqlite_filename)
63
key = hashdb.firstkey()
64
while key is not None:
67
hash_ids[hash] = int(key)
70
key = hashdb.nextkey(key)
72
store.set_hash_ids(hash_ids)
73
store.add_installed(persist.get("package.installed", ()))
74
store.add_available(persist.get("package.available", ()))
75
store.add_available_upgrades(
76
persist.get("package.available_upgrades", ()))
79
@upgrade_manager.upgrader(8)
80
def index_users_on_names_added(persist):
82
Upgrade from persisted stores indexed on uid/gid to username/groupname.
84
old_user_data = persist.get("users")
88
if old_user_data.get("users"):
89
for (userid, user_data) in old_user_data.get("users").iteritems():
90
new_user_data[user_data["username"]] = user_data
92
if old_user_data.get("groups"):
93
for (groupid, group_data) in old_user_data.get("groups").iteritems():
94
old_group_members = group_data["members"]
95
new_group_members = []
96
for user_id in old_group_members:
97
# If an admin leaves a username in a list of user members who
98
# has been deleted, we can probably safely ignore it.
99
username = old_user_data.get("users").get(
100
user_id, {}).get("username")
102
new_group_members.append(username)
103
group_data["members"] = sorted(new_group_members)
104
new_group_data[group_data["name"]] = group_data
106
persist.set("users", {"users": new_user_data, "groups": new_group_data})
109
@upgrade_manager.upgrader(7)
110
def move_registration_data(persist):
111
"""Move registration-related information to a sensible place."""
112
persist.move("message-store.secure_id", "registration.secure-id")
113
persist.move("http-ping.insecure-id", "registration.insecure-id")
116
@upgrade_manager.upgrader(6)
117
def rename_message_queue(persist):
118
"""Rename "message-queue" to "message-store", if necessary."""
119
persist.move("message-queue", "message-store")
122
@upgrade_manager.upgrader(5)
123
def user_change_detection_added(persist):
125
The user and group plugin has been refactored to include detecting
126
and reporting changes made externally to Landscape. Old data
127
needs to be wiped out so that the plugin sends fresh data to the
130
persist.remove(("users", "users"))
131
persist.remove(("users", "groups"))
134
@upgrade_manager.upgrader(4)
135
def group_support_added(persist):
137
The 'users' data used to be stored at /users/data, but now it is
138
in /users/users, next to /users/groups. The key will be created
139
automatically, but the old location will be deleted to prevent
140
cruft from accumulating.
142
persist.remove(("users", "data"))
145
@upgrade_manager.upgrader(3)
146
def delete_urgent_exchange(persist):
148
Urgent exchange is now in-memory only.
150
persist.remove("message-exchange.urgent-exchange")
153
@upgrade_manager.upgrader(2)
154
def delete_old_resource_data(persist):
156
The accumulation logic in the client has been refactored. The
157
previous logic required the mount info plugin to persist last
158
known values. The new logic doesn't required the plugin to worry
159
about this detail, so we can remove old persisted values.
161
Also, some keys for persisted information have changed, so stored
162
information is being reset.
164
persist.remove("load-average")
165
persist.remove("memory-info")
166
persist.remove("mount-info")
167
persist.remove("processor-info")
168
persist.remove("temperature")
169
persist.remove("trip-points")
172
@upgrade_manager.upgrader(1)
173
def delete_user_data(persist):
175
The client was released with user support before the server was
176
deployed; the client tried sending messages about user data and
177
the server ignored it. Unfortunately, the client didn't know they
178
were ignored, so it's not sending new data.
180
persist.remove(("users", "data"))