From 3ae0b16845fb63d277d79456975f78edb538350b Mon Sep 17 00:00:00 2001 From: andryyy Date: Fri, 6 Oct 2017 10:20:40 +0200 Subject: [PATCH] [Web, DockerAPI] Be more like official Docker API --- data/Dockerfiles/dockerapi/server.py | 63 +++++++++++++++++----------- data/web/inc/call_sogo_ctrl.php | 14 +++---- 2 files changed, 45 insertions(+), 32 deletions(-) diff --git a/data/Dockerfiles/dockerapi/server.py b/data/Dockerfiles/dockerapi/server.py index b4f7d287..22eb8508 100644 --- a/data/Dockerfiles/dockerapi/server.py +++ b/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/') -api.add_resource(ContainerStop, '/stop/container/') -api.add_resource(ContainerStart, '/start/container/') +api.add_resource(containers_get, '/containers/json') +api.add_resource(container_get, '/containers//json') +api.add_resource(container_post, '/containers//') if __name__ == '__main__': app.run(debug=False, host='0.0.0.0', port='8080') diff --git a/data/web/inc/call_sogo_ctrl.php b/data/web/inc/call_sogo_ctrl.php index 88f50419..c54a0a5a 100644 --- a/data/web/inc/call_sogo_ctrl.php +++ b/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\"") ? 'OK' : 'Error: ' . $response . ''; if (trim($response) == "\"OK\"") { @@ -101,12 +101,12 @@ if ($_GET['ACTION'] == "start") { usleep(1500000); $retry++; } - echo (!isset($last_response)) ? 'Not running' : $last_response; + echo (!isset($last_response)) ? 'Already running' : $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\"") ? 'OK' : 'Error: ' . $response . ''; if (trim($response) == "\"OK\"") {