KeyError at /storage/auto-import/ 'DATA' Request Method: GET Request URL: http://192.168.1.145/storage/auto-import/ Django Version: 1.3 Exception Type: KeyError Exception Value: 'DATA' Exception Location: /usr/local/www/freenasUI/middleware/notifier.py in detect_volumes, line 1475 Python Executable: /usr/local/bin/python Python Version: 2.7.1 Python Path: ['/usr/local/www/freenasUI', '/usr/local/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg', '/usr/local/lib/python2.7/site-packages/South-0.7.3-py2.7.egg', '/usr/local/lib/python2.7/site-packages/flup-1.0.2-py2.7.egg', '/usr/local/lib/python2.7/site-packages/python_ldap-2.3.13-py2.7-freebsd-8.2-RELEASE-amd64.egg', '/usr/local/lib/python27.zip', '/usr/local/lib/python2.7', '/usr/local/lib/python2.7/plat-freebsd8', '/usr/local/lib/python2.7/lib-tk', '/usr/local/lib/python2.7/lib-old', '/usr/local/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/site-packages', '/usr/local/www', '/usr/local/www', '/usr/local/www/freenasUI'] Server time: Sun, 14 Aug 2011 19:07:13 -0700 Traceback Switch to copy-and-paste view •/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py in get_response 98. resolver = urlresolvers.RegexURLResolver(r'^/', urlconf) 99. 100. callback, callback_args, callback_kwargs = resolver.resolve( 101. request.path_info) 102. 103. # Apply view middleware 104. for middleware_method in self._view_middleware: 105. response = middleware_method(request, callback, callback_args, callback_kwargs) ... 106. if response: 107. break 108. 109. if response is None: 110. try: 111. response = callback(request, *callback_args, **callback_kwargs) ? Local vars Variable Value exceptions u'' callback_args u'()' receivers u'[(, None)]' middleware_method u'>' self u'' settings u'' request u',\nPOST:,\nCOOKIES:{'csrftoken': '6f141202ebb719caf6076eb12153a460',\n 'mytreeSaveStateCookie': '1%2C5%2C11%2C16%2C20%2C26%2C29%2C42%2C45%2C52%2C67%2Croot',\n 'sessionid': 'e44bed1e33d57e572f0aaeff7dec3cbd'},\nMETA:{'CONTENT_TYPE': 'application/x-www-form-urlencoded',\n 'DOCUMENT_ROOT': '/usr/local/www/data/',\n 'GATEWAY_INTERFACE': 'CGI/1.1',\n 'HTTP_ACCEPT': '*/*',\n 'HTTP_ACCEPT_ENCODING': 'gzip, deflate',\n 'HTTP_ACCEPT_LANGUAGE': 'en-us',\n 'HTTP_CONNECTION': 'Keep-Alive',\n 'HTTP_COOKIE': 'csrftoken=6f141202ebb719caf6076eb12153a460; sessionid=e44bed1e33d57e572f0aaeff7dec3cbd; mytreeSaveStateCookie=1%2C5%2C11%2C16%2C20%2C26%2C29%2C42%2C45%2C52%2C67%2Croot',\n 'HTTP_HOST': '192.168.1.145',\n 'HTTP_REFERER': 'http://192.168.1.145/',\n 'HTTP_USER_AGENT': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)',\n 'HTTP_X_CSRFTOKEN': '6f141202ebb719caf6076eb12153a460',\n 'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest',\n 'PATH_INFO': u'/storage/auto-import/',\n 'PATH_TRANSLATED': '/usr/local/www/data//storage/auto-import/',\n 'QUERY_STRING': '',\n 'REDIRECT_STATUS': '200',\n 'REDIRECT_URI': '/mysite.fcgi/storage/auto-import/',\n 'REMOTE_ADDR': '192.168.1.108',\n 'REMOTE_PORT': '49415',\n 'REQUEST_METHOD': 'GET',\n 'REQUEST_URI': '/storage/auto-import/',\n 'SCRIPT_FILENAME': '/usr/local/www/data/mysite.fcgi',\n 'SCRIPT_NAME': u'',\n 'SERVER_ADDR': '192.168.1.145',\n 'SERVER_NAME': '192.168.1.145',\n 'SERVER_PORT': '80',\n 'SERVER_PROTOCOL': 'HTTP/1.1',\n 'SERVER_SOFTWARE': 'lighttpd/1.4.28',\n 'wsgi.errors': ,\n 'wsgi.input': ,\n 'wsgi.multiprocess': False,\n 'wsgi.multithread': True,\n 'wsgi.run_once': False,\n 'wsgi.url_scheme': 'http',\n 'wsgi.version': (1, 0)}>' callback u'' resolver u'' urlresolvers u'' callback_kwargs u'{}' response u'None' urlconf u''freenasUI.urls'' •/usr/local/www/freenasUI/freeadmin/middleware.py in process_view 42. unless its decorated with @public 43. """ 44. def process_view(self,request,view_func,view_args,view_kwargs): 45. if request.path == settings.LOGIN_URL: 46. return None 47. if hasattr(view_func, '__is_public'): 48. return None 49. return login_required(view_func)(request,*view_args,**view_kwargs) ... 50. 51.class LocaleMiddleware(object): 52. 53. def process_request(self, request): 54. if request.method == 'GET' and 'lang' in request.GET: 55. language = request.GET['lang'] ? Local vars Variable Value view_kwargs u'{}' view_args u'()' self u'' request u',\nPOST:,\nCOOKIES:{'csrftoken': '6f141202ebb719caf6076eb12153a460',\n 'mytreeSaveStateCookie': '1%2C5%2C11%2C16%2C20%2C26%2C29%2C42%2C45%2C52%2C67%2Croot',\n 'sessionid': 'e44bed1e33d57e572f0aaeff7dec3cbd'},\nMETA:{'CONTENT_TYPE': 'application/x-www-form-urlencoded',\n 'DOCUMENT_ROOT': '/usr/local/www/data/',\n 'GATEWAY_INTERFACE': 'CGI/1.1',\n 'HTTP_ACCEPT': '*/*',\n 'HTTP_ACCEPT_ENCODING': 'gzip, deflate',\n 'HTTP_ACCEPT_LANGUAGE': 'en-us',\n 'HTTP_CONNECTION': 'Keep-Alive',\n 'HTTP_COOKIE': 'csrftoken=6f141202ebb719caf6076eb12153a460; sessionid=e44bed1e33d57e572f0aaeff7dec3cbd; mytreeSaveStateCookie=1%2C5%2C11%2C16%2C20%2C26%2C29%2C42%2C45%2C52%2C67%2Croot',\n 'HTTP_HOST': '192.168.1.145',\n 'HTTP_REFERER': 'http://192.168.1.145/',\n 'HTTP_USER_AGENT': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)',\n 'HTTP_X_CSRFTOKEN': '6f141202ebb719caf6076eb12153a460',\n 'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest',\n 'PATH_INFO': u'/storage/auto-import/',\n 'PATH_TRANSLATED': '/usr/local/www/data//storage/auto-import/',\n 'QUERY_STRING': '',\n 'REDIRECT_STATUS': '200',\n 'REDIRECT_URI': '/mysite.fcgi/storage/auto-import/',\n 'REMOTE_ADDR': '192.168.1.108',\n 'REMOTE_PORT': '49415',\n 'REQUEST_METHOD': 'GET',\n 'REQUEST_URI': '/storage/auto-import/',\n 'SCRIPT_FILENAME': '/usr/local/www/data/mysite.fcgi',\n 'SCRIPT_NAME': u'',\n 'SERVER_ADDR': '192.168.1.145',\n 'SERVER_NAME': '192.168.1.145',\n 'SERVER_PORT': '80',\n 'SERVER_PROTOCOL': 'HTTP/1.1',\n 'SERVER_SOFTWARE': 'lighttpd/1.4.28',\n 'wsgi.errors': ,\n 'wsgi.input': ,\n 'wsgi.multiprocess': False,\n 'wsgi.multithread': True,\n 'wsgi.run_once': False,\n 'wsgi.url_scheme': 'http',\n 'wsgi.version': (1, 0)}>' view_func u'' •/usr/local/lib/python2.7/site-packages/django/contrib/auth/decorators.py in _wrapped_view 16. that takes the user object and returns True if the user passes. 17. """ 18. 19. def decorator(view_func): 20. @wraps(view_func, assigned=available_attrs(view_func)) 21. def _wrapped_view(request, *args, **kwargs): 22. if test_func(request.user): 23. return view_func(request, *args, **kwargs) ... 24. path = request.build_absolute_uri() 25. # If the login url is the same scheme and net location then just 26. # use the path as the "next" url. 27. login_scheme, login_netloc = urlparse.urlparse(login_url or 28. settings.LOGIN_URL)[:2] 29. current_scheme, current_netloc = urlparse.urlparse(path)[:2] ? Local vars Variable Value test_func u' at 0x807388ed8>' login_url u'None' args u'()' request u',\nPOST:,\nCOOKIES:{'csrftoken': '6f141202ebb719caf6076eb12153a460',\n 'mytreeSaveStateCookie': '1%2C5%2C11%2C16%2C20%2C26%2C29%2C42%2C45%2C52%2C67%2Croot',\n 'sessionid': 'e44bed1e33d57e572f0aaeff7dec3cbd'},\nMETA:{'CONTENT_TYPE': 'application/x-www-form-urlencoded',\n 'DOCUMENT_ROOT': '/usr/local/www/data/',\n 'GATEWAY_INTERFACE': 'CGI/1.1',\n 'HTTP_ACCEPT': '*/*',\n 'HTTP_ACCEPT_ENCODING': 'gzip, deflate',\n 'HTTP_ACCEPT_LANGUAGE': 'en-us',\n 'HTTP_CONNECTION': 'Keep-Alive',\n 'HTTP_COOKIE': 'csrftoken=6f141202ebb719caf6076eb12153a460; sessionid=e44bed1e33d57e572f0aaeff7dec3cbd; mytreeSaveStateCookie=1%2C5%2C11%2C16%2C20%2C26%2C29%2C42%2C45%2C52%2C67%2Croot',\n 'HTTP_HOST': '192.168.1.145',\n 'HTTP_REFERER': 'http://192.168.1.145/',\n 'HTTP_USER_AGENT': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)',\n 'HTTP_X_CSRFTOKEN': '6f141202ebb719caf6076eb12153a460',\n 'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest',\n 'PATH_INFO': u'/storage/auto-import/',\n 'PATH_TRANSLATED': '/usr/local/www/data//storage/auto-import/',\n 'QUERY_STRING': '',\n 'REDIRECT_STATUS': '200',\n 'REDIRECT_URI': '/mysite.fcgi/storage/auto-import/',\n 'REMOTE_ADDR': '192.168.1.108',\n 'REMOTE_PORT': '49415',\n 'REQUEST_METHOD': 'GET',\n 'REQUEST_URI': '/storage/auto-import/',\n 'SCRIPT_FILENAME': '/usr/local/www/data/mysite.fcgi',\n 'SCRIPT_NAME': u'',\n 'SERVER_ADDR': '192.168.1.145',\n 'SERVER_NAME': '192.168.1.145',\n 'SERVER_PORT': '80',\n 'SERVER_PROTOCOL': 'HTTP/1.1',\n 'SERVER_SOFTWARE': 'lighttpd/1.4.28',\n 'wsgi.errors': ,\n 'wsgi.input': ,\n 'wsgi.multiprocess': False,\n 'wsgi.multithread': True,\n 'wsgi.run_once': False,\n 'wsgi.url_scheme': 'http',\n 'wsgi.version': (1, 0)}>' kwargs u'{}' redirect_field_name u''next'' view_func u'' •/usr/local/www/freenasUI/storage/views.py in volautoimport 143. else: 144. 145. if 'volume_disks' in request.POST: 146. disks = request.POST.getlist('volume_disks') 147. else: 148. disks = None 149. else: 150. form = forms.VolumeAutoImportForm() ... 151. disks = [] 152. return render(request, 'storage/autoimport.html', { 153. 'form': form, 154. 'disks': disks 155. }) 156. ? Local vars Variable Value request u',\nPOST:,\nCOOKIES:{'csrftoken': '6f141202ebb719caf6076eb12153a460',\n 'mytreeSaveStateCookie': '1%2C5%2C11%2C16%2C20%2C26%2C29%2C42%2C45%2C52%2C67%2Croot',\n 'sessionid': 'e44bed1e33d57e572f0aaeff7dec3cbd'},\nMETA:{'CONTENT_TYPE': 'application/x-www-form-urlencoded',\n 'DOCUMENT_ROOT': '/usr/local/www/data/',\n 'GATEWAY_INTERFACE': 'CGI/1.1',\n 'HTTP_ACCEPT': '*/*',\n 'HTTP_ACCEPT_ENCODING': 'gzip, deflate',\n 'HTTP_ACCEPT_LANGUAGE': 'en-us',\n 'HTTP_CONNECTION': 'Keep-Alive',\n 'HTTP_COOKIE': 'csrftoken=6f141202ebb719caf6076eb12153a460; sessionid=e44bed1e33d57e572f0aaeff7dec3cbd; mytreeSaveStateCookie=1%2C5%2C11%2C16%2C20%2C26%2C29%2C42%2C45%2C52%2C67%2Croot',\n 'HTTP_HOST': '192.168.1.145',\n 'HTTP_REFERER': 'http://192.168.1.145/',\n 'HTTP_USER_AGENT': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)',\n 'HTTP_X_CSRFTOKEN': '6f141202ebb719caf6076eb12153a460',\n 'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest',\n 'PATH_INFO': u'/storage/auto-import/',\n 'PATH_TRANSLATED': '/usr/local/www/data//storage/auto-import/',\n 'QUERY_STRING': '',\n 'REDIRECT_STATUS': '200',\n 'REDIRECT_URI': '/mysite.fcgi/storage/auto-import/',\n 'REMOTE_ADDR': '192.168.1.108',\n 'REMOTE_PORT': '49415',\n 'REQUEST_METHOD': 'GET',\n 'REQUEST_URI': '/storage/auto-import/',\n 'SCRIPT_FILENAME': '/usr/local/www/data/mysite.fcgi',\n 'SCRIPT_NAME': u'',\n 'SERVER_ADDR': '192.168.1.145',\n 'SERVER_NAME': '192.168.1.145',\n 'SERVER_PORT': '80',\n 'SERVER_PROTOCOL': 'HTTP/1.1',\n 'SERVER_SOFTWARE': 'lighttpd/1.4.28',\n 'wsgi.errors': ,\n 'wsgi.input': ,\n 'wsgi.multiprocess': False,\n 'wsgi.multithread': True,\n 'wsgi.run_once': False,\n 'wsgi.url_scheme': 'http',\n 'wsgi.version': (1, 0)}>' •/usr/local/www/freenasUI/storage/forms.py in __init__ 433.class VolumeAutoImportForm(forms.Form): 434. 435. #volume_name = forms.CharField(max_length = 30, label = _('Volume name') ) 436. volume_disks = forms.ChoiceField(choices=(), widget=forms.Select(attrs=attrs_dict), label = _('Member disk')) 437. 438. def __init__(self, *args, **kwargs): 439. super(VolumeAutoImportForm, self).__init__(*args, **kwargs) 440. self.fields['volume_disks'].choices = self._populate_disk_choices() ... 441. 442. def _populate_disk_choices(self): 443. 444. diskchoices = dict() 445. used_disks = [notifier().identifier_to_device(i[0]) for i in models.Disk.objects.all().values_list('disk_identifier').distinct()] 446. ? Local vars Variable Value self u'' args u'()' kwargs u'{}' •/usr/local/www/freenasUI/storage/forms.py in _populate_disk_choices 442. def _populate_disk_choices(self): 443. 444. diskchoices = dict() 445. used_disks = [notifier().identifier_to_device(i[0]) for i in models.Disk.objects.all().values_list('disk_identifier').distinct()] 446. 447. # Grab partition list 448. # NOTE: This approach may fail if device nodes are not accessible. 449. vols = notifier().detect_volumes() ... 450. 451. for vol in list(vols): 452. for vdev in vol['disks']['vdevs']: 453. for disk in vdev['disks']: 454. if len([i for i in used_disks if i is not None and disk.startswith(i)]) > 0: 455. vols.remove(vol) ? Local vars Variable Value used_disks u'[]' self u'' diskchoices u'{}' •/usr/local/www/freenasUI/middleware/notifier.py in detect_volumes 1468. volumes.append({ 1469. 'label': pool, 1470. 'type': 'zfs', 1471. 'group_type': 'none', 1472. 'cache': roots['cache'].dump() if roots['cache'] else None, 1473. 'logs': roots['logs'].dump() if roots['logs'] else None, 1474. 'spare': roots['spares'].dump() if roots['spares'] else None, 1475. 'disks': roots[pool].dump(), ... 1476. }) 1477. 1478. return volumes 1479. 1480. def zfs_import(self, name): 1481. imp = self.__pipeopen('zpool import -R /mnt %s' % name) ? Local vars Variable Value node u'' status u''\\n\\n\\tDATA-2 ONLINE\\n\\t gptid/bab71ae5-a9b3-11e0-b39f-001b21a35c96 ONLINE\\n\\n '' search u'[]' ident u'1' word u''gptid/bab71ae5-a9b3-11e0-b39f-001b21a35c96'' volumes u'[{'cache': None,\n 'disks': {'name': 'DATA-2',\n 'vdevs': [{'disks': ['ada2p2'], 'type': 'stripe'}]},\n 'group_type': 'none',\n 'label': 'DATA-2',\n 'logs': None,\n 'spare': None,\n 'type': 'zfs'}]' extra u'None' res u'' pool: DATA-2\\n id: 3326300116117912700\\n state: ONLINE\\naction: The pool can be imported using its name or numeric identifier.\\nconfig:\\n\\n\\tDATA-2 ONLINE\\n\\t gptid/bab71ae5-a9b3-11e0-b39f-001b21a35c96 ONLINE\\n\\n pool: DATA\\n id: 15776827717146001963\\n state: ONLINE\\naction: The pool can be imported using its name or numeric identifier.\\nconfig:\\n\\n\\tDATA ONLINE\\n\\t gptid/37ba96fb-a779-11e0-b50f-001b21a35c96 ONLINE\\n\\n pool: DATA-3\\n id: 7573464584323046109\\n state: ONLINE\\naction: The pool can be imported using its name or numeric identifier.\\nconfig:\\n\\n\\tDATA-3 ONLINE\\n\\t gptid/444c1b85-ae8d-11e0-8604-001b21a35c96 ONLINE\\n'' self u'' p1 u'' tree u'' Tnode u'' lastident u'1' pnode u'' spaces u'' '' geom u''raid3'' pool u''DATA'' RE_POOL_NAME u'<_sre.SRE_Pattern object at 0x806a4f980>' doc u'' line u'' '' roots u'{'DATA-2': , 'cache': None, 'logs': None, 'spares': None}' Environment: Request Method: GET Request URL: http://192.168.1.145/storage/auto-import/ Django Version: 1.3 Python Version: 2.7.1 Installed Applications: ['django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.staticfiles', 'freeadmin', 'south', 'dojango', 'account', 'system', 'network', 'storage', 'sharing', 'services'] Installed Middleware: ('django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'freenasUI.freeadmin.middleware.LocaleMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'freenasUI.freeadmin.middleware.RequireLoginMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'dojango.middleware.DojoCollector') Traceback: File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 105. response = middleware_method(request, callback, callback_args, callback_kwargs) File "/usr/local/www/freenasUI/freeadmin/middleware.py" in process_view 49. return login_required(view_func)(request,*view_args,**view_kwargs) File "/usr/local/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view 23. return view_func(request, *args, **kwargs) File "/usr/local/www/freenasUI/storage/views.py" in volautoimport 150. form = forms.VolumeAutoImportForm() File "/usr/local/www/freenasUI/storage/forms.py" in __init__ 440. self.fields['volume_disks'].choices = self._populate_disk_choices() File "/usr/local/www/freenasUI/storage/forms.py" in _populate_disk_choices 449. vols = notifier().detect_volumes() File "/usr/local/www/freenasUI/middleware/notifier.py" in detect_volumes 1475. 'disks': roots[pool].dump(), Exception Type: KeyError at /storage/auto-import/ Exception Value: 'DATA' Request information GET No GET data POST No POST data FILES No FILES data COOKIES Variable Value csrftoken '6f141202ebb719caf6076eb12153a460' sessionid 'e44bed1e33d57e572f0aaeff7dec3cbd' mytreeSaveStateCookie '1%2C5%2C11%2C16%2C20%2C26%2C29%2C42%2C45%2C52%2C67%2Croot' META Variable Value wsgi.multiprocess False HTTP_REFERER 'http://192.168.1.145/' REDIRECT_STATUS '200' SERVER_SOFTWARE 'lighttpd/1.4.28' SCRIPT_NAME u'' HTTP_X_CSRFTOKEN '6f141202ebb719caf6076eb12153a460' REQUEST_METHOD 'GET' PATH_INFO u'/storage/auto-import/' SERVER_PROTOCOL 'HTTP/1.1' QUERY_STRING '' HTTP_USER_AGENT 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)' HTTP_CONNECTION 'Keep-Alive' HTTP_COOKIE 'csrftoken=6f141202ebb719caf6076eb12153a460; sessionid=e44bed1e33d57e572f0aaeff7dec3cbd; mytreeSaveStateCookie=1%2C5%2C11%2C16%2C20%2C26%2C29%2C42%2C45%2C52%2C67%2Croot' SERVER_NAME '192.168.1.145' REMOTE_PORT '49415' wsgi.url_scheme 'http' PATH_TRANSLATED '/usr/local/www/data//storage/auto-import/'