git subrepo clone https://github.com/mailcow/mailcow-dockerized.git mailcow/src/mailcow-dockerized
subrepo: subdir: "mailcow/src/mailcow-dockerized"
merged: "a832becb"
upstream: origin: "https://github.com/mailcow/mailcow-dockerized.git"
branch: "master"
commit: "a832becb"
git-subrepo: version: "0.4.3"
origin: "???"
commit: "???"
Change-Id: If5be2d621a211e164c9b6577adaa7884449f16b5
diff --git a/mailcow/src/mailcow-dockerized/data/web/inc/functions.docker.inc.php b/mailcow/src/mailcow-dockerized/data/web/inc/functions.docker.inc.php
new file mode 100644
index 0000000..e47f5e2
--- /dev/null
+++ b/mailcow/src/mailcow-dockerized/data/web/inc/functions.docker.inc.php
@@ -0,0 +1,150 @@
+<?php
+function docker($action, $service_name = null, $attr1 = null, $attr2 = null, $extra_headers = null) {
+ global $DOCKER_TIMEOUT;
+ $curl = curl_init();
+ curl_setopt($curl, CURLOPT_HTTPHEADER,array('Content-Type: application/json' ));
+ // We are using our mail certificates for dockerapi, the names will not match, the certs are trusted anyway
+ curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
+ curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
+ switch($action) {
+ case 'get_id':
+ curl_setopt($curl, CURLOPT_URL, 'https://dockerapi:443/containers/json');
+ curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
+ curl_setopt($curl, CURLOPT_POST, 0);
+ curl_setopt($curl, CURLOPT_TIMEOUT, $DOCKER_TIMEOUT);
+ $response = curl_exec($curl);
+ if ($response === false) {
+ $err = curl_error($curl);
+ curl_close($curl);
+ return $err;
+ }
+ else {
+ curl_close($curl);
+ $containers = json_decode($response, true);
+ if (!empty($containers)) {
+ foreach ($containers as $container) {
+ if (isset($container['Config']['Labels']['com.docker.compose.service'])
+ && $container['Config']['Labels']['com.docker.compose.service'] == $service_name
+ && strtolower($container['Config']['Labels']['com.docker.compose.project']) == strtolower(getenv('COMPOSE_PROJECT_NAME'))) {
+ return trim($container['Id']);
+ }
+ }
+ }
+ }
+ return false;
+ case 'containers':
+ curl_setopt($curl, CURLOPT_URL, 'https://dockerapi:443/containers/json');
+ curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
+ curl_setopt($curl, CURLOPT_POST, 0);
+ curl_setopt($curl, CURLOPT_TIMEOUT, $DOCKER_TIMEOUT);
+ $response = curl_exec($curl);
+ if ($response === false) {
+ $err = curl_error($curl);
+ curl_close($curl);
+ return $err;
+ }
+ else {
+ curl_close($curl);
+ $containers = json_decode($response, true);
+ if (!empty($containers)) {
+ foreach ($containers as $container) {
+ if (strtolower($container['Config']['Labels']['com.docker.compose.project']) == strtolower(getenv('COMPOSE_PROJECT_NAME'))) {
+ $out[$container['Config']['Labels']['com.docker.compose.service']]['State'] = $container['State'];
+ $out[$container['Config']['Labels']['com.docker.compose.service']]['Config'] = $container['Config'];
+ }
+ }
+ }
+ return (!empty($out)) ? $out : false;
+ }
+ return false;
+ break;
+ case 'info':
+ if (empty($service_name)) {
+ curl_setopt($curl, CURLOPT_URL, 'https://dockerapi:443/containers/json');
+ curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
+ curl_setopt($curl, CURLOPT_POST, 0);
+ curl_setopt($curl, CURLOPT_TIMEOUT, $DOCKER_TIMEOUT);
+ }
+ else {
+ $container_id = docker('get_id', $service_name);
+ if (ctype_xdigit($container_id)) {
+ curl_setopt($curl, CURLOPT_URL, 'https://dockerapi:443/containers/' . $container_id . '/json');
+ }
+ else {
+ return false;
+ }
+ }
+ curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
+ curl_setopt($curl, CURLOPT_POST, 0);
+ curl_setopt($curl, CURLOPT_TIMEOUT, $DOCKER_TIMEOUT);
+ $response = curl_exec($curl);
+ if ($response === false) {
+ $err = curl_error($curl);
+ curl_close($curl);
+ return $err;
+ }
+ else {
+ curl_close($curl);
+ $decoded_response = json_decode($response, true);
+ if (!empty($decoded_response)) {
+ if (empty($service_name)) {
+ foreach ($decoded_response as $container) {
+ if (isset($container['Config']['Labels']['com.docker.compose.project'])
+ && strtolower($container['Config']['Labels']['com.docker.compose.project']) == strtolower(getenv('COMPOSE_PROJECT_NAME'))) {
+ unset($container['Config']['Env']);
+ $out[$container['Config']['Labels']['com.docker.compose.service']]['State'] = $container['State'];
+ $out[$container['Config']['Labels']['com.docker.compose.service']]['Config'] = $container['Config'];
+ }
+ }
+ }
+ else {
+ if (isset($decoded_response['Config']['Labels']['com.docker.compose.project'])
+ && strtolower($decoded_response['Config']['Labels']['com.docker.compose.project']) == strtolower(getenv('COMPOSE_PROJECT_NAME'))) {
+ unset($container['Config']['Env']);
+ $out[$decoded_response['Config']['Labels']['com.docker.compose.service']]['State'] = $decoded_response['State'];
+ $out[$decoded_response['Config']['Labels']['com.docker.compose.service']]['Config'] = $decoded_response['Config'];
+ }
+ }
+ }
+ if (empty($response)) {
+ return true;
+ }
+ else {
+ return (!empty($out)) ? $out : false;
+ }
+ }
+ break;
+ case 'post':
+ if (!empty($attr1)) {
+ $container_id = docker('get_id', $service_name);
+ if (ctype_xdigit($container_id) && ctype_alnum($attr1)) {
+ curl_setopt($curl, CURLOPT_URL, 'https://dockerapi:443/containers/' . $container_id . '/' . $attr1);
+ curl_setopt($curl, CURLOPT_POST, 1);
+ curl_setopt($curl, CURLOPT_TIMEOUT, $DOCKER_TIMEOUT);
+ if (!empty($attr2)) {
+ curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($attr2));
+ }
+ if (!empty($extra_headers) && is_array($extra_headers)) {
+ curl_setopt($curl, CURLOPT_HTTPHEADER, $extra_headers);
+ }
+ curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
+ $response = curl_exec($curl);
+ if ($response === false) {
+ $err = curl_error($curl);
+ curl_close($curl);
+ return $err;
+ }
+ else {
+ curl_close($curl);
+ if (empty($response)) {
+ return true;
+ }
+ else {
+ return $response;
+ }
+ }
+ }
+ }
+ break;
+ }
+}