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

[Xen-devel] [RFC]output log messages to the user console and logfile by creating a fifo file at XendBootloader.py



 Hello everyone!

 When pygub failed, we could not get the detail log.
 So I'd like the feature of putting the detail log of pygrub
 to logfile and user console.

 I created a fifo file shared by XendBootloader.py and pygrub to output
 some messages from the pygrub into the user console.
 I can't think out of any other easy way to realize it.
 If you have a better idea,
 could you tell me some details about it?

 Regards.
 Sun Shuchun
diff --git a/pygrub.bak b/pygrub
index 3a44846..3fd370d 100755
--- a/pygrub.bak
+++ b/pygrub
@@ -25,8 +25,20 @@ import fsimage
 import grub.GrubConf
 import grub.LiloConf
 
+import traceback
+
 PYGRUB_VER = 0.6
 
+def pipe_file_w(str):
+        fd_kiharu = os.open(output_kiharu, os.O_RDWR)
+        try:
+            buf = os.write(fd_kiharu, "\n"+str)
+            os.close(fd_kiharu)
+        except:
+            logging.error("pipe file IO: %s", traceback.format_exc())
+            return False
+        return True
+
 def enable_cursor(ison):
     if ison:
         val = 2
@@ -39,21 +51,43 @@ def enable_cursor(ison):
         pass
 
 def is_disk_image(file):
-    fd = os.open(file, os.O_RDONLY)
-    buf = os.read(fd, 512)
-    os.close(fd)
+    #return False
+    try:
+        fd = os.open(file, os.O_RDONLY)
+        buf = os.read(fd, 512)
+        os.close(fd)
+    except IOError, msg:
+        logging.error("[is_disk_image]: %s", msg)
+        
+    flag1=(len(buf) >= 512)
+    flag2=(struct.unpack("H", buf[0x1fe: 0x200]) == (0xaa55,))
 
-    if len(buf) >= 512 and \
-           struct.unpack("H", buf[0x1fe: 0x200]) == (0xaa55,):
+    if flag1 and flag2:
         return True
+    
+    if not flag1 and flag2:
+        str="[is_disk_image]: boot image file size > 512Byte"
+        logging.error(str)
+    elif not flag2 and flag1:
+        str="[is_disk_image]: boot image file is not end with '0xaa55'"        
+        logging.error(str)        
+    else:
+        str="[is_disk_image]: file("+file+")is not a correct disk image format"
+        logging.error(str)  
+    pipe_file_w(str)
     return False
 
 def get_active_partition(file):
     """Find the offset for the start of the first active partition "
     "in the disk image file."""
-
-    fd = os.open(file, os.O_RDONLY)
-    buf = os.read(fd, 512)
+    try: 
+       fd = os.open(file, os.O_RDONLY)
+       buf = os.read(fd, 512)
+    except IOError. msg:
+        str="[get_active_partition]: %s"+msg
+        pipe_file_w(str)
+        logging.error(str)
+        
     for poff in (446, 462, 478, 494): # partition offsets
         # active partition has 0x80 as the first byte
         if struct.unpack("<c", buf[poff:poff+1]) == ('\x80',):
@@ -70,11 +104,13 @@ V_ROOT=0x2
 
 def get_solaris_slice(file, offset):
     """Find the root slice in a Solaris VTOC."""
-
     fd = os.open(file, os.O_RDONLY)
     os.lseek(fd, offset + (DK_LABEL_LOC * SECTOR_SIZE), 0)
     buf = os.read(fd, 512)
     if struct.unpack("<H", buf[508:510])[0] != DKL_MAGIC:
+        str="[get_solaris_slice]: A suitable root slice does not exist at 
file(%s)"+file
+        pipe_file_w(str)
+        logging.error(str)
         raise RuntimeError, "Invalid disklabel magic"
 
     nslices = struct.unpack("<H", buf[30:32])[0]
@@ -85,7 +121,9 @@ def get_solaris_slice(file, offset):
         slicesect = struct.unpack("<L", buf[sliceoff+4:sliceoff+8])[0]
         if slicetag == V_ROOT:
             return slicesect * SECTOR_SIZE
-
+    str="[get_solaris_slice]: A root slice does not exist at file(%s)"+file
+    pipe_file_w(str)
+    logging.error(str)
     raise RuntimeError, "No root slice found"      
 
 def get_fs_offset_gpt(file):
@@ -101,10 +139,16 @@ FDISK_PART_GPT=0xee
 
 def get_fs_offset(file):
     if not is_disk_image(file):
+        str="[get_fs_offset]: is_disk_image(file)=0, return 0"
+        pipe_file_w(str)
+        logging.error(str)
         return 0
 
     partbuf = get_active_partition(file)
-    if len(partbuf) == 0:
+    if len(partbuf) == 0:        
+        str="[get_fs_offset]: Unable to find active partition on disk"
+        pipe_file_w(str)
+        logging.error(str)
         raise RuntimeError, "Unable to find active partition on disk"
 
     offset = struct.unpack("<L", partbuf[8:12])[0] * SECTOR_SIZE
@@ -368,6 +412,9 @@ class Grub:
         we're being given a raw config file rather than a disk image."""
         
         if not os.access(fn, os.R_OK):
+            str="Unable to access %s"+fn
+            pipe_file_w(str)
+            logging.error(str)            
             raise RuntimeError, "Unable to access %s" %(fn,)
 
         if platform.machine() == 'ia64':
@@ -398,6 +445,9 @@ class Grub:
                 self.cf.filename = f
                 break
         if self.__dict__.get('cf', None) is None:
+            str="couldn't find bootloader config file in the image provided."
+            pipe_file_w(str)
+            logging.error(str)
             raise RuntimeError, "couldn't find bootloader config file in the 
image provided."
         f = fs.open_file(self.cf.filename)
         buf = f.read()
@@ -552,6 +602,9 @@ def run_grub(file, entry, fs, arg):
 
     if sel == -1:
         print "No kernel image selected!"
+        str="[run_grub]: No kernel image selected"
+        pipe_file_w(str)
+        logging.error(str)
         sys.exit(1)
 
     try:
@@ -571,7 +624,7 @@ def run_grub(file, entry, fs, arg):
 
 # If nothing has been specified, look for a Solaris domU. If found, perform the
 # necessary tweaks.
-def sniff_solaris(fs, cfg):
+def sniff_solaris(fs, cfg):     
     if not fs.file_exists("/platform/i86xpv/kernel/unix"):
         return cfg
     
@@ -620,8 +673,13 @@ def sniff_netware(fs, cfg):
     return cfg
 
 if __name__ == "__main__":
-    sel = None
     
+    logging.basicConfig(level=logging.DEBUG,
+                        format='%(asctime)s %(levelname)s %(message)s',
+                        datefmt='%a,%d %b %Y %H:%M:%S',
+                        filename='/var/log/xen/pygrub.log',
+                        filemode='w')
+
     def usage():
         print >> sys.stderr, "Usage: %s [-q|--quiet] [-i|--interactive] 
[--output=] [--kernel=] [--ramdisk=] [--args=] [--entry=] <image>" 
%(sys.argv[0],)
 
@@ -677,8 +735,10 @@ if __name__ == "__main__":
     if output is None or output == "-":
         fd = sys.stdout.fileno()
     else:
-        fd = os.open(output, os.O_WRONLY)
-
+        fd = os.open(output, os.O_WRONLY)  
+    output_kiharu = output + "kiharu"
+    
     # debug
     if isconfig:
         chosencfg = run_grub(file, entry, fs, incfg["args"])
@@ -690,11 +750,21 @@ if __name__ == "__main__":
 
     # if boot filesystem is set then pass to fsimage.open
     bootfsargs = '"%s"' % incfg["args"]
-    bootfsgroup = re.findall('zfs-bootfs=(.*?)[\s\,\"]', bootfsargs)
+    bootfsgroup = re.findall('zfs-bootfs=(.*?)[\s\,\"]', bootfsargs)   
     if bootfsgroup:
-        fs = fsimage.open(file, get_fs_offset(file), bootfsgroup[0])
+        try:
+           fs = fsimage.open(file, get_fs_offset(file), bootfsgroup[0])
+        except:
+            str="__main_\:%s"+traceback.format_exc()
+            pipe_file_w(str)
+            logging.error(str)
     else:
-        fs = fsimage.open(file, get_fs_offset(file))
+        try:
+            fs = fsimage.open(file, get_fs_offset(file))   
+        except:
+            str="__main__:%s"+traceback.format_exc() 
+            pipe_file_w(str)
+            logging.error(str)
 
     chosencfg = sniff_solaris(fs, incfg)
 
@@ -704,34 +774,50 @@ if __name__ == "__main__":
     if not chosencfg["kernel"]:
         chosencfg = run_grub(file, entry, fs, incfg["args"])
 
-    data = fs.open_file(chosencfg["kernel"]).read()
-    (tfd, bootcfg["kernel"]) = tempfile.mkstemp(prefix="boot_kernel.",
-        dir="/var/run/xend/boot")
-    os.write(tfd, data)
-    os.close(tfd)
-
-    if chosencfg["ramdisk"]:
-        data = fs.open_file(chosencfg["ramdisk"],).read()
-        (tfd, bootcfg["ramdisk"]) = tempfile.mkstemp(prefix="boot_ramdisk.",
-            dir="/var/run/xend/boot")
+    try:
+        data = fs.open_file(chosencfg["kernel"]).read()
+        (tfd, bootcfg["kernel"]) = tempfile.mkstemp(prefix="boot_kernel.",
+              dir="/var/run/xend/boot")
         os.write(tfd, data)
         os.close(tfd)
-    else:
-        initrd = None
-
-    sxp = "linux (kernel %s)" % bootcfg["kernel"]
-    if bootcfg["ramdisk"]:
-        sxp += "(ramdisk %s)" % bootcfg["ramdisk"]
-    if chosencfg["args"]:
-        zfsinfo = fsimage.getbootstring(fs)
-        if zfsinfo is None:
-            sxp += "(args \"%s\")" % chosencfg["args"]
+    except:
+        str="__main__: %s"+traceback.format_exc()
+        pipe_file_w(str)
+        logging.error(str)
+
+    try:  
+        if chosencfg["ramdisk"]:
+            data = fs.open_file(chosencfg["ramdisk"],).read()
+            (tfd, bootcfg["ramdisk"]) = 
tempfile.mkstemp(prefix="boot_ramdisk.",
+                dir="/var/run/xend/boot")
+            os.write(tfd, data)
+            os.close(tfd)
         else:
-            e = re.compile("zfs-bootfs=[\w\-\.\:@/]+" )
-            (chosencfg["args"],count) = e.subn(zfsinfo, chosencfg["args"])
-            if count == 0:
-               chosencfg["args"] += " -B %s" % zfsinfo
-            sxp += "(args \"%s\")" % (chosencfg["args"])
+            initrd = None
+    except:
+        str="__main__: %s"+traceback.format_exc()
+        pipe_file_w(str)
+        logging.error(str)
+
+    try:
+        sxp = "linux (kernel %s)" % bootcfg["kernel"]
+
+        if bootcfg["ramdisk"]:
+            sxp += "(ramdisk %s)" % bootcfg["ramdisk"]
+        if chosencfg["args"]:
+            zfsinfo = fsimage.getbootstring(fs)
+            if zfsinfo is None:
+                sxp += "(args \"%s\")" % chosencfg["args"]
+            else:
+                e = re.compile("zfs-bootfs=[\w\-\.\:@/]+" )
+                (chosencfg["args"],count) = e.subn(zfsinfo, chosencfg["args"])
+                if count == 0:
+                   chosencfg["args"] += " -B %s" % zfsinfo
+                sxp += "(args \"%s\")" % (chosencfg["args"])
+    except:
+        str="__main__: %s"+traceback.format_exc()
+        pipe_file_w(str)
+        logging.error(str)     
 
     sys.stdout.flush()
     os.write(fd, sxp)
diff --git a/XendBootloader.py.bak b/XendBootloader.py
index 20bade2..6137b94 100644
--- a/XendBootloader.py.bak
+++ b/XendBootloader.py
@@ -52,6 +52,10 @@ def bootloader(blexec, disk, dom, quiet = False, blargs = 
'', kernel = '',
         fifo = "/var/run/xend/boot/xenbl.%s" %(random.randint(0, 32000),)
         try:
             os.mkfifo(fifo, 0600)
+            kiharu_fifo=fifo+"kiharu"
+            os.mkfifo(kiharu_fifo, 0600)
+
         except OSError, e:
             if (e.errno != errno.EEXIST):
                 raise
@@ -116,7 +120,7 @@ def bootloader(blexec, disk, dom, quiet = False, blargs = 
'', kernel = '',
             oshelp.close_fds()
             os.execvpe(args[0], args, env)
         except OSError, e:
-            print e
+            print e  
             pass
         os._exit(1)
 
@@ -132,12 +136,17 @@ def bootloader(blexec, disk, dom, quiet = False, blargs = 
'', kernel = '',
     while True:
         try:
             r = os.open(fifo, os.O_RDONLY)
+            r_kiharu = os.open(kiharu_fifo, os.O_RDONLY)
         except OSError, e:
             if e.errno == errno.EINTR:
                 continue
         break
 
     fcntl.fcntl(r, fcntl.F_SETFL, os.O_NDELAY);
+    fcntl.fcntl(r_kiharu, fcntl.F_SETFL, os.O_NDELAY) 
+    ret_kiharu = ""
 
     ret = ""
     inbuf=""; outbuf="";
@@ -162,7 +171,9 @@ def bootloader(blexec, disk, dom, quiet = False, blargs = 
'', kernel = '',
             wsel = wsel + [m1]
         if len(inbuf) != 0:
             wsel = wsel + [m2]
-        sel = select.select([r, m1, m2], wsel, [])
+        #sel = select.select([r, m1, m2], wsel, [])
+        sel = select.select([r,r_kiharu,m1,m2], wsel, [])
         try: 
             if m1 in sel[0]:
                 s = os.read(m1, 16)
@@ -186,6 +197,10 @@ def bootloader(blexec, disk, dom, quiet = False, blargs = 
'', kernel = '',
         if r in sel[0]:
             s = os.read(r, 128)
             ret = ret + s
+            s_kiharu = os.read(r_kiharu, 1024)
+            ret_kiharu = ret_kiharu + s_kiharu
+
             if len(s) == 0:
                 break
     del inbuf
@@ -194,6 +209,8 @@ def bootloader(blexec, disk, dom, quiet = False, blargs = 
'', kernel = '',
     os.close(r)
     os.close(m2)
     os.close(m1)
+    os.close(r_kiharu)
     if os.uname()[0] == 'SunOS' or os.uname()[0] == 'NetBSD':
         os.close(s1)
     os.unlink(fifo)
@@ -210,7 +227,9 @@ def bootloader(blexec, disk, dom, quiet = False, blargs = 
'', kernel = '',
     dom.bootloader_pid = None
     
     if len(ret) == 0:
-        msg = "Boot loader didn't return any data!kiharu test1"
+        msg = "Boot loader didn't return any data!"
+        msg = msg + ret_kiharu 
         log.error(msg)
         raise VmError, msg
 
_______________________________________________
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®.