mirror of
https://github.com/YunoHost/moulinette.git
synced 2024-09-03 20:06:31 +02:00
Implement an actions map plugin for the api
This commit is contained in:
parent
9b47c2a416
commit
a2be4d6e12
2 changed files with 54 additions and 31 deletions
|
@ -7,9 +7,12 @@ from beaker.middleware import SessionMiddleware
|
||||||
from ..config import session_path, doc_json_path
|
from ..config import session_path, doc_json_path
|
||||||
from helpers import YunoHostError, YunoHostLDAP
|
from helpers import YunoHostError, YunoHostLDAP
|
||||||
|
|
||||||
|
|
||||||
|
## Bottle Plugins
|
||||||
|
|
||||||
class APIAuthPlugin(object):
|
class APIAuthPlugin(object):
|
||||||
"""
|
"""
|
||||||
This Bottle plugin manages the authentication for the API access.
|
Manage the authentication for the API access.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
name = 'apiauth'
|
name = 'apiauth'
|
||||||
|
@ -60,12 +63,7 @@ class APIAuthPlugin(object):
|
||||||
if context.name == 'login':
|
if context.name == 'login':
|
||||||
self.logout()
|
self.logout()
|
||||||
else:
|
else:
|
||||||
# TODO: Fix this tweak to retrieve uri from the callback
|
return callback
|
||||||
def wrapper(*args, **kwargs):
|
|
||||||
if hasattr(context.config, '_uri'):
|
|
||||||
kwargs['_uri'] = context.config._uri
|
|
||||||
return callback(*args, **kwargs)
|
|
||||||
return wrapper
|
|
||||||
|
|
||||||
# Process login route
|
# Process login route
|
||||||
if context.name == 'login':
|
if context.name == 'login':
|
||||||
|
@ -121,6 +119,46 @@ class APIAuthPlugin(object):
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
class ActionsMapPlugin(object):
|
||||||
|
"""
|
||||||
|
Process action for the request using the actions map.
|
||||||
|
|
||||||
|
"""
|
||||||
|
name = 'actionsmap'
|
||||||
|
api = 2
|
||||||
|
|
||||||
|
def __init__(self, actionsmap):
|
||||||
|
self.actionsmap = actionsmap
|
||||||
|
|
||||||
|
def setup(self, app):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def apply(self, callback, context):
|
||||||
|
"""
|
||||||
|
Process the relevant action for the request
|
||||||
|
|
||||||
|
Keyword argument:
|
||||||
|
callback -- The route callback
|
||||||
|
context -- An instance of Route
|
||||||
|
|
||||||
|
"""
|
||||||
|
method = request.method
|
||||||
|
uri = context.rule
|
||||||
|
|
||||||
|
def wrapper(*args, **kwargs):
|
||||||
|
# Bring arguments together
|
||||||
|
params = kwargs
|
||||||
|
for a in args:
|
||||||
|
params[a] = True
|
||||||
|
for k, v in request.params.items():
|
||||||
|
params[k] = v
|
||||||
|
|
||||||
|
# Process the action
|
||||||
|
return self.actionsmap.process(params, route=(method, uri))
|
||||||
|
return wrapper
|
||||||
|
|
||||||
|
|
||||||
|
## Main class
|
||||||
|
|
||||||
class MoulinetteAPI(object):
|
class MoulinetteAPI(object):
|
||||||
"""
|
"""
|
||||||
|
@ -137,18 +175,19 @@ class MoulinetteAPI(object):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, actionsmap, routes={}):
|
def __init__(self, actionsmap, routes={}):
|
||||||
self.actionsmap = actionsmap
|
|
||||||
|
|
||||||
# Initialize app and default routes
|
# Initialize app and default routes
|
||||||
# TODO: Return OK to 'OPTIONS' xhr requests (l173)
|
# TODO: Return OK to 'OPTIONS' xhr requests (l173)
|
||||||
app = Bottle()
|
app = Bottle()
|
||||||
app.route(['/api', '/api/<category:re:[a-z]+>'], method='GET', callback=self.doc, skip=['apiauth'])
|
app.route(['/api', '/api/<category:re:[a-z]+>'], method='GET',
|
||||||
|
callback=self.doc, skip=['apiauth'])
|
||||||
|
|
||||||
# Append routes from the actions map
|
# Append routes from the actions map
|
||||||
|
amap = ActionsMapPlugin(actionsmap)
|
||||||
for (m, u) in actionsmap.parser.routes:
|
for (m, u) in actionsmap.parser.routes:
|
||||||
app.route(u, method=m, callback=self._route_wrapper, _uri=u)
|
app.route(u, method=m, callback=self._error, apply=amap)
|
||||||
|
|
||||||
# Append additional routes
|
# Append additional routes
|
||||||
|
# TODO: Add an option to skip auth for the route
|
||||||
for (m, u), c in routes.items():
|
for (m, u), c in routes.items():
|
||||||
app.route(u, method=m, callback=c)
|
app.route(u, method=m, callback=c)
|
||||||
|
|
||||||
|
@ -190,22 +229,6 @@ class MoulinetteAPI(object):
|
||||||
except IOError:
|
except IOError:
|
||||||
return 'unknown'
|
return 'unknown'
|
||||||
|
|
||||||
def _route_wrapper(self, *args, **kwargs):
|
def _error(self, *args, **kwargs):
|
||||||
"""Process the relevant action for the request"""
|
# TODO: Raise or return an error
|
||||||
# Retrieve uri
|
print('error')
|
||||||
if '_uri' in kwargs:
|
|
||||||
uri = kwargs['_uri']
|
|
||||||
del kwargs['_uri']
|
|
||||||
else:
|
|
||||||
uri = request.path
|
|
||||||
|
|
||||||
# Bring arguments together
|
|
||||||
params = kwargs
|
|
||||||
for a in args:
|
|
||||||
params[a] = True
|
|
||||||
for k, v in request.params.items():
|
|
||||||
params[k] = v
|
|
||||||
|
|
||||||
# Process the action
|
|
||||||
# TODO: Catch errors
|
|
||||||
return self.actionsmap.process(params, (request.method, uri))
|
|
||||||
|
|
|
@ -360,7 +360,7 @@ def monitor_enable(no_stats=False):
|
||||||
|
|
||||||
# Install crontab
|
# Install crontab
|
||||||
if not no_stats:
|
if not no_stats:
|
||||||
cmd = 'cd /home/admin/dev/moulinette && ./yunohost monitor update-stats'
|
cmd = 'yunohost monitor update-stats'
|
||||||
# day: every 5 min # week: every 1 h # month: every 4 h #
|
# day: every 5 min # week: every 1 h # month: every 4 h #
|
||||||
rules = ('*/5 * * * * root %(cmd)s day --no-ldap >> /dev/null\n' + \
|
rules = ('*/5 * * * * root %(cmd)s day --no-ldap >> /dev/null\n' + \
|
||||||
'3 * * * * root %(cmd)s week --no-ldap >> /dev/null\n' + \
|
'3 * * * * root %(cmd)s week --no-ldap >> /dev/null\n' + \
|
||||||
|
|
Loading…
Add table
Reference in a new issue