summaryrefslogtreecommitdiffstats
path: root/src/retrace/worker.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/retrace/worker.py')
-rwxr-xr-xsrc/retrace/worker.py305
1 files changed, 0 insertions, 305 deletions
diff --git a/src/retrace/worker.py b/src/retrace/worker.py
deleted file mode 100755
index 24defa66..00000000
--- a/src/retrace/worker.py
+++ /dev/null
@@ -1,305 +0,0 @@
-#!/usr/bin/python
-
-import sys
-import time
-from retrace import *
-
-sys.path = ["/usr/share/abrt-retrace/"] + sys.path
-from plugins 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"
- set_status(STATUS_FAIL)
- LOG.close()
- cleanup_task(int(taskid), False)
- sys.exit(exitcode)
-
-def retrace_run(errorcode, cmd):
- "Runs cmd using subprocess.Popen and kills script with errorcode on failure"
- try:
- process = Popen(cmd, stdout=PIPE, stderr=STDOUT)
- process.wait()
- output = process.stdout.read()
- process.stdout.close()
- except Exception as ex:
- process = None
- output = "An unhandled exception occured: %s" % ex
-
- if not process or process.returncode != 0:
- LOG.write("Error %d:\n=== OUTPUT ===\n%s\n" % (errorcode, output))
- fail(errorcode)
-
- return output
-
-if __name__ == "__main__":
- starttime = time.time()
-
- if len(sys.argv) != 2:
- sys.stderr.write("Usage: %s task_id\n" % sys.argv[0])
- sys.exit(11)
-
- taskid = sys.argv[1]
- try:
- taskid_int = int(sys.argv[1])
- except:
- sys.stderr.write("Task ID may only contain digits.\n")
- sys.exit(12)
-
- savedir = workdir = "%s/%s" % (CONFIG["SaveDir"], taskid)
-
- if CONFIG["UseWorkDir"]:
- workdir = "%s/%s" % (CONFIG["WorkDir"], taskid)
-
- if not os.path.isdir(savedir):
- sys.stderr.write("Task '%s' does not exist.\n" % taskid)
- sys.exit(13)
-
- try:
- LOG = logger(taskid)
- except Exception as ex:
- 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)
- 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")
- fail(16)
-
- # read package file
- try:
- package_file = open("%s/crash/package" % savedir, "r")
- crash_package = package_file.read()
- package_file.close()
- except Exception as ex:
- LOG.write("Unable to read crash package from 'package' file: %s.\n" % ex)
- fail(17)
-
- # read release, distribution and version from release file
- release_path = "%s/crash/os_release" % savedir
- if not os.path.isfile(release_path):
- release_path = "%s/crash/release" % savedir
-
- try:
- release_file = open(release_path, "r")
- release = release_file.read()
- release_file.close()
-
- version = distribution = None
- for plugin in PLUGINS:
- match = plugin.abrtparser.match(release)
- if match:
- version = match.group(1)
- distribution = plugin.distribution
- break
-
- if not version or not distribution:
- raise Exception, "Release '%s' is not supported.\n" % release
-
- except Exception as ex:
- LOG.write("Unable to read distribution and version from 'release' file: %s.\n" % ex)
- LOG.write("Trying to guess distribution and version... ")
- distribution, version = guess_release(crash_package)
- if distribution and version:
- LOG.write("%s-%s\n" % (distribution, version))
- else:
- LOG.write("Failure\n")
- fail(18)
-
- # read package file
- try:
- package_file = open("%s/crash/package" % savedir, "r")
- crash_package = package_file.read()
- package_file.close()
- except Exception as ex:
- LOG.write("Unable to read crash package from 'package' file: %s.\n" % ex)
- fail(19)
-
- packages = crash_package
-
- # read required packages from coredump
- try:
- # ToDo: deal with not found build-ids
- pipe = Popen(["coredump2packages", "%s/crash/coredump" % savedir,
- "--repos=retrace-%s-%s-%s*" % (distribution, version, arch)],
- stdout=PIPE).stdout
- section = 0
- crash_package_or_component = None
- for line in pipe.readlines():
- if line == "\n":
- section += 1
- continue
- elif 0 == section:
- crash_package_or_component = line.strip()
- elif 1 == section:
- packages += " %s" % line.rstrip("\n")
- elif 2 == section:
- # Missing build ids
- pass
- pipe.close()
- except Exception as ex:
- LOG.write("Unable to obtain packages from 'coredump' file: %s.\n" % ex)
- fail(20)
-
- # create mock config file
- try:
- mockcfg = open("%s/mock.cfg" % savedir, "w")
- mockcfg.write("config_opts['root'] = '%s'\n" % taskid)
- mockcfg.write("config_opts['target_arch'] = '%s'\n" % arch)
- mockcfg.write("config_opts['chroot_setup_cmd'] = '--skip-broken install %s shadow-utils gdb rpm'\n" % packages)
- mockcfg.write("config_opts['plugin_conf']['ccache_enable'] = False\n")
- mockcfg.write("config_opts['plugin_conf']['yum_cache_enable'] = False\n")
- mockcfg.write("config_opts['plugin_conf']['root_cache_enable'] = False\n")
- mockcfg.write("\n")
- mockcfg.write("config_opts['yum.conf'] = \"\"\"\n")
- mockcfg.write("[main]\n")
- mockcfg.write("cachedir=/var/cache/yum\n")
- mockcfg.write("debuglevel=1\n")
- mockcfg.write("reposdir=/dev/null\n")
- mockcfg.write("logfile=/var/log/yum.log\n")
- mockcfg.write("retries=20\n")
- mockcfg.write("obsoletes=1\n")
- mockcfg.write("gpgcheck=0\n")
- mockcfg.write("assumeyes=1\n")
- mockcfg.write("syslog_ident=mock\n")
- mockcfg.write("syslog_device=\n")
- mockcfg.write("\n")
- mockcfg.write("#repos\n")
- mockcfg.write("\n")
- mockcfg.write("[%s]\n" % distribution)
- mockcfg.write("name=%s\n" % distribution)
- mockcfg.write("baseurl=file://%s/%s-%s-%s/\n" % (CONFIG["RepoDir"], distribution, version, arch))
- mockcfg.write("failovermethod=priority\n")
- mockcfg.write("\"\"\"\n")
- mockcfg.close()
- except Exception as ex:
- LOG.write("Unable to create mock config file: %s.\n" % ex)
- fail(21)
-
- LOG.write("OK\n")
-
- # get count of tasks running before starting
- prerunning = len(get_active_tasks()) - 1
-
- # run retrace
- mockr = "../../%s/mock" % savedir
-
- 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
- set_status(STATUS_BACKTRACE)
-
- backtrace = run_gdb(savedir)
-
- if not backtrace:
- LOG.write("Error\n")
- fail(29)
-
- try:
- bt_file = open("%s/backtrace" % savedir, "w")
- bt_file.write(backtrace)
- bt_file.close()
- except Exception as ex:
- LOG.write("Error: %s.\n" % ex)
- fail(30)
-
- LOG.write("OK\n")
-
- chroot_size = dir_size("%s/chroot/root" % workdir)
-
- # clean up temporary data
- set_status(STATUS_CLEANUP)
-
- retrace_run(31, ["mock", "-r", mockr, "--scrub=all"])
- retrace_run(32, ["rm", "-rf", "%s/mock.cfg" % savedir, "%s/crash" % savedir])
-
- # ignore error: workdir = savedir => workdir is not empty
- if CONFIG["UseWorkDir"]:
- try:
- os.rmdir(workdir)
- except:
- pass
-
- LOG.write("OK\n")
-
- # save crash statistics
- set_status(STATUS_STATS)
-
- duration = int(time.time() - starttime)
-
- package_match = PACKAGE_PARSER.match(crash_package)
- if not package_match:
- package = crash_package
- version = "unknown"
- release = "unknown"
- else:
- package = package_match.group(1)
- version = package_match.group(2)
- release = package_match.group(4)
-
- crashstats = {
- "taskid": taskid_int,
- "package": package,
- "version": version,
- "release": release,
- "arch": arch,
- "starttime": int(starttime),
- "duration": duration,
- "prerunning": prerunning,
- "postrunning": len(get_active_tasks()) - 1,
- "chrootsize": chroot_size
- }
-
- if not init_crashstats_db() or not save_crashstats(crashstats):
- LOG.write("Error: %s\n" % crashstats)
- else:
- LOG.write("OK\n")
-
- # publish backtrace and log
- set_status(STATUS_FINISHING)
-
- try:
- os.rename("%s/backtrace" % savedir, "%s/retrace_backtrace" % savedir)
- except Exception as ex:
- LOG.write("Error: %s\n" % ex)
- fail(35)
-
- LOG.write("OK\n")
- LOG.write("Retrace took %d seconds.\n" % duration)
-
- set_status(STATUS_SUCCESS)
- LOG.write("\n")
- LOG.close()