diff options
author | Kirill Yakovenko <kirill.yakovenko@gmail.com> | 2016-07-27 18:26:39 +0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-07-27 18:26:39 +0700 |
commit | 1a808a0ea80b14aad99faf0b29683c5331329894 (patch) | |
tree | 85d70fa62b79968ca4e1cfbb18011efe792e1116 | |
parent | 4056a61b94d466716890d411d975d7d66d8bf1f3 (diff) | |
parent | c6216fc4e013ce13124f754bdf23c38c373ddf3c (diff) | |
download | omaha-server-1a808a0ea80b14aad99faf0b29683c5331329894.zip omaha-server-1a808a0ea80b14aad99faf0b29683c5331329894.tar.gz omaha-server-1a808a0ea80b14aad99faf0b29683c5331329894.tar.bz2 |
Merge pull request #207 from Crystalnix/crash_issues
close #203 The bug relating to uploading new crash reports has been fixed.
-rw-r--r-- | conf/supervisord.conf | 1 | ||||
-rw-r--r-- | conf/uwsgi.ini | 1 | ||||
-rw-r--r-- | omaha_server/crash/admin.py | 4 | ||||
-rw-r--r-- | omaha_server/crash/forms.py | 23 | ||||
-rw-r--r-- | omaha_server/crash/models.py | 6 | ||||
-rw-r--r-- | omaha_server/crash/tests/test_forms.py | 37 |
6 files changed, 58 insertions, 14 deletions
diff --git a/conf/supervisord.conf b/conf/supervisord.conf index a186f26..ea6312a 100644 --- a/conf/supervisord.conf +++ b/conf/supervisord.conf @@ -10,6 +10,7 @@ autorestart=true command=/usr/local/bin/uwsgi --ini /srv/omaha/conf/uwsgi.ini autostart=true autorestart=true +stopsignal=QUIT [program:celery] command=celery worker -B -A omaha_server --loglevel=INFO diff --git a/conf/uwsgi.ini b/conf/uwsgi.ini index dac8d63..d4c0b8f 100644 --- a/conf/uwsgi.ini +++ b/conf/uwsgi.ini @@ -6,3 +6,4 @@ chunked-input-limit = 25000000 chunked-input-timeout = 300 socket-timeout = 300 buffer-size = 65535 +master = 1 diff --git a/omaha_server/crash/admin.py b/omaha_server/crash/admin.py index e45f1f1..8483449 100644 --- a/omaha_server/crash/admin.py +++ b/omaha_server/crash/admin.py @@ -114,11 +114,11 @@ class CrashAdmin(admin.ModelAdmin): archive_field.short_description = 'Instrumental file' def os_field(self, obj): - return obj.stacktrace_json['system_info']['os'] if obj.stacktrace_json else '' + return obj.stacktrace_json.get('system_info', {}).get('os', '') if obj.stacktrace_json else '' os_field.short_description = 'OS' def cpu_architecture_field(self, obj): - return obj.stacktrace_json['system_info']['cpu_arch'] if obj.stacktrace_json else '' + return obj.stacktrace_json.get('system_info', {}).get('cpu_arch', '') if obj.stacktrace_json else '' cpu_architecture_field.short_description = "CPU Architecture" def sentry_link_field(self, obj): diff --git a/omaha_server/crash/forms.py b/omaha_server/crash/forms.py index 27cbb16..233e97a 100644 --- a/omaha_server/crash/forms.py +++ b/omaha_server/crash/forms.py @@ -52,17 +52,20 @@ class CrashFrom(forms.ModelForm): def clean_upload_file_minidump(self): file = self.cleaned_data["upload_file_minidump"] - if file.name.endswith('.tar'): - t_file = BytesIO(file.read()) - t_file = tarfile.open(fileobj=t_file, mode='r') - self.cleaned_data['archive_file'] = file - dump_name = filter(lambda i: i.endswith('.dmp'), t_file.getnames()) + if file and file.name.endswith('.tar'): try: - file_name = next(dump_name) - file = t_file.extractfile(file_name) - file = SimpleUploadedFile(file_name, file.read()) - except StopIteration: - return None + t_file = BytesIO(file.read()) + t_file = tarfile.open(fileobj=t_file, mode='r') + self.cleaned_data['archive_file'] = file + dump_name = filter(lambda i: i.endswith('.dmp'), t_file.getnames()) + try: + file_name = next(dump_name) + file = t_file.extractfile(file_name) + file = SimpleUploadedFile(file_name, file.read()) + except StopIteration: + return None + except tarfile.TarError as err: + raise forms.ValidationError('The tar file is broken, error: {0}'.format(err.message)) return file def clean_minidump_size(self): diff --git a/omaha_server/crash/models.py b/omaha_server/crash/models.py index aa18980..434b26a 100644 --- a/omaha_server/crash/models.py +++ b/omaha_server/crash/models.py @@ -65,9 +65,13 @@ class Crash(BaseModel): class Meta(BaseModel.Meta): verbose_name_plural = 'Crashes' + def __unicode__(self): + return u"Crash #{0}".format(self.id) + (" ({0})".format(self.signature) if self.signature else '') + @property def size(self): - return self.archive_size + self.minidump_size + return self.archive_size + self.minidump_size + class CrashDescription(BaseModel): crash = models.OneToOneField(Crash, related_name='crash_description') diff --git a/omaha_server/crash/tests/test_forms.py b/omaha_server/crash/tests/test_forms.py index 9e41e82..9ddf202 100644 --- a/omaha_server/crash/tests/test_forms.py +++ b/omaha_server/crash/tests/test_forms.py @@ -19,6 +19,8 @@ the License. """ import os +import string +import random from django.test import TestCase from django.core.files.uploadedfile import SimpleUploadedFile @@ -32,6 +34,10 @@ SYM_FILE = os.path.join(TEST_DATA_DIR, 'BreakpadTestApp.sym') TAR_FILE = os.path.join(TEST_DATA_DIR, 'foo.tar') +def string_generator(size, chars=string.ascii_uppercase + string.ascii_lowercase + string.digits): + return ''.join(random.choice(chars) for _ in range(size)) + + class SymbolsAdminFormTest(TestCase): def test_form(self): form_data = {} @@ -78,4 +84,33 @@ class CrashFormTest(TestCase): self.assertEqual(form.cleaned_data['upload_file_minidump'].name, '7b05e196-7e23-416b-bd13-99287924e214.dmp') self.assertEqual(form.cleaned_data['archive'].name, 'foo.tar') self.assertEqual(form.cleaned_data['archive_size'], 85504) - self.assertEqual(form.cleaned_data['minidump_size'], 14606)
\ No newline at end of file + self.assertEqual(form.cleaned_data['minidump_size'], 14606) + + def test_invalid_data(self): + with open(TAR_FILE, 'rb') as f: + form_file_data = dict(upload_file_minidump=SimpleUploadedFile( + "foo.tar", f.read(100))) + form_data = dict( + appid=string_generator(40), + userid=string_generator(40), + meta=string_generator(40), + stacktrace=string_generator(40), + stacktrace_json=string_generator(40), + signature=string_generator(256), + ip=string_generator(40), + groupid=string_generator(40), + eventid=string_generator(40), + ) + + form = CrashFrom(form_data, form_file_data) + self.assertFalse(form.is_valid()) + self.assertIn('upload_file_minidump', form.errors) + self.assertIn('appid', form.errors) + self.assertIn('userid', form.errors) + self.assertIn('meta', form.errors) + self.assertNotIn('stacktrace', form.errors) + self.assertIn('stacktrace_json', form.errors) + self.assertIn('signature', form.errors) + self.assertIn('ip', form.errors) + self.assertIn('groupid', form.errors) + self.assertIn('eventid', form.errors) |