almir icon indicating copy to clipboard operation
almir copied to clipboard

Internal Server Error (generated by waitress)

Open b0rek opened this issue 12 years ago • 18 comments

When trying to access http://host:2500/job/59/ (and other jobs, many, but not all)

Internal Server Error
The server encountered an unexpected internal server error
(generated by waitress)

System: Ubuntu 12.04 LTS (GNU/Linux 3.2.0-25-generic x86_64) Bacula: 5.2.5-0ubuntu6 Almir: latest on 2012-04-14

almir-stderr---supervisor.log

2012-07-16 12:07:29,738 ERROR [exc_logger][Dummy-1] http://host:2500/job/59/
Traceback (most recent call last):
  File "/usr/share/almir/eggs/pyramid_exclog-0.5-py2.7.egg/pyramid_exclog/__init__.py", line 40, in exclog_tween
    return handler(request)
  File "/usr/share/almir/eggs/pyramid-1.3-py2.7.egg/pyramid/router.py", line 164, in handle_request
    response = view_callable(context, request)
  File "/usr/share/almir/eggs/pyramid-1.3-py2.7.egg/pyramid/config/views.py", line 352, in rendered_view
    context)
  File "/usr/share/almir/eggs/pyramid-1.3-py2.7.egg/pyramid/renderers.py", line 396, in render_view
    return self.render_to_response(response, system, request=request)
  File "/usr/share/almir/eggs/pyramid-1.3-py2.7.egg/pyramid/renderers.py", line 426, in render_to_response
    result = self.render(value, system_values, request=request)
  File "/usr/share/almir/eggs/pyramid-1.3-py2.7.egg/pyramid/renderers.py", line 422, in render
    result = renderer(value, system_values)
  File "/usr/share/almir/eggs/pyramid_jinja2-1.3-py2.7.egg/pyramid_jinja2/__init__.py", line 287, in __call__
    return self.template.render(system)
  File "/usr/share/almir/eggs/Jinja2-2.6-py2.7.egg/jinja2/environment.py", line 894, in render
    return self.environment.handle_exception(exc_info, True)
  File "/usr/share/almir/almir/templates/job_detail.jinja2", line 1, in top-level template code
    {% extends "templates/base.jinja2" %}
  File "/usr/share/almir/almir/templates/base.jinja2", line 73, in top-level template code
    {% block container %}
  File "/usr/share/almir/almir/templates/base.jinja2", line 84, in block "container"
    {% block content %}
  File "/usr/share/almir/almir/templates/job_detail.jinja2", line 10, in block "content"
    {{ macros.logs_table(request, object.logs, show_jobid=False) }}
  File "/usr/share/almir/almir/templates/macros.jinja2", line 128, in template
    {{ td_link(log.render_logtext(request)) }}
  File "/usr/share/almir/almir/models.py", line 586, in render_logtext
    d['text'] = Markup(nl2br(log))
  File "/usr/share/almir/eggs/MarkupSafe-0.15-py2.7.egg/markupsafe/__init__.py", line 71, in __new__
    return unicode.__new__(cls, base)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 35: ordinal not in range(128)
2012-07-16 12:07:29,741 ERROR [waitress][Dummy-1] Exception when serving /job/59/
Traceback (most recent call last):
  File "/usr/share/almir/eggs/waitress-0.8.1-py2.7.egg/waitress/channel.py", line 329, in service
    task.service()
  File "/usr/share/almir/eggs/waitress-0.8.1-py2.7.egg/waitress/task.py", line 173, in service
    self.execute()
  File "/usr/share/almir/eggs/waitress-0.8.1-py2.7.egg/waitress/task.py", line 380, in execute
    app_iter = self.channel.server.application(env, start_response)
  File "/usr/share/almir/eggs/pyramid-1.3-py2.7.egg/pyramid/router.py", line 187, in __call__
    response = self.handle_request(request)
  File "/usr/share/almir/eggs/pyramid-1.3-py2.7.egg/pyramid/tweens.py", line 20, in excview_tween
    response = handler(request)
  File "/usr/share/almir/eggs/pyramid_tm-0.3-py2.7.egg/pyramid_tm/__init__.py", line 61, in tm_tween
    response = handler(request)
  File "/usr/share/almir/eggs/pyramid_exclog-0.5-py2.7.egg/pyramid_exclog/__init__.py", line 40, in exclog_tween
    return handler(request)
  File "/usr/share/almir/eggs/pyramid-1.3-py2.7.egg/pyramid/router.py", line 164, in handle_request
    response = view_callable(context, request)
  File "/usr/share/almir/eggs/pyramid-1.3-py2.7.egg/pyramid/config/views.py", line 352, in rendered_view
    context)
  File "/usr/share/almir/eggs/pyramid-1.3-py2.7.egg/pyramid/renderers.py", line 396, in render_view
    return self.render_to_response(response, system, request=request)
  File "/usr/share/almir/eggs/pyramid-1.3-py2.7.egg/pyramid/renderers.py", line 426, in render_to_response
    result = self.render(value, system_values, request=request)
  File "/usr/share/almir/eggs/pyramid-1.3-py2.7.egg/pyramid/renderers.py", line 422, in render
    result = renderer(value, system_values)
  File "/usr/share/almir/eggs/pyramid_jinja2-1.3-py2.7.egg/pyramid_jinja2/__init__.py", line 287, in __call__
    return self.template.render(system)
  File "/usr/share/almir/eggs/Jinja2-2.6-py2.7.egg/jinja2/environment.py", line 894, in render
    return self.environment.handle_exception(exc_info, True)
  File "/usr/share/almir/almir/templates/job_detail.jinja2", line 1, in top-level template code
    {% extends "templates/base.jinja2" %}
  File "/usr/share/almir/almir/templates/base.jinja2", line 73, in top-level template code
    {% block container %}
  File "/usr/share/almir/almir/templates/base.jinja2", line 84, in block "container"
    {% block content %}
  File "/usr/share/almir/almir/templates/job_detail.jinja2", line 10, in block "content"
    {{ macros.logs_table(request, object.logs, show_jobid=False) }}
  File "/usr/share/almir/almir/templates/macros.jinja2", line 128, in template
    {{ td_link(log.render_logtext(request)) }}
  File "/usr/share/almir/almir/models.py", line 586, in render_logtext
    d['text'] = Markup(nl2br(log))
  File "/usr/share/almir/eggs/MarkupSafe-0.15-py2.7.egg/markupsafe/__init__.py", line 71, in __new__
    return unicode.__new__(cls, base)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 35: ordinal not in range(128)

b0rek avatar Jul 16 '12 10:07 b0rek

Error is caused by national characters in logs. In my case system locales is set to pl_PL.UTF-8 and some bacula messages are translated to Polish for example:

2012-07-13 10:05:11   host-dir JobId 45: Nie znaleziono wcześniejszego rekordu Zadania Pełnego Backup'u.

For me worked little hack in /almir/almir/models.py in line 588 from:

d['text'] = Markup(nl2br(log))

to:

d['text'] = Markup(nl2br(log.decode('utf-8')))

b0rek avatar Jul 17 '12 09:07 b0rek

Thanks, will push a fix with test case and make a release!

domenkozar avatar Jul 18 '12 14:07 domenkozar

Could you run following commands (in almir root directory) and copy the output:

bin/pshell production.ini
>>> from almir.models import Log
>>> Log.query[1]

domenkozar avatar Jul 19 '12 11:07 domenkozar

And I'm guessing, you are using mysql?

domenkozar avatar Jul 19 '12 11:07 domenkozar

root@hades:~# cd /usr/share/almir/
root@hades:/usr/share/almir# bin/pshell production.ini
Python 2.7.3 (default, Apr 20 2012, 22:39:59)
[GCC 4.6.3] on linux2
Type "help" for more information.

Environment:
  app          The WSGI application.
  registry     Active Pyramid registry.
  request      Active request object.
  root         Root of the default resource tree.
  root_factory Default root factory used to create `root`.

>>> from almir.models import Log
>>> Log.query[1]
<almir.models.Log object at 0x3b8b490>
>>>
root@hades:/usr/share/almir# locale
LANG=pl_PL.UTF-8
LANGUAGE=
LC_CTYPE="pl_PL.UTF-8"
LC_NUMERIC="pl_PL.UTF-8"
LC_TIME="pl_PL.UTF-8"
LC_COLLATE="pl_PL.UTF-8"
LC_MONETARY="pl_PL.UTF-8"
LC_MESSAGES="pl_PL.UTF-8"
LC_PAPER="pl_PL.UTF-8"
LC_NAME="pl_PL.UTF-8"
LC_ADDRESS="pl_PL.UTF-8"
LC_TELEPHONE="pl_PL.UTF-8"
LC_MEASUREMENT="pl_PL.UTF-8"
LC_IDENTIFICATION="pl_PL.UTF-8"
LC_ALL=

And yes, I use MySQL. Default installation on Ubuntu 12.04 Server. I'm not sure if my fix will work if system locale was different (not utf-8 encoded). Are log records converted from system locale to, let's say utf-8, to store in database? Such action and switching internally to utf-8 should make Almir safe from all problems connected with i18n.

PS I'm going to holidays. I'll be back in 2 weeks if you need more assistance.

b0rek avatar Jul 20 '12 10:07 b0rek

Let me know if changing line in almir/meta.py from:

engine = engine_from_config(settings, prefix='sqlalchemy.', encoding='utf-8')

to:

engine = engine_from_config(settings, prefix='sqlalchemy.', encoding='utf-8', convert_unicode=True)

fixes the issue :)

domenkozar avatar Jul 20 '12 10:07 domenkozar

Sorry,

convert_unicode=True

is not working. I'm not sure if it should because logtext is stored as BLOB, not text. From http://groups.google.com/group/sqlalchemy/browse_thread/thread/5d8b870ca8782e1c : Blob is a binary type, not a character type. You need to put binary data in there, so in python 2x that's str, ie encode it. Direct Unicode support in sqla is via the string/Unicode types. I've tried overriding logtext column in Log class of a model

    from sqlalchemy.dialects.mysql import TEXT
    logtext = Column('logtext', TEXT(charset='utf-8'))

but with no success. Maybe custom type for column could help?

b0rek avatar Aug 08 '12 09:08 b0rek

Then we might need a custom type to force unicode conversion where needed.

domenkozar avatar Aug 08 '12 09:08 domenkozar

Maybe this will help? http://docs.sqlalchemy.org/en/latest/core/types.html#coercing-encoded-strings-to-unicode

b0rek avatar Aug 08 '12 10:08 b0rek

Same problem with clean install of almir with bacula postgresql on index page, but strange because my job names doesn't have any non-ascii symbols...

2012-09-25 11:05:01,211 ERROR [waitress][Dummy-1] Exception when serving /
Traceback (most recent call last):
  File "/opt/almir/eggs/waitress-0.8.1-py2.7.egg/waitress/channel.py", line 329, in service
    task.service()
  File "/opt/almir/eggs/waitress-0.8.1-py2.7.egg/waitress/task.py", line 173, in service
    self.execute()
  File "/opt/almir/eggs/waitress-0.8.1-py2.7.egg/waitress/task.py", line 380, in execute
    app_iter = self.channel.server.application(env, start_response)
  File "/opt/almir/eggs/pyramid-1.3-py2.7.egg/pyramid/router.py", line 187, in __call__
    response = self.handle_request(request)
  File "/opt/almir/eggs/pyramid-1.3-py2.7.egg/pyramid/tweens.py", line 20, in excview_tween
    response = handler(request)
  File "/opt/almir/eggs/pyramid_tm-0.3-py2.7.egg/pyramid_tm/__init__.py", line 61, in tm_tween
    response = handler(request)
  File "/opt/almir/eggs/pyramid_exclog-0.5-py2.7.egg/pyramid_exclog/__init__.py", line 40, in exclog_tween
    return handler(request)
  File "/opt/almir/eggs/pyramid-1.3-py2.7.egg/pyramid/router.py", line 164, in handle_request
    response = view_callable(context, request)
  File "/opt/almir/eggs/pyramid-1.3-py2.7.egg/pyramid/config/views.py", line 352, in rendered_view
    context)
  File "/opt/almir/eggs/pyramid-1.3-py2.7.egg/pyramid/renderers.py", line 396, in render_view
    return self.render_to_response(response, system, request=request)
  File "/opt/almir/eggs/pyramid-1.3-py2.7.egg/pyramid/renderers.py", line 426, in render_to_response
    result = self.render(value, system_values, request=request)
  File "/opt/almir/eggs/pyramid-1.3-py2.7.egg/pyramid/renderers.py", line 422, in render
    result = renderer(value, system_values)
  File "/opt/almir/eggs/pyramid_jinja2-1.3-py2.7.egg/pyramid_jinja2/__init__.py", line 287, in __call__
    return self.template.render(system)
  File "/opt/almir/eggs/Jinja2-2.6-py2.7.egg/jinja2/environment.py", line 894, in render
    return self.environment.handle_exception(exc_info, True)
  File "/opt/almir/almir/templates/dashboard.jinja2", line 1, in top-level template code
    {% extends "templates/base.jinja2" %}
  File "/opt/almir/almir/templates/base.jinja2", line 73, in top-level template code
    {% block container %}
  File "/opt/almir/almir/templates/base.jinja2", line 84, in block "container"
    {% block content %}
  File "/opt/almir/almir/templates/dashboard.jinja2", line 7, in block "content"
    {{ macros.upcoming_jobs_table(request, upcoming_jobs) }}
  File "/opt/almir/almir/templates/macros.jinja2", line 34, in template
    {{ job.name }}
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 5: ordinal not in range(128)

gaussgss avatar Sep 25 '12 07:09 gaussgss

Wierd. I'll take a look over the weekend and fix this.

domenkozar avatar Sep 25 '12 07:09 domenkozar

I have the same problem on Ubuntu 12.04.1 LTS server and it don't depends from user locale, also bacula-console (bconsole) always written mix from russian and english messages even if I force to en_GB.UTF-8 locale for user or for all system. The ru_RU.UTF-8 was a default locale during installation.

UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 5: ordinal not in range(128)

DmitryINdig0 avatar Sep 28 '12 07:09 DmitryINdig0

Hmm, still need more details. Could someone provide ssh access to debug this one?

domenkozar avatar Nov 23 '12 22:11 domenkozar

Hi,

I had same problems with french characters.

I modified almir/model.py near line 586

        #d['text'] = Markup(nl2br(log))                                                                                                                        
        try:                                                                                                                                                   
            d['text'] = Markup(nl2br(log))                                                                                                                     
        except:                                                                                                                                                
            try:                                                                                                                                               
                d['text'] = Markup(nl2br(log.decode('utf-8', errors='ignore')))                                                                                
            except:                                                                                                                                            
                d['text'] = Markup(nl2br("Encoding error"))  

Display is now fine even if specials characters are removed.

sub1 avatar Apr 16 '13 14:04 sub1

I also experience this issue. SSH access won't be possible but i could provide you further info if required. The fix in the second comment on this issue worked for me.

webratz avatar Jul 24 '13 09:07 webratz

So little bit of brain dump on this issue:

  • it seems that some columns that we reflect from bacula don't always present as Unicode types (for example log, which is a blob)
  • decoding to unicode in templates would do, but we need a more general solution
  • try to figure out how to force those columns to be aware of encoding

domenkozar avatar Jul 27 '13 12:07 domenkozar

Well, I.ve got Ubuntu 12.04 with Russian locale ru_RU.UTF-8, Bacula and PostgreSQL. So that is what helped me:

diff --git a/almir/templates/macros.jinja2 b/almir/templates/macros.jinja2
index e2e0374..51817b0 100644
--- a/almir/templates/macros.jinja2
+++ b/almir/templates/macros.jinja2
@@ -31,11 +31,11 @@
         <tbody>
             {% for job in jobs %}
                 <tr>
-                    <td>{{ job.name }}</td>
-                    <td>{{ job.type }}</td>
+                    <td>{{ job.name.decode('latin1') }}</td>
+                    <td>{{ job.type.decode('latin1') }}</td>
                     <td>{{ job.level }}</td>
-                    <td>{{ job.priority }}</td>
-                    <td>{{ job.date }} {{ job.time }}</td>
+                    <td>{{ job.priority.decode('latin1') }}</td>
+                    <td>{{ job.date.decode('latin1') }} {{ job.time.decode('latin1') }}</td>
                     <td>{{ job.volume }}</td>
                 </tr>
             {% endfor %}

This is not good, but it can be fast temporaly action.

firebull avatar Aug 07 '13 09:08 firebull

Hi!

Have this bug a workaround? Thanks!

MaksVal avatar Jul 13 '16 08:07 MaksVal