~ubuntu-branches/ubuntu/utopic/xen/utopic

« back to all changes in this revision

Viewing changes to tools/pygrub/src/LiloConf.py

  • Committer: Bazaar Package Importer
  • Author(s): Bastian Blank
  • Date: 2010-05-06 15:47:38 UTC
  • mto: (1.3.1) (15.1.1 sid) (4.1.1 experimental)
  • mto: This revision was merged to the branch mainline in revision 3.
  • Revision ID: james.westby@ubuntu.com-20100506154738-agoz0rlafrh1fnq7
Tags: upstream-4.0.0
ImportĀ upstreamĀ versionĀ 4.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#
 
2
#LiloConf.py
 
3
#
 
4
 
 
5
import sys, re, os
 
6
import logging
 
7
import GrubConf
 
8
 
 
9
class LiloImage(object):
 
10
    def __init__(self, lines, path):
 
11
        self.reset(lines, path)
 
12
 
 
13
    def __repr__(self):
 
14
        return ("title: %s\n"
 
15
                "  root: %s\n"
 
16
                "  kernel: %s\n"
 
17
                "  args: %s\n"
 
18
                "  initrd: %s\n" %(self.title, self.root, self.kernel,
 
19
                                   self.args, self.initrd))
 
20
    def reset(self, lines, path):
 
21
        self._initrd = self._kernel = self._readonly = None
 
22
        self._args = ""
 
23
        self.title = ""
 
24
        self.lines = []
 
25
        self.path = path
 
26
        self.root = ""
 
27
        map(self.set_from_line, lines)
 
28
 
 
29
    def set_from_line(self, line, replace = None):
 
30
        (com, arg) = GrubConf.grub_exact_split(line, 2)
 
31
 
 
32
        if self.commands.has_key(com):
 
33
            if self.commands[com] is not None:
 
34
                setattr(self, self.commands[com], re.sub('^"(.+)"$', r"\1", arg.strip()))
 
35
            else:
 
36
                logging.info("Ignored image directive %s" %(com,))
 
37
        else:
 
38
            logging.warning("Unknown image directive %s" %(com,))
 
39
 
 
40
        # now put the line in the list of lines
 
41
        if replace is None:
 
42
            self.lines.append(line)
 
43
        else:
 
44
            self.lines.pop(replace)
 
45
            self.lines.insert(replace, line)
 
46
 
 
47
    def set_kernel(self, val):
 
48
        self._kernel = (None, self.path + "/" + val)
 
49
    def get_kernel(self):
 
50
        return self._kernel
 
51
    kernel = property(get_kernel, set_kernel)
 
52
 
 
53
    def set_initrd(self, val):
 
54
        self._initrd = (None, self.path + "/" + val)
 
55
    def get_initrd(self):
 
56
        return self._initrd
 
57
    initrd = property(get_initrd, set_initrd)
 
58
 
 
59
    def set_args(self, val):
 
60
        self._args = val
 
61
    def get_args(self):
 
62
        args = self._args
 
63
        if self.root:
 
64
            args += " root=" + self.root
 
65
        if self.readonly:
 
66
            args += " ro"
 
67
        return args
 
68
    args = property(get_args, set_args)
 
69
 
 
70
    def set_readonly(self, val):
 
71
        self._readonly = 1
 
72
    def get_readonly(self):
 
73
        return self._readonly
 
74
    readonly = property(get_readonly, set_readonly)
 
75
 
 
76
    # set up command handlers
 
77
    commands = { "label": "title",
 
78
                 "root": "root",
 
79
                 "rootnoverify": "root",
 
80
                 "image": "kernel",
 
81
                 "initrd": "initrd",
 
82
                 "append": "args",
 
83
                 "read-only": "readonly",
 
84
                 "chainloader": None,
 
85
                 "module": None}
 
86
 
 
87
class LiloConfigFile(object):
 
88
    def __init__(self, fn = None):
 
89
        self.filename = fn
 
90
        self.images = []
 
91
        self.timeout = -1
 
92
        self._default = 0
 
93
 
 
94
        if fn is not None:
 
95
            self.parse()
 
96
 
 
97
    def parse(self, buf = None):
 
98
        if buf is None:
 
99
            if self.filename is None:
 
100
                raise ValueError, "No config file defined to parse!"
 
101
 
 
102
            f = open(self.filename, 'r')
 
103
            lines = f.readlines()
 
104
            f.close()
 
105
        else:
 
106
            lines = buf.split("\n")
 
107
 
 
108
        path = os.path.dirname(self.filename)
 
109
        img = []
 
110
        for l in lines:
 
111
            l = l.strip()
 
112
            # skip blank lines
 
113
            if len(l) == 0:
 
114
                continue
 
115
            # skip comments
 
116
            if l.startswith('#'):
 
117
                continue
 
118
            # new image
 
119
            if l.startswith("image"):
 
120
                if len(img) > 0:
 
121
                    self.add_image(LiloImage(img, path))
 
122
                img = [l]
 
123
                continue
 
124
 
 
125
            if len(img) > 0:
 
126
                img.append(l)
 
127
                continue
 
128
 
 
129
            (com, arg) = GrubConf.grub_exact_split(l, 2)
 
130
            if self.commands.has_key(com):
 
131
                if self.commands[com] is not None:
 
132
                    setattr(self, self.commands[com], arg.strip())
 
133
                else:
 
134
                    logging.info("Ignored directive %s" %(com,))
 
135
            else:
 
136
                logging.warning("Unknown directive %s" %(com,))
 
137
 
 
138
        if len(img) > 0:
 
139
            self.add_image(LiloImage(img, path))
 
140
 
 
141
    def hasPassword(self):
 
142
        return False
 
143
 
 
144
    def hasPasswordAccess(self):
 
145
        return True
 
146
 
 
147
    def add_image(self, image):
 
148
        self.images.append(image)
 
149
 
 
150
    def _get_default(self):
 
151
        for i in range(len(self.images)):
 
152
            if self.images[i].title == self._default:
 
153
                return i
 
154
        return 0
 
155
    def _set_default(self, val):
 
156
        self._default = val
 
157
    default = property(_get_default, _set_default)
 
158
 
 
159
    commands = { "default": "default",
 
160
                 "timeout": "timeout",
 
161
                 "prompt": None,
 
162
                 "relocatable": None,
 
163
                 }
 
164
 
 
165
if __name__ == "__main__":
 
166
    if sys.argv < 2:
 
167
        raise RuntimeError, "Need a grub.conf to read"
 
168
    g = LiloConfigFile(sys.argv[1])
 
169
    for i in g.images:
 
170
        print i #, i.title, i.root, i.kernel, i.args, i.initrd
 
171
    print g.default