浏览代码

[Dockerapi] Return answers in json

André 7 年之前
父节点
当前提交
a9f64a3472
共有 1 个文件被更改,包括 47 次插入19 次删除
  1. 47 19
      data/Dockerfiles/dockerapi/server.py

+ 47 - 19
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