From 435dc8287361999cdf510fc137527e7c4bfb0c60 Mon Sep 17 00:00:00 2001 From: Julien Duponchelle Date: Wed, 1 Jun 2016 18:16:56 +0200 Subject: [PATCH] Save an restore docker permission Fix #550 --- gns3server/modules/docker/docker_vm.py | 2 +- gns3server/modules/docker/resources/init.sh | 15 +++++++++++++++ tests/modules/docker/test_docker_vm.py | 2 +- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/gns3server/modules/docker/docker_vm.py b/gns3server/modules/docker/docker_vm.py index b02a09d8..690c4d6d 100644 --- a/gns3server/modules/docker/docker_vm.py +++ b/gns3server/modules/docker/docker_vm.py @@ -402,7 +402,7 @@ class DockerVM(BaseVM): "/gns3/bin/busybox", "sh", "-c", - "chmod -R u+rX {path} && chown {uid}:{gid} -R {path}".format(uid=os.getuid(), gid=os.getgid(), path=volume)) + "(/gns3/bin/busybox find \"{path}\" -depth -print0 | xargs -0 stat -c '%a:%u:%g:%n' > \"{path}/.gns3_perms\") && /gns3/bin/busybox chmod -R u+rX \"{path}\" && /gns3/bin/busybox chown {uid}:{gid} -R \"{path}\"".format(uid=os.getuid(), gid=os.getgid(), path=volume)) yield from process.wait() @asyncio.coroutine diff --git a/gns3server/modules/docker/resources/init.sh b/gns3server/modules/docker/resources/init.sh index 6f2b67a5..22dad057 100755 --- a/gns3server/modules/docker/resources/init.sh +++ b/gns3server/modules/docker/resources/init.sh @@ -28,6 +28,21 @@ if [ ! -d /tmp/gns3/bin ]; then /gns3/bin/busybox --install -s /tmp/gns3/bin fi +# Restore file permission +for i in $(echo "$GNS3_VOLUMES" | tr ":" "\n") +do + cd $i + if [ -f .gns3_perms ] + then + while IFS=: read PERMS OWNER GROUP FILE + do + chmod "$PERMS" "$FILE" + chown "${OWNER}:${GROUP}" "$FILE" + done < .gns3_perms + fi +done + + # /etc/hosts [ -s /etc/hosts ] || cat > /etc/hosts << __EOF__ 127.0.1.1 $HOSTNAME diff --git a/tests/modules/docker/test_docker_vm.py b/tests/modules/docker/test_docker_vm.py index 33e3f311..af0891e3 100644 --- a/tests/modules/docker/test_docker_vm.py +++ b/tests/modules/docker/test_docker_vm.py @@ -926,5 +926,5 @@ def test_fix_permission(vm, loop): process = MagicMock() with asyncio_patch("asyncio.subprocess.create_subprocess_exec", return_value=process) as mock_exec: loop.run_until_complete(vm._fix_permissions()) - mock_exec.assert_called_with('docker', 'exec', 'e90e34656842', '/gns3/bin/busybox', 'sh', '-c', 'chmod -R u+rX /etc && chown {}:{} -R /etc'.format(os.getuid(), os.getgid())) + mock_exec.assert_called_with('docker', 'exec', 'e90e34656842', '/gns3/bin/busybox', 'sh', '-c', '(/gns3/bin/busybox find "/etc" -depth -print0 | xargs -0 stat -c \'%a:%u:%g:%n\' > "/etc/.gns3_perms") && /gns3/bin/busybox chmod -R u+rX "/etc" && /gns3/bin/busybox chown {}:{} -R "/etc"'.format(os.getuid(), os.getgid())) assert process.wait.called