44 from clm.utils.cm
import CM
45 from clm.utils
import log
46 from clm.utils.exception
import CLMException
47 from clm.models.user
import User
48 from common.signature
import Signature
49 from common
import response
50 from common.states
import user_active_states
52 from functools
import wraps
54 from django.http
import HttpResponse
55 from django.db
import transaction
61 from common.utils
import json_convert
63 global decorated_functions
64 decorated_functions = set([])
91 def wrapper(*args, **kwargs):
92 return genericlog(kw.get(
'log',
False), kw.get(
'pack',
True),
False,
False,
False, fun, args, kwargs)
94 decorated_functions.add(wrapper)
124 def wrapper(*args, **kwargs):
125 return genericlog(kw.get(
'log',
False), kw.get(
'pack',
True),
True,
False,
False, fun, args, kwargs)
127 decorated_functions.add(wrapper)
161 def wrapper(*args, **kwargs):
162 return genericlog(kw.get(
'log',
False), kw.get(
'pack',
True),
True,
False,
True, fun, args, kwargs)
164 decorated_functions.add(wrapper)
198 def wrapper(*args, **kwargs):
199 return genericlog(kw.get(
'log',
False), kw.get(
'pack',
True),
True,
True,
False, fun, args, kwargs)
201 decorated_functions.add(wrapper)
208 def auth(is_user, is_clm_superuser, data):
210 login = data.pop(
'login')
211 password = data.get(
'password')
217 user = User.objects.get(login=login)
218 except User.DoesNotExist:
219 raise CLMException(
'user_get')
227 if 'Signature' in data.keys():
228 if not Signature.checkSignature(user.password, data.pop(
'Signature'), data[
'parameters']):
229 raise CLMException(
'user_get')
230 del data[
'parameters']
231 elif user.password != password:
232 raise CLMException(
'user_get')
234 data[
'caller_id'] = user.id
235 if user.is_active != user_active_states[
'ok']:
236 raise CLMException(
'user_inactive')
237 if is_clm_superuser
and not user.is_superuser:
238 raise CLMException(
'user_permission')
240 data[
'cm_id'] = data.pop(
'cm_id',
None)
241 if not data[
'cm_id']:
242 if user.default_cluster_id
is not None:
243 data[
'cm_id'] = user.default_cluster_id
272 def genericlog(log_enabled, pack_resp, is_user, is_clm_superuser, is_cm_superuser, fun, args, kwargs):
276 name =
'%s.%s' % (fun.__module__.replace(
'clm.views.',
''), fun.__name__)
280 data = json.loads(request.body)
284 gen_exception =
False
286 with transaction.commit_manually():
289 user_id =
auth(is_user, is_clm_superuser, data)
291 if pack_resp
and not hasattr(fun,
'packed'):
294 except CLMException, e:
295 transaction.rollback()
299 transaction.rollback()
302 resp =
response(
'clm_error', str(e))
304 if log_enabled
or resp[
'status'] !=
'ok':
305 log.debug(user_id,
'=' * 100)
306 log.debug(user_id,
'Function: %s' % name)
307 log.debug(user_id,
'ARGS:\n%s' % json.dumps(data, indent=4))
309 log.exception(user_id,
'General exception')
310 log.debug(user_id,
'Response: %s' % resp
or 'None')
312 return HttpResponse(json.dumps(resp, default=json_convert))
337 url =
r"%s/%s/" % (fun.__module__.replace(
"clm.views.",
"").replace(
".",
"/"), fun.__name__)
341 log.debug(0,
"Forward request to CM: %s" % url)
343 cm_response = CM(data.pop(
'cm_id')).send_request(url, **data)
344 if cm_response[
'status'] !=
'ok':
346 except CLMException, e:
347 cm_response = e.response
349 cm_response =
response(
'clm_error', str(e))
351 return fun(cm_response, **data)