import os
import re
from threading import Event
-from django.utils.http import urlunquote
+from django.utils.http import urlunquote
from django.utils.timezone import localtime, UTC
from gridftp import FTPClient, Buffer, HandleAttr, OperationAttr
class FTPError(Exception):
- pass
+ def __init__(self, message, verbose=None, *args, **kwargs):
+ super(FTPError, self).__init__(message, *args, **kwargs)
+
+ self.verbose = verbose
class FTPOperation:
self._end.clear()
if self._error is not None:
- # TODO logging
- print 'GridFTP ERROR:', self._error
-
match = re.search(r'A system call failed: (.*)$', self._error.replace('\r\n', '\n'), re.MULTILINE)
msg = match.groups()[0] if match else "Unknown error"
- raise FTPError(msg)
+ raise FTPError(msg, self._error)
def listing(self, url):
self.cli.verbose_list(url, self._done, None, self.op_attr)
from functools import wraps
+import logging
from django.core.validators import RegexValidator
-from django.http import JsonResponse, HttpResponse
-from django.template.loader import render_to_string
+from django.http import JsonResponse
from django.views.decorators.csrf import csrf_protect, csrf_exempt
from filex.ftp import FTPError
except FTPError as e:
msg, status = parse_ftp_error(e)
+ logger = logging.getLogger('gridftp')
+ logger.error(e.verbose,
+ extra={'user': request.user, 'path': request.path, 'params': dict(request.GET.iterlists())})
+
return JsonResponse({'error': msg}, status=status)
return csrf_exempt(wrapped_view)
from itertools import islice
+import logging
import mimetypes
import os
except FTPError as e:
msg, status = parse_ftp_error(e)
+ logger = logging.getLogger('gridftp')
+ logger.error(e.verbose, extra={'user': request.user, 'path': request.path, 'params': form.cleaned_data})
+
return JsonResponse({'error': msg}, status=status)
setattr(cls, cls.method, process)
'format': '[%(asctime)s] %(levelname)-8s - %(filename)s:%(lineno)s in %(funcName)s - %(message)s',
'datefmt': DATE_FORMAT,
},
+ 'gridftp': {
+ 'format': '[%(asctime)s] %(levelname)-8s - %(path)s - <%(user)s> - %(params)s - %(message)s',
+ 'datefmt': DATE_FORMAT,
+ },
},
'filters': {
'request_filter': {
'maxBytes': 1024 * 1024 * 5, # 5 MB
'formatter': 'verbose',
},
+ 'gridftp': {
+ 'level': 'DEBUG',
+ 'class': 'logging.handlers.RotatingFileHandler',
+ 'filename': os.path.join(LOGS_DIR, 'gridftp.log'),
+ 'maxBytes': 1024 * 1024 * 5, # 5 MB
+ 'formatter': 'gridftp',
+ },
},
'loggers': {
'django': {
'level': 'INFO',
'propagate': False,
},
+ 'gridftp': {
+ 'handlers': ['gridftp'],
+ 'level': 'INFO',
+ },
+
}
}