diff --git a/clientsdb.py b/clientsdb.py index 2dfdfe1..a079823 100644 --- a/clientsdb.py +++ b/clientsdb.py @@ -78,7 +78,7 @@ def validate(clientemail, password): except: ioconfig.logger.warning('clients> {} was not found in the database!'.format(clientemail)) #log bad ips here... - return False + return {} #2. check the password encpass = clientsdb[c_id]['encpasswd'] diff --git a/proxmaster.py b/proxmaster.py index cbf8a0e..cb5fc3f 100644 --- a/proxmaster.py +++ b/proxmaster.py @@ -27,6 +27,54 @@ def welcome(): logger.info('###################################') +def selector(fn, req, vmid=0): + """ TRY to exec commands """ + json = req.context['doc'] + apipass = json['apikey'] + if apipass != config.get('general', 'apipass'): + status = falcon.HTTP_404 + body = '404 Not Found' + logger.error('grid> access denied. bad api key!') + fn = '404' + + try: + if fn == 'validate': + clientemail = json['clientemail'] + passwd = json['password'] + #logger.info('grid> access requested for {} with {}'.format(clientemail, passwd)) + body = clientsdb.validate(clientemail, passwd) + + elif fn == 'create': + body = urllib.parse.urlencode(plugin.vmcreate(req.params)) + elif fn == 'status': + body = urllib.parse.urlencode(plugin.vmstatus(vmid)) + elif fn == 'delete': + body = urllib.parse.urlencode(plugin.vmdelete(vmid)) + elif fn == 'suspend': + body = urllib.parse.urlencode(plugin.vmsuspend(vmid)) + elif fn == 'resume': + body = urllib.parse.urlencode(plugin.vmresume(vmid)) + elif fn == 'start': + body = urllib.parse.urlencode(plugin.vmstart(vmid)) + elif fn == 'shutdown': + body = urllib.parse.urlencode(plugin.vmshutdown(vmid)) + elif fn == 'stop': + body = urllib.parse.urlencode(plugin.vmstop(vmid)) + elif fn == 'vnc': + body = urllib.parse.urlencode(plugin.vmvnc(vmid)) + + except: + logger.critical('grid> {} malfunction!'.format(fn)) + body = '793 Zombie Apocalypse' + status = falcon.HTTP_404 + + else: + #logger.info('{}> 200 OK'.format(fn)) + status = falcon.HTTP_202 + + return status, body + + class RequireJSON(object): def process_request(self, req, resp): if not req.client_accepts_json: @@ -86,246 +134,100 @@ def max_body(limit): return hook -#API methods class ValidateResource(object): @falcon.before(max_body(64 * 1024)) def on_post(self, req, resp): """ get clientemail and password and compare it with the client db and returns a list of managed object IDs """ - json = req.context['doc'] - apipass = json['apikey'] - if apipass != config.get('general', 'apipass'): - resp.status = falcon.HTTP_404 - logger.error('grid> access denied. bad api key!') - return None - - clientemail = json['clientemail'] - passwd = json['password'] - - logger.info('grid> access requested for {} with {}'.format(clientemail, passwd)) - - response = clientsdb.validate(clientemail, passwd) - resp.status = falcon.HTTP_202 + resp.status, response = selector('validate', req) req.context['result'] = response - class ClusterResource(object): - def on_get(self, req, resp): - """TEST ONLY. List cluster nodes. TEST ONLY""" - json = req.context['doc'] - apipass = json['apikey'] - if apipass != config.get('general', 'apipass'): - resp.status = falcon.HTTP_404 - logger.error('grid> access denied. bad api key!') - return None - - logger.info('grid> cache status') - - response = grid.sync(False) - resp.status = falcon.HTTP_202 - req.context['result'] = response - - + #def on_get(self, req, resp): + # """ TEST . List cluster nodes . TEST """ + # logger.info('grid> cache status') + # response = grid.sync(False) + # response = 'poke' + # req.context['result'] = response @falcon.before(max_body(64 * 1024)) def on_post(self, req, resp): """Create a cluster node, returns array of: status, vmid, pass, ipv4, """ logger.info('grid> create ' + str(req.params)) - apicheck_stat, apicheck_resp = apicheck(req.params) - if apicheck_stat: - resp.status = falcon.HTTP_200 - try: - resp.body = urllib.parse.urlencode(plugin.vmcreate(req.params)) - except: - logger.error('grid> create function cancelled') - raise - resp.status = falcon.HTTP_403 - response = 'CREATE ERR' - resp.body = response - else: - resp.status = falcon.HTTP_403 - resp.body = apicheck_resp - + resp.status, response = selector('create', req) + req.context['result'] = response class StatusResource(object): - def on_get(self, req, resp, vmid): + @falcon.before(max_body(64 * 1024)) + def on_post(self, req, resp, vmid): """ check vm status """ logger.info('grid> status ' + str(vmid)) - apicheck_stat, apicheck_resp = apicheck(req.params) - if apicheck_stat: - resp.status = falcon.HTTP_200 - try: - resp.body = urllib.parse.urlencode(plugin.vmstatus(vmid)) - except: - logger.error('grid> status error') - raise - resp.status = falcon.HTTP_403 - response = 'STATUS ERR' - resp.body = response - else: - resp.status = falcon.HTTP_403 - resp.body = apicheck_resp - + resp.status, response = selector('status', req, vmid) + req.context['result'] = response class DeleteResource(object): @falcon.before(max_body(64 * 1024)) def on_post(self, req, resp, vmid): """ delete machine completely""" logger.info('grid> delete ' + str(vmid)) - apicheck_stat, apicheck_resp = apicheck(req.params) - if apicheck_stat: - try: - resp.body = urllib.parse.urlencode(plugin.vmdelete(vmid)) - except: - logger.error('grid> delete error') - raise - resp.status = falcon.HTTP_403 - response = 'DELETE ERR' - resp.body = response - else: - resp.status = falcon.HTTP_403 - resp.body = apicheck_resp - + resp.status, response = selector('delete', req, vmid) + req.context['result'] = response class ArchivateResource(object): @falcon.before(max_body(64 * 1024)) def on_post(self, req, resp, vmid): """ Temporary suspend the instance """ logger.info('grid> suspend ' + str(vmid)) - apicheck_stat, apicheck_resp = apicheck(req.params) - if apicheck_stat: - resp.status = falcon.HTTP_202 - try: - resp.body = urllib.parse.urlencode(plugin.vmsuspend(vmid)) - except: - logger.error('grid> pause error') - raise - resp.status = falcon.HTTP_403 - response = 'PAUSE ERR' - resp.body = response - else: - resp.status = falcon.HTTP_403 - resp.body = apicheck_resp - + resp.status, response = selector('suspend', req, vmid) + req.context['result'] = response class UnArchiveResource(object): @falcon.before(max_body(64 * 1024)) def on_post(self, req, resp, vmid): """ Unuspend the instance """ logger.info('grid> resume ' + str(vmid)) - apicheck_stat, apicheck_resp = apicheck(req.params) - if apicheck_stat: - resp.status = falcon.HTTP_202 - try: - resp.body = urllib.parse.urlencode(plugin.vmresume(vmid)) - except: - logger.error('grid> resume error') - raise - resp.status = falcon.HTTP_403 - response = 'RESUME ERR' - resp.body = response - else: - resp.status = falcon.HTTP_403 - resp.body = apicheck_resp - + resp.status, response = selector('resume', req, vmid) + req.context['result'] = response class StartResource(object): @falcon.before(max_body(64 * 1024)) def on_post(self, req, resp, vmid): """ Start the instance """ logger.info('grid> start ' + str(vmid)) - apicheck_stat, apicheck_resp = apicheck(req.params) - if apicheck_stat: - resp.status = falcon.HTTP_202 - try: - resp.body = urllib.parse.urlencode(plugin.vmstart(vmid)) - except: - logger.error('grid> start error') - #raise - resp.status = falcon.HTTP_403 - response = 'START ERR' - resp.body = response - else: - resp.status = falcon.HTTP_403 - resp.body = apicheck_resp - + resp.status, response = selector('start', req, vmid) + req.context['result'] = response class ShutdownResource(object): @falcon.before(max_body(64 * 1024)) def on_post(self, req, resp, vmid): """ ACPI Shutdown the instance """ logger.info('grid> shutdown ' + str(vmid)) - apicheck_stat, apicheck_resp = apicheck(req.params) - if apicheck_stat: - resp.status = falcon.HTTP_202 - try: - resp.body = urllib.parse.urlencode(plugin.vmshutdown(vmid)) - #TODO: Try few times and then return proper status message - except: - logger.error('grid> shutdown error') - #raise - resp.status = falcon.HTTP_403 - response = 'SHUTDOWN ERR' - resp.body = response - else: - resp.status = falcon.HTTP_403 - resp.body = apicheck_resp - + resp.status, response = selector('shutdown', req, vmid) + req.context['result'] = response class StopResource(object): @falcon.before(max_body(64 * 1024)) def on_post(self, req, resp, vmid): """ Stop the instance """ logger.info('grid> stop ' + str(vmid)) - apicheck_stat, apicheck_resp = apicheck(req.params) - if apicheck_stat: - resp.status = falcon.HTTP_202 - try: - resp.body = urllib.parse.urlencode(plugin.vmstop(vmid)) - except: - logger.error('grid> stop error') - #raise - resp.status = falcon.HTTP_403 - response = 'STOP ERR' - resp.body = response - else: - resp.status = falcon.HTTP_403 - resp.body = apicheck_resp + resp.status, response = selector('stop', req, vmid) + req.context['result'] = response class VNCResource(object): @falcon.before(max_body(64 * 1024)) def on_post(self, req, resp, vmid): """ Create a VNC link to the instance """ - apicheck_stat, apicheck_resp = apicheck(req.params) logger.info('grid> vnc ' + str(vmid)) - if apicheck_stat: - try: - resp.status = falcon.HTTP_202 - resp.body = urllib.parse.urlencode(plugin.vmvnc(vmid)) - except: - logger.error('grid> vnc error') - raise - resp.status = falcon.HTTP_403 - response = 'VNC ERR' - resp.body = response - else: - resp.status = falcon.HTTP_403 - resp.body = apicheck_resp - + resp.status, response = selector('vnc', req, vmid) + req.context['result'] = response if __name__ == '__main__': sys.exit("invoke proxmaster via uwsgi. thanks. bye. o/") -#setup routes wsgi_app = api = application = falcon.API(middleware=[ RequireJSON(), JSONTranslator(), ]) -#display motd -welcome() -#logger.info('grid> sync') -#grid.sync() - # setup routes res_validate = ValidateResource() api.add_route('/validate', res_validate) @@ -357,3 +259,6 @@ api.add_route('/instance/stop/{vmid}', res_stop) res_vnc = VNCResource() api.add_route('/instance/vnc/{vmid}', res_vnc) +#display motd +welcome() +