summaryrefslogtreecommitdiffstats
path: root/retrace/interface/create.wsgi
diff options
context:
space:
mode:
authorMichal Toman <mtoman@redhat.com>2010-10-12 16:04:25 +0200
committerMichal Toman <mtoman@redhat.com>2010-10-12 16:04:25 +0200
commitbce30a209e7b823f67b4651e671faa64cc2af79c (patch)
tree7e5efb6da30da0e7872eb3ecc6f7e69ec33f3f3b /retrace/interface/create.wsgi
parent354f20ef323c1670cb595feb1f3a19c260e8b7d6 (diff)
downloadabrt-bce30a209e7b823f67b4651e671faa64cc2af79c.tar.gz
abrt-bce30a209e7b823f67b4651e671faa64cc2af79c.tar.xz
abrt-bce30a209e7b823f67b4651e671faa64cc2af79c.zip
Retrace server interface
Diffstat (limited to 'retrace/interface/create.wsgi')
-rw-r--r--retrace/interface/create.wsgi73
1 files changed, 73 insertions, 0 deletions
diff --git a/retrace/interface/create.wsgi b/retrace/interface/create.wsgi
new file mode 100644
index 00000000..81947d64
--- /dev/null
+++ b/retrace/interface/create.wsgi
@@ -0,0 +1,73 @@
+#!/usr/bin/python
+import sys
+sys.path = ["/usr/share/abrt-retrace"] + sys.path
+
+from retrace import *
+from tempfile import *
+
+def application(environ, start_response):
+ read_config()
+
+ request = Request(environ)
+
+ if request.method != "POST":
+ return response(start_response, "405 Method Not Allowed")
+
+ if not request.content_type in ["application/x-xz", "application/x-xz-compressed-tar"]:
+ return response(start_response, "415 Unsupported Media Type")
+
+ if not request.content_length:
+ return response(start_response, "411 Length Required")
+
+ if request.content_length > CONFIG["MaxPackedSize"] * 1048576:
+ return response(start_response, "413 Request Entity Too Large")
+
+ space = free_space(CONFIG["WorkDir"])
+ if not space:
+ return response(start_response, "500 Internal Server Error", "Unable to obtain disk free space")
+
+ if space - request.content_length < CONFIG["MinStorageLeft"] * 1048576:
+ return response(start_response, "507 Insufficient Storage")
+
+ try:
+ archive = NamedTemporaryFile(mode = "wb", delete = False, suffix = ".tar.xz")
+ archive.write(request.body)
+ archive.close()
+ except:
+ return response(start_response, "500 Internal Server Error", "Unable to save archive")
+
+ size = unpacked_size(archive.name)
+ if not size:
+ os.unlink(archive.name)
+ return response(start_response, "500 Internal Server Error", "Unable to obtain unpacked size")
+
+ if size > CONFIG["MaxUnpackedSize"] * 1048576:
+ os.unlink(archive.name)
+ return response(start_response, "413 Request Entity Too Large")
+
+ if space - size < CONFIG["MinStorageLeft"] * 1048576:
+ os.unlink(archive.name)
+ return response(start_response, "507 Insufficient Storage")
+
+ crashid, crashdir = new_crash()
+ if not crashid or not crashdir:
+ return response(start_response, "500 Internal Server Error", "Unable to create new crash")
+
+ os.chdir(crashdir)
+ unpack_retcode = unpack(archive.name)
+ os.unlink(archive.name)
+
+ if unpack_retcode != 0:
+ os.chdir("/")
+ os.system("rm -rf " + crashdir)
+ return response(start_response, "500 Internal Server Error", "Unable to unpack archive")
+
+ files = os.listdir(".")
+
+ for required_file in REQUIRED_FILES:
+ if not required_file in files:
+ os.chdir("/")
+ os.system("rm -rf " + crashdir)
+ return response(start_response, "403 Forbidden")
+
+ return response(start_response, "201 Created", "", [("X-Task-Id", str(crashid)), ("X-Task-Password", get_task_password(crashdir)), ("X-Task-Est-Time", str(get_task_est_time(crashdir)))]) \ No newline at end of file