(.+?)#','',html_entity_decode($text)); } function safe($text) { return preg_replace('/[!@#$%^&\*\(\)\[\]{}"\|\?<>\/;]+/','',unscript($text)); } $DockerClient = new DockerClient(); $action = unscript($_REQUEST['action'] ?? ''); $container = unscript($_REQUEST['container'] ?? ''); $name = unscript($_REQUEST['name'] ?? ''); $image = unscript($_REQUEST['image'] ?? ''); $arrResponse = ['error' => _('Missing parameters')]; switch ($action) { case 'start': if ($container) $arrResponse = ['success' => $DockerClient->startContainer($container)]; break; case 'pause': if ($container) $arrResponse = ['success' => $DockerClient->pauseContainer($container)]; break; case 'stop': if ($container) $arrResponse = ['success' => $DockerClient->stopContainer($container)]; break; case 'resume': if ($container) $arrResponse = ['success' => $DockerClient->resumeContainer($container)]; break; case 'restart': if ($container) $arrResponse = ['success' => $DockerClient->restartContainer($container)]; break; case 'remove_container': if ($container) $arrResponse = ['success' => $DockerClient->removeContainer($name, $container, 1)]; break; case 'remove_image': if ($image) $arrResponse = ['success' => $DockerClient->removeImage($image)]; break; case 'remove_all': if ($container && $image) { // first: try to remove container $ret = $DockerClient->removeContainer($name, $container, 2); if ($ret === true) { // next: try to remove image $arrResponse = ['success' => $DockerClient->removeImage($image)]; } else { // error: container failed to remove $arrResponse = ['success' => $ret]; } } break; case 'log': if ($container) { $since = safe($_REQUEST['since'] ?? ''); $title = safe($_REQUEST['title'] ?? ''); require_once "$docroot/webGui/include/ColorCoding.php"; if (!$since) { readfile("$docroot/plugins/dynamix.docker.manager/log.htm"); echo ""; echo ""; $tail = 350; } else { $tail = null; } $echo = function($s) use ($match) { $line = substr(trim($s), 8); $span = "span"; foreach ($match as $type) { foreach ($type['text'] as $text) { if (preg_match("/$text/i",$line)) { $span = "span class='{$type['class']}'"; break 2; } } } echo ""; @flush(); }; $DockerClient->getContainerLog($container, $echo, $tail, $since); echo ''; @flush(); exit; } break; case 'terminal': $shell = $_REQUEST['shell'] ?: 'sh'; $pid = exec("pgrep -a ttyd|awk '/\\/$name\\.sock/{print \$1}'"); if ($pid) exec("kill $pid"); @unlink("/var/tmp/$name.sock"); exec("ttyd-exec -o -i '/var/tmp/$name.sock' docker exec -it '$name' $shell"); break; default: $arrResponse = ['error' => _('Unknown action')." '$action'"]; break; } header('Content-Type: application/json'); die(json_encode($arrResponse));