diff --git a/setup/start/sudoers b/setup/start/sudoers index 3f251747d..46f791365 100644 --- a/setup/start/sudoers +++ b/setup/start/sudoers @@ -37,3 +37,5 @@ yellowtent ALL=(root) NOPASSWD:SETENV: /home/yellowtent/box/src/backupupload.js Defaults!/home/yellowtent/box/src/scripts/restart.sh env_keep="HOME BOX_ENV" yellowtent ALL=(root) NOPASSWD: /home/yellowtent/box/src/scripts/restart.sh +Defaults!/home/yellowtent/box/src/scripts/restartdocker.sh env_keep="HOME BOX_ENV" +yellowtent ALL=(root) NOPASSWD: /home/yellowtent/box/src/scripts/restartdocker.sh diff --git a/src/addons.js b/src/addons.js index a7664b253..d1e4785f5 100644 --- a/src/addons.js +++ b/src/addons.js @@ -210,7 +210,7 @@ var KNOWN_ADDONS = { restore: NOOP, clear: NOOP, status: statusDocker, - restart: null + restart: restartDocker } }; @@ -1685,3 +1685,11 @@ function statusDocker(callback) { callback(null, { status: error ? exports.ADDON_STATUS_STOPPED: exports.ADDON_STATUS_ACTIVE }); }); } + +function restartDocker(callback) { + assert.strictEqual(typeof callback, 'function'); + + shell.sudo('restartdocker', [ path.join(__dirname, 'scripts/restartdocker.sh') ], NOOP_CALLBACK); + + callback(null); +} \ No newline at end of file diff --git a/src/docker.js b/src/docker.js index d628dd551..38541929c 100644 --- a/src/docker.js +++ b/src/docker.js @@ -28,18 +28,19 @@ exports = module.exports = { clearVolume: clearVolume }; -function connectionInstance() { +// timeout is optional +function connectionInstance(timeout) { var Docker = require('dockerode'); var docker; if (process.env.BOX_ENV === 'test') { // test code runs a docker proxy on this port - docker = new Docker({ host: 'http://localhost', port: 5687 }); + docker = new Docker({ host: 'http://localhost', port: 5687, timeout: timeout }); // proxy code uses this to route to the real docker docker.options = { socketPath: '/var/run/docker.sock' }; } else { - docker = new Docker({ socketPath: '/var/run/docker.sock' }); + docker = new Docker({ socketPath: '/var/run/docker.sock', timeout: timeout }); } return docker; @@ -112,7 +113,8 @@ function setRegistryConfig(auth, callback) { function ping(callback) { assert.strictEqual(typeof callback, 'function'); - var docker = exports.connection; + // do not let the request linger + var docker = connectionInstance(1000); docker.ping(function (error, result) { if (error) return callback(new DockerError(DockerError.INTERNAL_ERROR, error)); diff --git a/src/scripts/restartdocker.sh b/src/scripts/restartdocker.sh new file mode 100755 index 000000000..951e88d91 --- /dev/null +++ b/src/scripts/restartdocker.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +set -eu -o pipefail + +if [[ ${EUID} -ne 0 ]]; then + echo "This script should be run as root." > /dev/stderr + exit 1 +fi + +if [[ $# == 1 && "$1" == "--check" ]]; then + echo "OK" + exit 0 +fi + +if [[ "${BOX_ENV}" == "cloudron" ]]; then + systemctl restart docker +fi + diff --git a/src/test/checkInstall b/src/test/checkInstall index 2f85b25b9..ac7a77d98 100755 --- a/src/test/checkInstall +++ b/src/test/checkInstall @@ -13,6 +13,8 @@ scripts=("${SOURCE_DIR}/src/scripts/rmvolume.sh" \ "${SOURCE_DIR}/src/scripts/rmaddon.sh" \ "${SOURCE_DIR}/src/scripts/reloadnginx.sh" \ "${SOURCE_DIR}/src/scripts/reboot.sh" \ + "${SOURCE_DIR}/src/scripts/restart.sh" \ + "${SOURCE_DIR}/src/scripts/restartdocker.sh" \ "${SOURCE_DIR}/src/scripts/update.sh" \ "${SOURCE_DIR}/src/scripts/collectlogs.sh" \ "${SOURCE_DIR}/src/scripts/configurecollectd.sh" \