LLDP neighbors with "funny" names may cause ipdevinfo NoReverseMatch crash

Bug #1513046 reported by Aaron
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
Network Administration Visualized
Fix Released
Medium
Morten Brekkevold

Bug Description

When I try to display some switches I get a web crash. The switches I managed to reproduce it are all HP and these are the models: 2626-PWR and 2620-24-PoEP.

What those switches have in common is that both are PoE capable, have IP phones attached to them and use lldp, so I think it may be related. This is the lldp info it shows from the switch:

2626-PWR# sh ll i r

 LLDP Remote Devices Information

  LocalPort | ChassisId PortId PortDescr SysName
  --------- + ------------------------- ------ --------- ----------------------
  2 | xx.xxx.xx.102 00 ... 1 Polycom SoundPoint ...
  14 | xx.xxx.xx.28 00 ... 1 Polycom SoundPoint ...
  16 | xx.xxx.xx.214 00 ... 1 Polycom SoundPoint ...
  17 | xx.xxx.xx.71 00 ... 1 Polycom SoundPoint ...
  18 | xx.xxx.xx.100 00 ... 1 Polycom SoundPoint ...
  19 | xx.xxx.xx.106 00 ... 1 Polycom SoundPoint ...
  20 | xx.xxx.xx.99 00 ... 1 Polycom SoundPoint ...
  21 | xx.xxx.xx.91 00 ... 1 Polycom SoundPoint ...
  25 | xxxxxxxxxxxxxxxxx 49 49 CE35
  26 | xxxxxxxxxxxxxxxxx 49 49 CE37

2626-PWR# sh ll i r 2

 LLDP Remote Device Information Detail

  Local Port : 2
  ChassisType : network-address
  ChassisId : xx.xxx.xx.102
  PortType : mac-address
  PortId : 00 04 f2 xx xx xx
  SysName : Polycom SoundPoint IP 331
  System Descr : Polycom;SoundPointIP-SPIP_331;2345-12365-001,1;SIP/4.0.4....
  PortDescr : 1

  System Capabilities Supported : bridge, telephone
  System Capabilities Enabled : bridge, telephone

  Remote Management Address
     Type : ipv4
     Address : xx.xxx.xx.102

  MED Information Detail
    EndpointClass :Class3
    Media Policy Vlan id :0
    Media Policy Priority :5
    Media Policy Dscp :46
    Media Policy Tagged :False
    Poe Device Type :PD
    Power Requested :37
    Power Source :Local & PSE
    Power Priority :Unknown

2620-24-PoEP# sh ll i r

 LLDP Remote Devices Information

  LocalPort | ChassisId PortId PortDescr SysName
  --------- + ------------------------- ------ --------- ----------------------
  2 | 10.119.20.13 00 ... 1 Polycom SoundPoint ...
  6 | 10.119.21.13 00 ... 1 Polycom SoundPoint ...
  8 | 10.119.21.69 00 ... 1 Polycom SoundPoint ...
  10 | TW2249V00Z eth1
  10 | 3c d9 2b 7c 2c fa 3c ... Port 1 CE020-HP
  25 | 00 11 0a da fb 80 50 50 CE37
  26 | 6c c2 17 c0 e0 e0 9 9 CE39

2620-24-PoEP# sh ll i r 2

 LLDP Remote Device Information Detail

  Local Port : 2
  ChassisType : network-address
  ChassisId : xx.xxx.xx.13
  PortType : mac-address
  PortId : 00 04 f2 xx xx xx
  SysName : Polycom SoundPoint IP 331
  System Descr : Polycom;SoundPointIP-SPIP_331;2345-12365-001,1;SIP/4.0.4....
  PortDescr : 1
  Pvid :

  System Capabilities Supported : bridge, telephone
  System Capabilities Enabled : bridge, telephone

  Remote Management Address
     Type : ipv4
     Address : xx.xxx.xx.13

  MED Information Detail
    EndpointClass :Class3
    Media Policy Vlan id :0
    Media Policy Priority :5
    Media Policy Dscp :46
    Media Policy Tagged :False
    Poe Device Type :PD
    Power Requested :3.7 W
    Power Source :Local & PSE
    Power Priority :Unknown

This is the traceback info of the 2626-PWR:

NoReverseMatch: Reverse for 'seeddb-netbox-add-suggestion' with arguments '(u'\x01\nw\x14f',)' and keyword arguments '{}' not found.
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/django/core/handlers/base.py", line 109, in get_response response = callback(request, *callback_args, **callback_kwargs)
File "/usr/lib/python2.7/dist-packages/nav/web/ipdevinfo/views.py", line 319, in ipdev_details processors=[search_form_processor]))
File "/usr/lib/python2.7/dist-packages/django/shortcuts/__init__.py", line 20, in render_to_response return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)
File "/usr/lib/python2.7/dist-packages/django/template/loader.py", line 176, in render_to_string return t.render(context_instance)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 140, in render return self._render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 134, in _render return self.nodelist.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 823, in render bit = self.render_node(node, context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 837, in render_node return node.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/loader_tags.py", line 123, in render return compiled_parent._render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 134, in _render return self.nodelist.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 823, in render bit = self.render_node(node, context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 837, in render_node return node.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/loader_tags.py", line 123, in render return compiled_parent._render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 134, in _render return self.nodelist.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 823, in render bit = self.render_node(node, context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 837, in render_node return node.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/loader_tags.py", line 62, in render result = block.nodelist.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 823, in render bit = self.render_node(node, context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 837, in render_node return node.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/loader_tags.py", line 62, in render result = block.nodelist.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 823, in render bit = self.render_node(node, context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 837, in render_node return node.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/defaulttags.py", line 282, in render return nodelist.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 823, in render bit = self.render_node(node, context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 837, in render_node return node.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/loader_tags.py", line 155, in render return self.render_template(self.template, context)
File "/usr/lib/python2.7/dist-packages/django/template/loader_tags.py", line 137, in render_template output = template.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 140, in render return self._render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 134, in _render return self.nodelist.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 823, in render bit = self.render_node(node, context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 837, in render_node return node.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/defaulttags.py", line 282, in render return nodelist.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 823, in render bit = self.render_node(node, context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 837, in render_node return node.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/defaulttags.py", line 193, in render nodelist.append(node.render(context))
File "/usr/lib/python2.7/dist-packages/django/template/defaulttags.py", line 282, in render return nodelist.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 823, in render bit = self.render_node(node, context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 837, in render_node return node.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/defaulttags.py", line 282, in render return nodelist.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 823, in render bit = self.render_node(node, context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 837, in render_node return node.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/defaulttags.py", line 426, in render raise e
NoReverseMatch: Reverse for 'seeddb-netbox-add-suggestion' with arguments '(u'\x01\nw\x14f',)' and keyword arguments '{}' not found.

This is the traceback info of the 2620-24-PoEP:

NoReverseMatch: Reverse for 'seeddb-netbox-add-suggestion' with arguments '(u'\x01\nw\x14\r',)' and keyword arguments '{}' not found.
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/django/core/handlers/base.py", line 109, in get_response response = callback(request, *callback_args, **callback_kwargs)
File "/usr/lib/python2.7/dist-packages/nav/web/ipdevinfo/views.py", line 319, in ipdev_details processors=[search_form_processor]))
File "/usr/lib/python2.7/dist-packages/django/shortcuts/__init__.py", line 20, in render_to_response return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)
File "/usr/lib/python2.7/dist-packages/django/template/loader.py", line 176, in render_to_string return t.render(context_instance)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 140, in render return self._render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 134, in _render return self.nodelist.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 823, in render bit = self.render_node(node, context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 837, in render_node return node.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/loader_tags.py", line 123, in render return compiled_parent._render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 134, in _render return self.nodelist.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 823, in render bit = self.render_node(node, context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 837, in render_node return node.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/loader_tags.py", line 123, in render return compiled_parent._render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 134, in _render return self.nodelist.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 823, in render bit = self.render_node(node, context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 837, in render_node return node.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/loader_tags.py", line 62, in render result = block.nodelist.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 823, in render bit = self.render_node(node, context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 837, in render_node return node.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/loader_tags.py", line 62, in render result = block.nodelist.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 823, in render bit = self.render_node(node, context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 837, in render_node return node.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/defaulttags.py", line 282, in render return nodelist.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 823, in render bit = self.render_node(node, context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 837, in render_node return node.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/loader_tags.py", line 155, in render return self.render_template(self.template, context)
File "/usr/lib/python2.7/dist-packages/django/template/loader_tags.py", line 137, in render_template output = template.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 140, in render return self._render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 134, in _render return self.nodelist.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 823, in render bit = self.render_node(node, context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 837, in render_node return node.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/defaulttags.py", line 282, in render return nodelist.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 823, in render bit = self.render_node(node, context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 837, in render_node return node.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/defaulttags.py", line 193, in render nodelist.append(node.render(context))
File "/usr/lib/python2.7/dist-packages/django/template/defaulttags.py", line 282, in render return nodelist.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 823, in render bit = self.render_node(node, context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 837, in render_node return node.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/defaulttags.py", line 282, in render return nodelist.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 823, in render bit = self.render_node(node, context)
File "/usr/lib/python2.7/dist-packages/django/template/base.py", line 837, in render_node return node.render(context)
File "/usr/lib/python2.7/dist-packages/django/template/defaulttags.py", line 426, in render raise e
NoReverseMatch: Reverse for 'seeddb-netbox-add-suggestion' with arguments '(u'\x01\nw\x14\r',)' and keyword arguments '{}' not found.

Thanks!

Revision history for this message
Morten Brekkevold (mbrekkevold) wrote :

It seems your neighboring devices are reported with a binary encoded IP address as either its chassis id or remote name, this case, it's 10.119.20.13. The neighbor record does not, however, indicate that this string is to be interpreted as an IP address, so NAV has stored it as the binary string it received, unchanged.

Unfortunately, the decimal 10 translates to a newline, which is what causes the NoReverseMatch error. Newlines can't be matched by the regexp-based URL configuration in Django, so it fails when attempting to generate a hyperlink to use to add the neighbor device to SeedDB.

It seems the only remedy here is to remember to escape non-printable characters sequences when building URLs, by adding a `urlencode` filter to the value.

Changed in nav:
status: New → Confirmed
assignee: nobody → Morten Brekkevold (mbrekkevold)
importance: Undecided → Medium
Revision history for this message
Morten Brekkevold (mbrekkevold) wrote :
Changed in nav:
status: Confirmed → Fix Released
milestone: none → 4.3.2
summary: - Issues to display some switches
+ LLDP neighbors with "funny" names may cause ipdevinfo NoReverseMatch
+ crash
Changed in nav:
status: Fix Released → Fix Committed
Changed in nav:
status: Fix Committed → Fix Released
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.