~ahasenack/landscape-client/landscape-client-1.5.5-0ubuntu0.9.04.0

« back to all changes in this revision

Viewing changes to landscape/upgraders/legacy.py

  • Committer: Bazaar Package Importer
  • Author(s): Rick Clark
  • Date: 2008-09-08 16:35:57 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20080908163557-l3ixzj5dxz37wnw2
Tags: 1.0.18-0ubuntu1
New upstream release 

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
import os
 
2
import gdbm
 
3
 
 
4
from landscape.patch import UpgradeManager
 
5
from landscape.lib.persist import Persist
 
6
from landscape.package.store import PackageStore
 
7
 
 
8
 
 
9
upgrade_manager = UpgradeManager()
 
10
 
 
11
 
 
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):
 
19
    """
 
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.
 
24
    """
 
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)
 
30
 
 
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)
 
36
    else:
 
37
        manager.initialize(persist)
 
38
    persist.save()
 
39
 
 
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"))
 
45
    broker_persist.save()
 
46
 
 
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",
 
52
                   "users"]:
 
53
        if persist.has(plugin):
 
54
            monitor_persist.set(plugin, persist.get(plugin))
 
55
    monitor_persist.save()
 
56
 
 
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)
 
61
 
 
62
        hash_ids = {}
 
63
        key = hashdb.firstkey()
 
64
        while key is not None:
 
65
            try:
 
66
                hash = hashdb[key]
 
67
                hash_ids[hash] = int(key)
 
68
            except ValueError:
 
69
                pass
 
70
            key = hashdb.nextkey(key)
 
71
 
 
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", ()))
 
77
 
 
78
 
 
79
@upgrade_manager.upgrader(8)
 
80
def index_users_on_names_added(persist):
 
81
    """
 
82
    Upgrade from persisted stores indexed on uid/gid to username/groupname.
 
83
    """
 
84
    old_user_data = persist.get("users")
 
85
    new_user_data = {}
 
86
    new_group_data = {}
 
87
 
 
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
 
91
 
 
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")
 
101
                if username:
 
102
                    new_group_members.append(username)
 
103
            group_data["members"] = sorted(new_group_members)
 
104
            new_group_data[group_data["name"]] = group_data
 
105
 
 
106
    persist.set("users", {"users": new_user_data, "groups": new_group_data})
 
107
 
 
108
 
 
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")
 
114
 
 
115
 
 
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")
 
120
 
 
121
 
 
122
@upgrade_manager.upgrader(5)
 
123
def user_change_detection_added(persist):
 
124
    """
 
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
 
128
    server.
 
129
    """
 
130
    persist.remove(("users", "users"))
 
131
    persist.remove(("users", "groups"))
 
132
 
 
133
 
 
134
@upgrade_manager.upgrader(4)
 
135
def group_support_added(persist):
 
136
    """
 
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.
 
141
    """
 
142
    persist.remove(("users", "data"))
 
143
 
 
144
 
 
145
@upgrade_manager.upgrader(3)
 
146
def delete_urgent_exchange(persist):
 
147
    """
 
148
    Urgent exchange is now in-memory only.
 
149
    """
 
150
    persist.remove("message-exchange.urgent-exchange")
 
151
 
 
152
 
 
153
@upgrade_manager.upgrader(2)
 
154
def delete_old_resource_data(persist):
 
155
    """
 
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.
 
160
 
 
161
    Also, some keys for persisted information have changed, so stored
 
162
    information is being reset.
 
163
    """
 
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")
 
170
 
 
171
 
 
172
@upgrade_manager.upgrader(1)
 
173
def delete_user_data(persist):
 
174
    """
 
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.
 
179
    """
 
180
    persist.remove(("users", "data"))