[Pkg-uml-pkgs] Bug#401314: enable debug=true with logging and running in the background

shaulka at 012.net.il shaulka at 012.net.il
Sat Dec 2 14:52:25 CET 2006


Package: rootstrap
Version: 0.3.24-1
Severity: wishlist
Tags: patch

  The following enables debugging as well as logging with the -o
switch or by redirecting the output to a file, while avoiding the case
where the UML stdin is taken from the console and its stdout is 
directed to a file. I believe that preventing debugging when a log
file is being used makes debugging more difficult.
  It also enables running rootstrap in the background.
  There is also a somewhat more obvious prompt for the UML
terminal and a usage of UML exitcode.


--- builder.orig     2006-12-02 13:06:04.000000000 +0200
+++ builder.new  2006-12-02 13:16:54.000000000 +0200
@@ -42,35 +42,59 @@
         script = scriptpat % module

        if os.path.exists(script):
-           # try to ease module debugging
-           #
-           # debug_exit == 0 --> exit and raise exception
-           #               1 --> re-eval script that failed
-           #               2 --> go on with next script
-           #               X --> exit and raise exception
            while 1:
                 print "Using rootstrap module %s from:\n\t%s" % (module,script)
                 status = os.spawnle(os.P_WAIT, script, script, vars)

                 if status != 0:
-                   if "debug" in vars and vars["debug"] == "true":
-                       print "Module %s failed with status %d: %s" % \
-                                       (module,status,os.strerror(status))
-                       print "The exit value from the shell will be evaluated:"
-                       print "   0 --> exit and raise exception"
-                       print "   1 --> re-eval script that failed"
-                       print "   2 --> go on with next script"
-                       print "   N --> exit and raise exception"
-                       debug_exit = os.spawnle(os.P_WAIT, "/bin/sh", "/bin/sh", vars)
-                       if debug_exit == 1:
-                           continue
-                       elif debug_exit == 2:
-                           return

-                   raise "rootstrap: Module '%s' failed, status %d: %s" % \
-                               (module,status,os.strerror(status))
+                   print "Module %s failed with status %d" %  \
+                                                        (module,status)
+
+                   if 'debug' in vars  and  vars['debug'] == 'true':
+                       if 'Redirected' not in  \
+                             os.environ['backgroundRedirection']  and  \
+                          'Background' not in  \
+                             os.environ['backgroundRedirection']:
+                           if 'PS1' not in vars:
+                                         vars['PS1']='UML:\s-\\v\$ '
+                           #
+                           # try to ease module debugging by spawning
+                           # a shell and evaluatig its exit value
+                           #
+                           print "The exit value of this shell will be "  \
+                                 "evaluated as follows:\n"             \
+                                 "\t0 --> raise exception and exit UML\n"\
+                                 "\t1 --> re-eval script that failed\n"  \
+                                 "\t2 --> go on with next script\n"      \
+                                 "\tX --> raise exception and exit\n"    \
+                                 "If you don't understand what this is " \
+                                 "all about, type\n"                     \
+                                 "\t\texit 0\n"                          \
+                           # debug_exit == 0 --> raise exception and exit
+                           #               1 --> re-eval script that failed
+                           #               2 --> go on with next script
+                           #               X --> raise exception and exit
+                           debug_exit = os.spawnle(os.P_WAIT,  \
+                                          "/bin/sh", "/bin/sh", vars)
+                           del vars['PS1']
+                            if debug_exit == 1:
+                               continue
+                           elif debug_exit == 2:
+                               return
+
+                        else:
+                            print "\n"  \
+                                  "\tRunning rootstrap interactively "  \
+                                   "with `debug=true' would have\n"    \
+                                  "\ttry to ease module debugging "     \
+                                   "by dropping into a UML terminal\n"
+
+                    raise "rootstrap: Module '%s' failed, status: %d" \
+                                                         % (module,status)
                return

+    print "rootstrap: unknown module: %s\n" % module
     raise "rootstrap: unknown module: %s\n" % module

 config = ConfigParser.ConfigParser()
@@ -89,8 +113,14 @@
     if config.has_section(module):
         for var in config.options(module):
             modulevars[var] = config.get(module,var)
-
-    dispatch(module, modulevars)
+
+    try:
+        dispatch(module, modulevars)
+    except:
+        exitcode = open('/proc/exitcode','w')
+        exitcode.write('1\n')
+        exitcode.close()
+        break

 os.system("mount -o remount,ro hostfs /")
 os.system("/sbin/halt -d -f")

--- rootstrap.orig   2006-12-02 13:02:06.000000000 +0200
+++ rootstrap.new        2006-12-02 13:23:41.000000000 +0200
@@ -59,12 +59,8 @@
     if opt in ('-s', '--image-size'):
         imagesize = long(arg)
     elif opt in ('-o',):
-               if not config.has_option('global', 'debug') or \
-                                               config.get('global', 'debug') != 'true':
-                               log = open(arg,"w")
-                               os.dup2(log.fileno(), sys.stdout.fileno())
-               else:
-                               print "Ignoring -o because the debug option is set"
+               log = open(arg,"w")
+               os.dup2(log.fileno(), sys.stdout.fileno())
     elif opt in ('-c', '--config'):
         umlargs_extra.append('rsconfig=%s' % os.path.abspath(os.path.expanduser(arg)))
     elif opt in ('-u', '--umlarg'):
@@ -117,6 +113,27 @@
     image.truncate(imagesize * 1048576L)
     image.close()

+backgroundRedirection = ''
+if sys.stdin.isatty()  and  \
+        os.tcgetpgrp(sys.stdin.fileno()) != os.getpgrp():
+    (block_on_read,not_to_be_written_to) = os.pipe()
+    os.dup2(block_on_read,sys.stdin.fileno())
+    backgroundRedirection += 'Background'
+if sys.stdout.isatty()  and  \
+        os.tcgetpgrp(sys.stdout.fileno()) != os.getpgrp():
+    sink = open('/dev/null','w')
+    os.dup2(sink.fileno(), sys.stdout.fileno())
+    if 'Background' not in backgroundRedirection:
+        backgroundRedirection += 'Background'
+if sys.stderr.isatty()  and  \
+        os.tcgetpgrp(sys.stderr.fileno()) != os.getpgrp()  and  \
+            'Background' not in backgroundRedirection:
+    backgroundRedirection += 'Background'
+if not ( sys.stdin.isatty()  and  sys.stdout.isatty()  and  \
+              sys.stderr.isatty() ):
+    backgroundRedirection += 'Redirected'
+umlargs.append('backgroundRedirection=%s' % backgroundRedirection)
+
 if os.spawnvpe(os.P_WAIT,umlargs[0], umlargs, os.environ) != 0:
     sys.stderr.write("UML exited with non-zero status, aborting\n")
     sys.exit(1)


  As an aside, those issues are also related to using pseudo
terminals. Perhaps rootstrap should have used python's pty
module.









More information about the Pkg-uml-pkgs mailing list