From a9f64a34726f6d0e36422a2e1dd755e0183650a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9?= Date: Fri, 3 Nov 2017 20:26:09 +0100 Subject: [PATCH] [Dockerapi] Return answers in json --- data/Dockerfiles/dockerapi/server.py | 66 ++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 19 deletions(-) diff --git a/data/Dockerfiles/dockerapi/server.py b/data/Dockerfiles/dockerapi/server.py index aabcaf31..b406b5ee 100644 --- a/data/Dockerfiles/dockerapi/server.py +++ b/data/Dockerfiles/dockerapi/server.py @@ -1,6 +1,7 @@ from flask import Flask from flask_restful import Resource, Api from flask import jsonify +from flask import request from threading import Thread import docker import signal @@ -13,17 +14,23 @@ api = Api(app) class containers_get(Resource): def get(self): containers = {} - for container in docker_client.containers.list(all=True): - containers.update({container.attrs['Id']: container.attrs}) - return containers + try: + for container in docker_client.containers.list(all=True): + containers.update({container.attrs['Id']: container.attrs}) + return containers + except Exception as e: + return jsonify(type='danger', msg=e) class container_get(Resource): def get(self, container_id): if container_id and container_id.isalnum(): - for container in docker_client.containers.list(all=True, filters={"id": container_id}): - return container.attrs + try: + for container in docker_client.containers.list(all=True, filters={"id": container_id}): + return container.attrs + except Exception as e: + return jsonify(type='danger', msg=e) else: - return jsonify(message='No or invalid id defined') + return jsonify(type='danger', msg='no or invalid id defined') class container_post(Resource): def post(self, container_id, post_action): @@ -32,30 +39,51 @@ class container_post(Resource): try: for container in docker_client.containers.list(all=True, filters={"id": container_id}): container.stop() - except: - return 'Error' - else: - return 'OK' + return jsonify(type='success', msg='command completed successfully') + except Exception as e: + return jsonify(type='danger', msg=e) + elif post_action == 'start': try: for container in docker_client.containers.list(all=True, filters={"id": container_id}): container.start() - except: - return 'Error' - else: - return 'OK' + return jsonify(type='success', msg='command completed successfully') + except Exception as e: + return jsonify(type='danger', msg=e) + elif post_action == 'restart': try: for container in docker_client.containers.list(all=True, filters={"id": container_id}): container.restart() - except: - return 'Error' + return jsonify(type='success', msg='command completed successfully') + except Exception as e: + return jsonify(type='danger', msg=e) + + elif post_action == 'exec': + + if not request.json or not 'cmd' in request.json: + return jsonify(type='danger', msg='cmd is missing') + + if request.json['cmd'] == 'sieve_list' and request.json['username']: + try: + for container in docker_client.containers.list(filters={"id": container_id}): + return container.exec_run(["/bin/bash", "-c", "/usr/local/bin/doveadm sieve list -u '" + request.json['username'].replace("'", "'\\''") + "'"], user='vmail') + except Exception as e: + return jsonify(type='danger', msg=e) + elif request.json['cmd'] == 'sieve_print' and request.json['script_name'] and request.json['username']: + try: + for container in docker_client.containers.list(filters={"id": container_id}): + return container.exec_run(["/bin/bash", "-c", "/usr/local/bin/doveadm sieve get -u '" + request.json['username'].replace("'", "'\\''") + "' '" + request.json['script_name'].replace("'", "'\\''") + "'"], user='vmail') + except Exception as e: + return jsonify(type='danger', msg=e) else: - return 'OK' + return jsonify(type='danger', msg='Unknown command') + else: - return jsonify(message='Invalid action') + return jsonify(type='danger', msg='invalid action') + else: - return jsonify(message='Invalid container id or missing action') + return jsonify(type='danger', msg='invalid container id or missing action') class GracefulKiller: kill_now = False