diff options
author | Michal Toman <mtoman@redhat.com> | 2011-04-18 16:07:13 +0200 |
---|---|---|
committer | Michal Toman <mtoman@redhat.com> | 2011-04-18 16:07:13 +0200 |
commit | 46caacf049b52bde5a35c2d861dda71dfeddd346 (patch) | |
tree | 57c9cfe27185751b64959ed45da2a86fcb1014a9 /src | |
parent | 0a41c4fdf4b242f77445a3e6d73443b40b6e460e (diff) | |
download | abrt-46caacf049b52bde5a35c2d861dda71dfeddd346.tar.gz abrt-46caacf049b52bde5a35c2d861dda71dfeddd346.tar.xz abrt-46caacf049b52bde5a35c2d861dda71dfeddd346.zip |
retrace server: add more detailed status messages
Diffstat (limited to 'src')
-rw-r--r-- | src/retrace/retrace.py | 15 | ||||
-rw-r--r-- | src/retrace/status.wsgi | 10 | ||||
-rwxr-xr-x | src/retrace/worker.py | 79 |
3 files changed, 73 insertions, 31 deletions
diff --git a/src/retrace/retrace.py b/src/retrace/retrace.py index dfebcb62..28033619 100644 --- a/src/retrace/retrace.py +++ b/src/retrace/retrace.py @@ -60,6 +60,21 @@ CONFIG = { "DBFile": "stats.db", } +STATUS_ANALYZE, STATUS_INIT, STATUS_BACKTRACE, STATUS_CLEANUP, \ +STATUS_STATS, STATUS_FINISHING, STATUS_SUCCESS, STATUS_FAIL = xrange(8) + +STATUS = [ + "Analyzing crash data", + "Initializing virtual root", + "Generating backtrace", + "Cleaning up virtual root", + "Saving crash statistics", + "Finishing task", + "Retrace job finished successfully", + "Retrace job failed", +] + + def lock(lockfile): try: if not os.path.isfile(lockfile): diff --git a/src/retrace/status.wsgi b/src/retrace/status.wsgi index eb153b05..437d15ed 100644 --- a/src/retrace/status.wsgi +++ b/src/retrace/status.wsgi @@ -35,4 +35,12 @@ def application(environ, start_response): else: status = "FINISHED_FAILURE" - return response(start_response, "200 OK", status, [("X-Task-Status", status)]) + statusmsg = status + try: + statusfile = open("%s/status" % taskdir, "r") + statusmsg = statusfile.read() + statusfile.close() + except: + pass + + return response(start_response, "200 OK", statusmsg, [("X-Task-Status", status)]) diff --git a/src/retrace/worker.py b/src/retrace/worker.py index 8ac11f1e..47ef5685 100755 --- a/src/retrace/worker.py +++ b/src/retrace/worker.py @@ -5,6 +5,28 @@ import time from retrace import * LOG = None +taskid = None + +def set_status(statusid): + "Sets status for the task" + if not LOG or not taskid: + return + + filepath = "%s/%s/status" % (CONFIG["SaveDir"], taskid) + try: + statusfile = open(filepath, "w") + statusfile.write(STATUS[statusid]) + statusfile.close() + except: + pass + + LOG.write("%s " % STATUS[statusid]) + +def fail(exitcode): + "Kills script with given exitcode" + LOG.close() + set_status(STATUS_FAIL) + sys.exit(exitcode) def retrace_run(errorcode, cmd): "Runs cmd using subprocess.Popen and kills script with errorcode on failure" @@ -19,8 +41,7 @@ def retrace_run(errorcode, cmd): if not process or process.returncode != 0: LOG.write("Error %d:\n=== OUTPUT ===\n%s\n" % (errorcode, output)) - LOG.close() - sys.exit(errorcode) + fail(errorcode) return output @@ -33,7 +54,7 @@ if __name__ == "__main__": taskid = sys.argv[1] try: - int(taskid) + taskid_int = int(sys.argv[1]) except: sys.stderr.write("Task ID may only contain digits.\n") sys.exit(12) @@ -44,7 +65,7 @@ if __name__ == "__main__": workdir = "%s/%s" % (CONFIG["WorkDir"], taskid) if not os.path.isdir(savedir): - sys.stderr.write("Task '%s' does not exist.\n" % workdir) + sys.stderr.write("Task '%s' does not exist.\n" % taskid) sys.exit(13) try: @@ -53,20 +74,20 @@ if __name__ == "__main__": sys.stderr.write("Unable to start logging for task '%s': %s.\n" % (taskid, ex)) sys.exit(14) + set_status(STATUS_ANALYZE) + # check the crash directory for required files for required_file in REQUIRED_FILES: if not os.path.isfile("%s/crash/%s" % (savedir, required_file)): LOG.write("Crash directory does not contain required file '%s'.\n" % required_file) - LOG.close() - sys.exit(15) + fail(15) # read architecture from coredump arch = guess_arch("%s/crash/coredump" % savedir) if not arch: LOG.write("Unable to read architecture from 'coredump' file.\n") - LOG.close() - sys.exit(16) + fail(16) # read package file try: @@ -75,8 +96,7 @@ if __name__ == "__main__": package_file.close() except Exception as ex: LOG.write("Unable to read crash package from 'package' file: %s.\n" % ex) - LOG.close() - sys.exit(17) + fail(17) # read release, distribution and version from release file release_path = "%s/crash/os_release" % savedir @@ -107,8 +127,7 @@ if __name__ == "__main__": LOG.write("%s-%s\n" % (distribution, version)) else: LOG.write("Failure\n") - LOG.close() - sys.exit(18) + fail(18) # read package file try: @@ -117,8 +136,7 @@ if __name__ == "__main__": package_file.close() except Exception as ex: LOG.write("Unable to read crash package from 'package' file: %s.\n" % ex) - LOG.close() - sys.exit(19) + fail(19) packages = crash_package @@ -144,8 +162,7 @@ if __name__ == "__main__": pipe.close() except Exception as ex: LOG.write("Unable to obtain packages from 'coredump' file: %s.\n" % ex) - LOG.close() - sys.exit(20) + fail(20) # create mock config file try: @@ -180,8 +197,9 @@ if __name__ == "__main__": mockcfg.close() except Exception as ex: LOG.write("Unable to create mock config file: %s.\n" % ex) - LOG.close() - sys.exit(21) + fail(21) + + LOG.write("OK\n") # get count of tasks running before starting prerunning = len(get_active_tasks()) - 1 @@ -189,21 +207,22 @@ if __name__ == "__main__": # run retrace mockr = "../../%s/mock" % savedir - LOG.write("Initializing virtual root... ") + set_status(STATUS_INIT) retrace_run(25, ["mock", "init", "-r", mockr]) retrace_run(26, ["mock", "-r", mockr, "--copyin", "%s/crash" % savedir, "/var/spool/abrt/crash"]) retrace_run(27, ["mock", "-r", mockr, "shell", "--", "chgrp", "-R", "mockbuild", "/var/spool/abrt/crash"]) + LOG.write("OK\n") + # generate backtrace - LOG.write("Generating backtrace... ") + set_status(STATUS_BACKTRACE) backtrace = run_gdb(savedir) if not backtrace: LOG.write("Error\n") - LOG.close() - sys.exit(29) + fail(29) try: bt_file = open("%s/backtrace" % savedir, "w") @@ -211,15 +230,14 @@ if __name__ == "__main__": bt_file.close() except Exception as ex: LOG.write("Error: %s.\n" % ex) - LOG.close() - sys.exit(30) + fail(30) LOG.write("OK\n") chroot_size = dir_size("%s/chroot/root" % workdir) # clean up temporary data - LOG.write("Cleaning up... ") + set_status(STATUS_CLEANUP) retrace_run(31, ["mock", "-r", mockr, "--scrub=all"]) retrace_run(32, ["rm", "-rf", "%s/mock.cfg" % savedir, "%s/crash" % savedir]) @@ -234,7 +252,7 @@ if __name__ == "__main__": LOG.write("OK\n") # save crash statistics - LOG.write("Saving crash statistics... ") + set_status(STATUS_STATS) duration = int(time.time() - starttime) @@ -249,7 +267,7 @@ if __name__ == "__main__": release = package_match.group(4) crashstats = { - "taskid": int(taskid), + "taskid": taskid_int, "package": package, "version": version, "release": release, @@ -267,16 +285,17 @@ if __name__ == "__main__": LOG.write("OK\n") # publish bactkrace and log - LOG.write("Finishing task... ") + set_status(STATUS_FINISHING) try: os.rename("%s/backtrace" % savedir, "%s/retrace_backtrace" % savedir) except Exception as ex: LOG.write("Error: %s\n" % ex) - LOG.close() - sys.exit(35) + fail(35) LOG.write("OK\n") LOG.write("Retrace took %d seconds.\n" % duration) + set_status(STATUS_SUCCESS) + LOG.write("\n") LOG.close() |