[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] pygrub: Fix entry editing in grub2


  • To: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>
  • From: Miroslav Rezanina <mrezanin@xxxxxxxxxx>
  • Date: Mon, 12 Dec 2011 10:47:15 -0500 (EST)
  • Delivery-date: Mon, 12 Dec 2011 15:48:18 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>

When user wants to change entry in grub2 menu in pygrub, there's no
response in case of appending command line arguments ('a' key) and
may be crash of pygrub in case of editing item ('e' key).

Append malfunction is caused by change of keyword used for kernel
record. Grub uses 'kernel' for line with linux kernel but grub2 uses
'linux' instead. This patch adds checking for both grub 1 and 2 keywords.

Crash on editing is caused longer entry list in case of grub2. As entry
window is 10 lines high, it can hold only 8 entries (2 lines for border).
Adding line outside of windows high causes crash. Patch add handling
for longer lists and scrolling through them.

Signed-off-by: Miroslav Rezanina <mrezanin@xxxxxxxxxx>

Patch:
---
diff -r 1c58bb664d8d tools/pygrub/src/pygrub
--- a/tools/pygrub/src/pygrub   Thu Dec 08 17:15:16 2011 +0000
+++ b/tools/pygrub/src/pygrub   Mon Dec 12 16:35:43 2011 +0100
@@ -221,6 +221,7 @@
         
 
 class Grub:
+    ENTRY_WIN_LINES = 8
     def __init__(self, file, fs = None):
         self.screen = None
         self.entry_win = None
@@ -238,7 +239,7 @@
                 except:
                     pass # Not important if we can't use colour
             enable_cursor(False)
-            self.entry_win = curses.newwin(10, 74, 2, 1)
+            self.entry_win = curses.newwin(Grub.ENTRY_WIN_LINES + 2, 74, 2, 1)
             self.text_win = curses.newwin(10, 70, 12, 5)
             curses.def_prog_mode()
         
@@ -287,12 +288,20 @@
             self.text_win.noutrefresh()
 
         curline = 0
+        pos = 0
         img = copy.deepcopy(origimg)
         while 1:
             draw()
             self.entry_win.erase()
-            self.entry_win.box()
-            for idx in range(0, len(img.lines)):
+
+            rs = 0
+            re = len(img.lines)
+            idp = 1
+            if re > Grub.ENTRY_WIN_LINES:
+                rs = curline - pos
+                re = rs + Grub.ENTRY_WIN_LINES
+
+            for idx in range(rs, re):
                 # current line should be highlighted
                 if idx == curline:
                     self.entry_win.attron(curses.A_REVERSE)
@@ -302,9 +311,11 @@
                 if len(l) > 70:
                     l = l[:69] + ">"
                     
-                self.entry_win.addstr(idx + 1, 2, l)
+                self.entry_win.addstr(idp, 2, l)
                 if idx == curline:
                     self.entry_win.attroff(curses.A_REVERSE)
+                idp += 1
+            self.entry_win.box()
             self.entry_win.noutrefresh()
             curses.doupdate()
 
@@ -313,8 +324,12 @@
                 break
             elif c == curses.KEY_UP:
                 curline -= 1
+                if pos > 0:
+                    pos -= 1
             elif c == curses.KEY_DOWN:
                 curline += 1
+                if pos < Grub.ENTRY_WIN_LINES - 1:
+                    pos += 1
             elif c == ord('b'):
                 self.isdone = True
                 break
@@ -507,7 +522,7 @@
                 # find the kernel line, edit it and then boot
                 img = self.cf.images[self.selected_image]
                 for line in img.lines:
-                    if line.startswith("kernel"):
+                    if line.startswith("kernel") or line.startswith("linux"):
                         l = self.edit_line(line)
                         if l is not None:
                             img.set_from_line(l, replace = True)
---
Miroslav Rezanina
Software Engineer - Virtualization Team - XEN kernel


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.