All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] xen-booloader: pygrub improvement & bug fix
@ 2005-04-29  3:56 aq
  2005-04-29 15:17 ` Jeremy Katz
  0 siblings, 1 reply; 3+ messages in thread
From: aq @ 2005-04-29  3:56 UTC (permalink / raw)
  To: Jeremy Katz, xen-devel@lists.xensource.com

[-- Attachment #1: Type: text/plain, Size: 1147 bytes --]

hello,

here is a patch to improve and fix few bugs in pygrub of xen-booloader. 

1) If you already patched my last 2 patches on top of last Jeremy's
patch, then go on to apply pygrub.aq.patch.

# diffstat pygrub.aq.patch 
 pygrub |   53 +++++++++++++++++++++++++++--------------------------
 1 files changed, 27 insertions(+), 26 deletions(-)

2) If you havent applied any patches on top of last Jeremy's patch,
the take pygrub.aq2.patch instead (this patch includes fix on
/boot/grub/menu.lst problem).

# diffstat pygrub.aq2.patch 
 pygrub |   63 ++++++++++++++++++++++++++++++++++++---------------------------
 1 files changed, 36 insertions(+), 27 deletions(-)

List of changes:
- temporarily remove usage of use_default_colors(), since python 2.3
doesnt support this method.
- allow user to press 'q' to quit pygrub
- corretly handle timeout feature
- fix bug on fill_entries (incorrect check & display menu items)
- incorrect check on boot entry (idx variable)
- remove abundant checking on disk image
- deinitialize curses before quitting.
- fix few typos

Signed-off-by: Nguyen Anh Quynh <aquynh@gmail.com>

[-- Attachment #2: pygrub.aq.patch --]
[-- Type: application/octet-stream, Size: 5277 bytes --]

--- pygrub.org/src/pygrub	2005-04-29 00:07:31.000000000 +0900
+++ pygrub/src/pygrub	2005-04-29 12:36:18.937028000 +0900
@@ -16,7 +16,7 @@
 import os, sys, string, struct, tempfile
 import logging
 
-import curses, _curses, curses.wrapper
+import curses, curses.wrapper
 import getopt
 
 sys.path = [ '/usr/lib/python' ] + sys.path
@@ -29,7 +29,7 @@ PYGRUB_VER = 0.02
 
 def draw_window():
     stdscr = curses.initscr()
-    curses.use_default_colors()
+    # curses.use_default_colors()
     try:
         curses.curs_set(0)
     except _curses.error:
@@ -45,6 +45,7 @@ def draw_window():
     stdscr.addstr(13, 5, "Press enter to boot the selected OS. 'e' to edit the")
     stdscr.addstr(14, 5, "commands before booting, 'a' to modify the kernel arguments ")
     stdscr.addstr(15, 5, "before booting, or 'c' for a command line.")
+    stdscr.addstr(16, 5, "Press 'q' to quit.")
     stdscr.addch(12, 13, curses.ACS_UARROW)
     stdscr.addch(12, 19, curses.ACS_DARROW)
     (y, x) = stdscr.getmaxyx()
@@ -57,13 +58,13 @@ def fill_entries(win, cfg, selected):
     y = 0
 
     for i in cfg.images:
-        if (0, y) > win.getmaxyx():
+        if y > win.getmaxyx()[0]:
             break
         if y == selected:
             attr = curses.A_REVERSE
         else:
             attr = 0
-        win.addstr(y + 1, 2, i.title.ljust(70), attr)
+        win.addstr(y + 1, 2, i.title.ljust(70)[:70], attr)
         y += 1
     win.refresh()
 
@@ -77,7 +78,7 @@ def is_disk_image(file):
     buf = os.read(fd, 512)
     os.close(fd)
 
-    if len(buf) >= 512 and struct.unpack("H", buf[0x1fe: 0x200]) == (0xaaff):
+    if len(buf) == 512 and struct.unpack("H", buf[0x1fe: 0x200]) == (0xaaff):
         return True
     return False
 
@@ -88,7 +89,7 @@ def get_config(fn):
     cf = grub.GrubConf.GrubConfigFile()
 
     if is_disk_image(fn):
-        raise RuntimeError, "appears to be a full disk image... unable to handle this yet"
+        raise RuntimeError, "Appears to be a full disk image... unable to handle this yet"
 
     # open the image and read the grub config
     fs = None
@@ -103,7 +104,7 @@ def get_config(fn):
         elif fs.file_exist("/boot/grub/grub.conf"):
             grubfile = "/boot/grub/grub.conf"
         else:
-            raise RuntimeError, "we couldn't find /boot/grub{menu.lst,grub.conf} " + \
+            raise RuntimeError, "We couldn't find /boot/grub/{menu.lst,grub.conf} " + \
                                 "in the image provided. halt!"
         f = fs.open_file(grubfile)
         buf = f.read()
@@ -149,11 +150,12 @@ def main(cf = None):
             
         fill_entries(win, cf, selected)
         c = stdscr.getch()
-        if mytime != -1:
-            mytime += 1
-#        if c == ord('q'):
-#            selected = -1
-#            break
+        if (c == -1):
+            if mytime != -1:
+                mytime += 1
+        if c == ord('q'):
+           selected = -1
+           break
         elif c == ord('c'):
             # FIXME: needs to go to command line mode
             continue
@@ -180,14 +182,14 @@ def main(cf = None):
         elif selected >= len(cf.images):
             selected = len(cf.images) - 1
 
-    if selected >= 0:
-        return selected
+    return selected
 
 if __name__ == "__main__":
     sel = None
     
     def run_main(scr, *args):
         global sel
+        global cf
         sel = main(cf)
 
     def usage():
@@ -229,13 +231,16 @@ if __name__ == "__main__":
     cf = get_config(file)
     if interactive:
         curses.wrapper(run_main)
+        if sel == -1:   # user has chosen to quit
+            curses.endwin()
+            sys.exit(1)
     else:
         sel = cf.default
 
     # set the entry to boot as requested
     if entry is not None:
         idx = get_entry_idx(cf, entry)
-        if idx is not None and idx > 0 and idx < len(cf.images):
+        if idx is not None and idx >= 0 and idx < len(cf.images):
             sel = idx
 
     img = cf.images[sel]
@@ -244,35 +249,31 @@ if __name__ == "__main__":
     if img.initrd:
         print "  initrd: %s" %(img.initrd[1],)
 
-    if is_disk_image(file):
-        raise RuntimeError, "unable to handle full disk images yet"
-
     # read the kernel and initrd onto the hostfs
     fs = None
     for fstype in grub.fsys.fstypes.values():
         if fstype.sniff_magic(file):
             fs = fstype.open_fs(file)
             break
-
-    if fs is None:
-        raise RuntimeError, "Unable to open filesystem"
+    else:
+        raise RuntimeError, "Unable to open filesystem or filesystem not supported"
 
     kernel = fs.open_file(img.kernel[1],).read()
     (tfd, fn) = tempfile.mkstemp(prefix="vmlinuz.")
     os.write(tfd, kernel)
     os.close(tfd)
-    sxp = "linux (kernel %s)" %(fn,)
+    sxp = "linux (kernel %s) " %(fn,)
 
     if img.initrd:
         initrd = fs.open_file(img.initrd[1],).read()
         (tfd, fn) = tempfile.mkstemp(prefix="initrd.")
         os.write(tfd, initrd)
         os.close(tfd)
-        sxp += "(ramdisk %s)" %(fn,)
-    else:
-        initrd = None
-    sxp += "(args '%s')" %(img.args,)
+        sxp += "(ramdisk %s) " %(fn,)
+
+    sxp += "(args '%s')\n" %(img.args,)
 
     sys.stdout.flush()
     os.write(fd, sxp)
     
+    curses.endwin()

[-- Attachment #3: pygrub.aq2.patch --]
[-- Type: application/octet-stream, Size: 5567 bytes --]

--- unstable.27.3.org/tools/pygrub/src/pygrub	2005-04-27 17:53:05.000000000 +0900
+++ unstable.27.3/tools/pygrub/src/pygrub	2005-04-29 12:36:18.937028000 +0900
@@ -16,9 +16,11 @@
 import os, sys, string, struct, tempfile
 import logging
 
-import curses, _curses, curses.wrapper
+import curses, curses.wrapper
 import getopt
 
+sys.path = [ '/usr/lib/python' ] + sys.path
+
 import grub.GrubConf
 import grub.fsys
 
@@ -27,7 +29,7 @@ PYGRUB_VER = 0.02
 
 def draw_window():
     stdscr = curses.initscr()
-    curses.use_default_colors()
+    # curses.use_default_colors()
     try:
         curses.curs_set(0)
     except _curses.error:
@@ -43,6 +45,7 @@ def draw_window():
     stdscr.addstr(13, 5, "Press enter to boot the selected OS. 'e' to edit the")
     stdscr.addstr(14, 5, "commands before booting, 'a' to modify the kernel arguments ")
     stdscr.addstr(15, 5, "before booting, or 'c' for a command line.")
+    stdscr.addstr(16, 5, "Press 'q' to quit.")
     stdscr.addch(12, 13, curses.ACS_UARROW)
     stdscr.addch(12, 19, curses.ACS_DARROW)
     (y, x) = stdscr.getmaxyx()
@@ -55,13 +58,13 @@ def fill_entries(win, cfg, selected):
     y = 0
 
     for i in cfg.images:
-        if (0, y) > win.getmaxyx():
+        if y > win.getmaxyx()[0]:
             break
         if y == selected:
             attr = curses.A_REVERSE
         else:
             attr = 0
-        win.addstr(y + 1, 2, i.title.ljust(70), attr)
+        win.addstr(y + 1, 2, i.title.ljust(70)[:70], attr)
         y += 1
     win.refresh()
 
@@ -75,10 +78,9 @@ def is_disk_image(file):
     buf = os.read(fd, 512)
     os.close(fd)
 
-    if len(buf) >= 512 and struct.unpack("H", buf[0x1fe: 0x200]) == (0xaaff):
+    if len(buf) == 512 and struct.unpack("H", buf[0x1fe: 0x200]) == (0xaaff):
         return True
     return False
-    
 
 def get_config(fn):
     if not os.access(fn, os.R_OK):
@@ -87,7 +89,7 @@ def get_config(fn):
     cf = grub.GrubConf.GrubConfigFile()
 
     if is_disk_image(fn):
-        raise RuntimeError, "appears to be a full disk image... unable to handle this yet"
+        raise RuntimeError, "Appears to be a full disk image... unable to handle this yet"
 
     # open the image and read the grub config
     fs = None
@@ -97,7 +99,14 @@ def get_config(fn):
             break
 
     if fs is not None:
-        f = fs.open_file("/boot/grub/grub.conf")
+        if fs.file_exist("/boot/grub/menu.lst"):
+            grubfile = "/boot/grub/menu.lst"
+        elif fs.file_exist("/boot/grub/grub.conf"):
+            grubfile = "/boot/grub/grub.conf"
+        else:
+            raise RuntimeError, "We couldn't find /boot/grub/{menu.lst,grub.conf} " + \
+                                "in the image provided. halt!"
+        f = fs.open_file(grubfile)
         buf = f.read()
         f.close()
         fs.close()
@@ -141,11 +150,12 @@ def main(cf = None):
             
         fill_entries(win, cf, selected)
         c = stdscr.getch()
-        if mytime != -1:
-            mytime += 1
-#        if c == ord('q'):
-#            selected = -1
-#            break
+        if (c == -1):
+            if mytime != -1:
+                mytime += 1
+        if c == ord('q'):
+           selected = -1
+           break
         elif c == ord('c'):
             # FIXME: needs to go to command line mode
             continue
@@ -172,14 +182,14 @@ def main(cf = None):
         elif selected >= len(cf.images):
             selected = len(cf.images) - 1
 
-    if selected >= 0:
-        return selected
+    return selected
 
 if __name__ == "__main__":
     sel = None
     
     def run_main(scr, *args):
         global sel
+        global cf
         sel = main(cf)
 
     def usage():
@@ -221,13 +231,16 @@ if __name__ == "__main__":
     cf = get_config(file)
     if interactive:
         curses.wrapper(run_main)
+        if sel == -1:   # user has chosen to quit
+            curses.endwin()
+            sys.exit(1)
     else:
         sel = cf.default
 
     # set the entry to boot as requested
     if entry is not None:
         idx = get_entry_idx(cf, entry)
-        if idx is not None and idx > 0 and idx < len(cf.images):
+        if idx is not None and idx >= 0 and idx < len(cf.images):
             sel = idx
 
     img = cf.images[sel]
@@ -236,35 +249,31 @@ if __name__ == "__main__":
     if img.initrd:
         print "  initrd: %s" %(img.initrd[1],)
 
-    if is_disk_image(file):
-        raise RuntimeError, "unable to handle full disk images yet"
-
     # read the kernel and initrd onto the hostfs
     fs = None
     for fstype in grub.fsys.fstypes.values():
         if fstype.sniff_magic(file):
             fs = fstype.open_fs(file)
             break
-
-    if fs is None:
-        raise RuntimeError, "Unable to open filesystem"
+    else:
+        raise RuntimeError, "Unable to open filesystem or filesystem not supported"
 
     kernel = fs.open_file(img.kernel[1],).read()
     (tfd, fn) = tempfile.mkstemp(prefix="vmlinuz.")
     os.write(tfd, kernel)
     os.close(tfd)
-    sxp = "linux (kernel %s)" %(fn,)
+    sxp = "linux (kernel %s) " %(fn,)
 
     if img.initrd:
         initrd = fs.open_file(img.initrd[1],).read()
         (tfd, fn) = tempfile.mkstemp(prefix="initrd.")
         os.write(tfd, initrd)
         os.close(tfd)
-        sxp += "(ramdisk %s)" %(fn,)
-    else:
-        initrd = None
-    sxp += "(args '%s')" %(img.args,)
+        sxp += "(ramdisk %s) " %(fn,)
+
+    sxp += "(args '%s')\n" %(img.args,)
 
     sys.stdout.flush()
     os.write(fd, sxp)
     
+    curses.endwin()

[-- Attachment #4: Type: text/plain, Size: 138 bytes --]

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

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2005-04-29 15:52 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-04-29  3:56 [PATCH] xen-booloader: pygrub improvement & bug fix aq
2005-04-29 15:17 ` Jeremy Katz
2005-04-29 15:52   ` aq

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.