2
0
Эх сурвалжийг харах

[Web, DockerAPI] Be more like official Docker API

andryyy 8 жил өмнө
parent
commit
3ae0b16845

+ 38 - 25
data/Dockerfiles/dockerapi/server.py

@@ -1,41 +1,54 @@
 from flask import Flask
 from flask_restful import Resource, Api
-from docker import APIClient
+from flask import jsonify
+import docker
 
-dockercli = APIClient(base_url='unix://var/run/docker.sock')
+docker_client = docker.DockerClient(base_url='unix://var/run/docker.sock')
 app = Flask(__name__)
 api = Api(app)
 
-class Containers(Resource):
+class containers_get(Resource):
     def get(self):
-        return dockercli.containers(all=True)
+        containers = {}
+        for container in docker_client.containers.list(all=True):
+            containers.update({container.attrs['Id']: container.attrs})
+        return containers
 
-class ContainerInfo(Resource):
+class container_get(Resource):
     def get(self, container_id):
-        return dockercli.containers(all=True, filters={"id": container_id})
-
-class ContainerStart(Resource):
-    def post(self, container_id):
-        try:
-            dockercli.start(container_id);
-        except:
-            return 'Error'
+        if container_id and container_id.isalnum():
+            for container in docker_client.containers.list(all=True, filters={"id": container_id}):
+                return container.attrs            
         else:
-            return 'OK'
+		    return jsonify(message='No or invalid id defined')
 
-class ContainerStop(Resource):
-    def post(self, container_id):
-        try:
-            dockercli.stop(container_id);
-        except: 
-            return 'Error'
+class container_post(Resource):
+    def post(self, container_id, post_action):
+        if container_id and container_id.isalnum() and post_action:
+            if post_action == 'stop':
+                try:
+                    for container in docker_client.containers.list(all=True, filters={"id": container_id}):
+                        container.stop()
+                except:
+                    return 'Error'
+                else:
+                    return 'OK'
+            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'
+            else:
+                return jsonify(message='Invalid action')
         else:
-            return 'OK'
+            return jsonify(message='Invalid container id or missing action')
 
-api.add_resource(Containers, '/info/container/all')
-api.add_resource(ContainerInfo, '/info/container/<string:container_id>')
-api.add_resource(ContainerStop, '/stop/container/<string:container_id>')
-api.add_resource(ContainerStart, '/start/container/<string:container_id>')
+api.add_resource(containers_get, '/containers/json')
+api.add_resource(container_get, '/containers/<string:container_id>/json')
+api.add_resource(container_post, '/containers/<string:container_id>/<string:post_action>')
 
 if __name__ == '__main__':
     app.run(debug=False, host='0.0.0.0', port='8080')

+ 7 - 7
data/web/inc/call_sogo_ctrl.php

@@ -11,7 +11,7 @@ function docker($service_name, $action, $post_action = null, $post_fields = null
   curl_setopt($curl, CURLOPT_HTTPHEADER,array( 'Content-Type: application/json' ));
   switch($action) {
     case 'get_id':
-      curl_setopt($curl, CURLOPT_URL, 'http://dockerapi:8080/info/container/all');
+      curl_setopt($curl, CURLOPT_URL, 'http://dockerapi:8080/containers/json');
       curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
       curl_setopt($curl, CURLOPT_POST, 0);
       $response = curl_exec($curl);
@@ -25,7 +25,7 @@ function docker($service_name, $action, $post_action = null, $post_fields = null
         $containers = json_decode($response, true);
         if (!empty($containers)) {
           foreach ($containers as $container) {
-            if ($container['Labels']['com.docker.compose.service'] == $service_name) {
+            if ($container['Config']['Labels']['com.docker.compose.service'] == $service_name) {
               return trim($container['Id']);
             }
           }
@@ -36,7 +36,7 @@ function docker($service_name, $action, $post_action = null, $post_fields = null
     case 'info':
       $container_id = docker($service_name, 'get_id');
       if (ctype_xdigit($container_id)) {
-        curl_setopt($curl, CURLOPT_URL, 'http://dockerapi:8080/info/container/' . $container_id);
+        curl_setopt($curl, CURLOPT_URL, 'http://dockerapi:8080/containers/' . $container_id . '/json');
         curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
         curl_setopt($curl, CURLOPT_POST, 0);
         $response = curl_exec($curl);
@@ -63,7 +63,7 @@ function docker($service_name, $action, $post_action = null, $post_fields = null
       if (!empty($post_action)) {
         $container_id = docker($service_name, 'get_id');
         if (ctype_xdigit($container_id) && ctype_alnum($post_action)) {
-          curl_setopt($curl, CURLOPT_URL, 'http://dockerapi:8080/' . $post_action . '/container/' . $container_id);
+          curl_setopt($curl, CURLOPT_URL, 'http://dockerapi:8080/containers/' . $container_id . '/' . $post_action);
           curl_setopt($curl, CURLOPT_POST, 1);
           if (!empty($post_fields)) {
             curl_setopt( $curl, CURLOPT_POSTFIELDS, json_encode($post_fields));
@@ -92,7 +92,7 @@ function docker($service_name, $action, $post_action = null, $post_fields = null
 
 if ($_GET['ACTION'] == "start") {
   $retry = 0;
-  while (docker('sogo-mailcow', 'info')[0]['State'] != "running" && $retry <= 3) {
+  while (docker('sogo-mailcow', 'info')['State']['Running'] != 1 && $retry <= 3) {
     $response = docker('sogo-mailcow', 'post', 'start');
     $last_response = (trim($response) == "\"OK\"") ? '<b><span class="pull-right text-success">OK</span></b>' : '<b><span class="pull-right text-danger">Error: ' . $response . '</span></b>';
     if (trim($response) == "\"OK\"") {
@@ -101,12 +101,12 @@ if ($_GET['ACTION'] == "start") {
     usleep(1500000);
     $retry++;
   }
-  echo (!isset($last_response)) ? '<b><span class="pull-right text-warning">Not running</span></b>' : $last_response;
+  echo (!isset($last_response)) ? '<b><span class="pull-right text-warning">Already running</span></b>' : $last_response;
 }
 
 if ($_GET['ACTION'] == "stop") {
   $retry = 0;
-  while (docker('sogo-mailcow', 'info')[0]['State'] == "running" && $retry <= 3) {
+  while (docker('sogo-mailcow', 'info')['State']['Running'] == 1 && $retry <= 3) {
     $response = docker('sogo-mailcow', 'post', 'stop');
     $last_response = (trim($response) == "\"OK\"") ? '<b><span class="pull-right text-success">OK</span></b>' : '<b><span class="pull-right text-danger">Error: ' . $response . '</span></b>';
     if (trim($response) == "\"OK\"") {