Revision e0732b36
b/tools/cfgupgrade | ||
---|---|---|
22 | 22 |
"""Tool to upgrade the configuration file. |
23 | 23 |
|
24 | 24 |
This code handles only the types supported by simplejson. As an example, "set" |
25 |
is a "list". Old Pickle based configurations files are converted to JSON during |
|
26 |
the process. |
|
25 |
is a "list". |
|
27 | 26 |
|
28 | 27 |
""" |
29 | 28 |
|
... | ... | |
31 | 30 |
import os |
32 | 31 |
import os.path |
33 | 32 |
import sys |
34 |
import re |
|
35 | 33 |
import optparse |
36 | 34 |
import tempfile |
37 | 35 |
import simplejson |
... | ... | |
49 | 47 |
pass |
50 | 48 |
|
51 | 49 |
|
52 |
# {{{ Support for old Pickle files |
|
53 |
class UpgradeDict(dict): |
|
54 |
"""Base class for internal config classes. |
|
55 |
|
|
56 |
""" |
|
57 |
def __setstate__(self, state): |
|
58 |
self.update(state) |
|
59 |
|
|
60 |
def __getstate__(self): |
|
61 |
return self.copy() |
|
62 |
|
|
63 |
|
|
64 |
def FindGlobal(module, name): |
|
65 |
"""Wraps Ganeti config classes to internal ones. |
|
66 |
|
|
67 |
This function may only return types supported by simplejson. |
|
68 |
|
|
69 |
""" |
|
70 |
if module == "ganeti.objects": |
|
71 |
return UpgradeDict |
|
72 |
elif module == "__builtin__" and name == "set": |
|
73 |
return list |
|
74 |
|
|
75 |
return getattr(sys.modules[module], name) |
|
76 |
|
|
77 |
|
|
78 |
def ReadPickleFile(f): |
|
79 |
"""Reads an old Pickle configuration. |
|
80 |
|
|
81 |
""" |
|
82 |
import cPickle |
|
83 |
|
|
84 |
loader = cPickle.Unpickler(f) |
|
85 |
loader.find_global = FindGlobal |
|
86 |
return loader.load() |
|
87 |
|
|
88 |
|
|
89 |
def IsPickleFile(f): |
|
90 |
"""Checks whether a file is using the Pickle format. |
|
91 |
|
|
92 |
""" |
|
93 |
magic = f.read(128) |
|
94 |
try: |
|
95 |
return not re.match('^\s*\{', magic) |
|
96 |
finally: |
|
97 |
f.seek(-len(magic), 1) |
|
98 |
# }}} |
|
99 |
|
|
100 |
|
|
101 |
def ReadJsonFile(f): |
|
102 |
"""Reads a JSON file. |
|
103 |
|
|
104 |
""" |
|
105 |
return simplejson.load(f) |
|
106 |
|
|
107 |
|
|
108 | 50 |
def ReadConfig(path): |
109 | 51 |
"""Reads configuration file. |
110 | 52 |
|
111 | 53 |
""" |
112 | 54 |
f = open(path, 'r') |
113 | 55 |
try: |
114 |
if IsPickleFile(f): |
|
115 |
return ReadPickleFile(f) |
|
116 |
else: |
|
117 |
return ReadJsonFile(f) |
|
56 |
return simplejson.load(f) |
|
118 | 57 |
finally: |
119 | 58 |
f.close() |
120 | 59 |
|
Also available in: Unified diff