diff options
Diffstat (limited to 'src/retrace')
-rw-r--r-- | src/retrace/create.wsgi | 2 | ||||
-rw-r--r-- | src/retrace/retrace.py | 17 | ||||
-rw-r--r-- | src/retrace/worker.c | 16 | ||||
-rwxr-xr-x | src/retrace/worker.py | 5 |
4 files changed, 28 insertions, 12 deletions
diff --git a/src/retrace/create.wsgi b/src/retrace/create.wsgi index e26ae0cc..7c5f81b4 100644 --- a/src/retrace/create.wsgi +++ b/src/retrace/create.wsgi @@ -104,7 +104,7 @@ def application(environ, start_response): return response(start_response, "403 Forbidden", "Required file \"%s\" is missing" % required_file) - Popen(["/usr/bin/abrt-retrace-worker", "%d" % taskid]) + call(["/usr/bin/abrt-retrace-worker", "%d" % taskid]) return response(start_response, "201 Created", "", [("X-Task-Id", "%d" % taskid), diff --git a/src/retrace/retrace.py b/src/retrace/retrace.py index 39588d90..56bfd46e 100644 --- a/src/retrace/retrace.py +++ b/src/retrace/retrace.py @@ -21,7 +21,7 @@ PACKAGE_PARSER = re.compile("^(.+)-([0-9]+(\.[0-9]+)*-[0-9]+)\.([^-]+)$") DF_OUTPUT_PARSER = re.compile("^([^ ^\t]*)[ \t]+([0-9]+)[ \t]+([0-9]+)[ \t]+([0-9]+)[ \t]+([0-9]+%)[ \t]+(.*)$") DU_OUTPUT_PARSER = re.compile("^([0-9]+)") URL_PARSER = re.compile("^/([0-9]+)/?") -WORKER_RUNNING_PARSER = re.compile("^([0-9]+)[ \t]+[0-9]+[ \t]+([^ ^\t]+)[ \t]+.*abrt-retrace-worker ([0-9]+)$") +WORKER_RUNNING_PARSER = re.compile("^[ \t]*([0-9]+)[ \t]+[0-9]+[ \t]+([^ ^\t]+)[ \t]+.*abrt-retrace-worker ([0-9]+)$") HANDLE_ARCHIVE = { "application/x-xz-compressed-tar": { @@ -315,7 +315,7 @@ def kill_process_and_childs(process_id, ps_output=None): return result -def cleanup_task(taskid): +def cleanup_task(taskid, gc=True): null = open("/dev/null", "w") savedir = "%s/%d" % (CONFIG["SaveDir"], taskid) @@ -334,12 +334,13 @@ def cleanup_task(taskid): except: pass - try: - log = open(newlog, "a") - log.write("Killed by garbage collector\n") - log.close() - except: - pass + if gc: + try: + log = open(newlog, "a") + log.write("Killed by garbage collector\n") + log.close() + except: + pass null.close() diff --git a/src/retrace/worker.c b/src/retrace/worker.c index 83773e61..a49f74c3 100644 --- a/src/retrace/worker.c +++ b/src/retrace/worker.c @@ -16,6 +16,7 @@ int main(int argc, char **argv) int i; struct passwd *apache_user; const char *apache_username = "apache"; + pid_t pid; if (argc != 2) { @@ -50,7 +51,20 @@ int main(int argc, char **argv) /* required by mock to be able to write into result directory */ setenv("SUDO_GID", "0", 1); - /* launch worker.py */ + /* fork and launch worker.py */ + pid = fork(); + + if (pid < 0) + { + fputs("Unable to fork.", stderr); + return 6; + } + + /* parent - exit */ + if (pid > 0) + return 0; + + /* child */ sprintf(command, "/usr/bin/python /usr/share/abrt-retrace/worker.py \"%s\"", argv[1]); pipe = popen(command, "r"); if (pipe == NULL) diff --git a/src/retrace/worker.py b/src/retrace/worker.py index ad2badf1..24defa66 100755 --- a/src/retrace/worker.py +++ b/src/retrace/worker.py @@ -27,8 +27,9 @@ def set_status(statusid): def fail(exitcode): "Kills script with given exitcode" - LOG.close() set_status(STATUS_FAIL) + LOG.close() + cleanup_task(int(taskid), False) sys.exit(exitcode) def retrace_run(errorcode, cmd): @@ -287,7 +288,7 @@ if __name__ == "__main__": else: LOG.write("OK\n") - # publish bactkrace and log + # publish backtrace and log set_status(STATUS_FINISHING) try: |