diff --git a/drivers/azure/azure.go b/drivers/azure/azure.go index 5895cc4f56..b2bbf37d24 100644 --- a/drivers/azure/azure.go +++ b/drivers/azure/azure.go @@ -224,6 +224,87 @@ func (driver *Driver) Create() error { return err } + if err:= driver.hackForIdentityAuth(); err != nil { + return err + } + + return nil +} + +func (driver *Driver) hackForIdentityAuth() error { + + log.Debugf("HACK: Downloading version of Docker with identity auth...") + + numberOfRetries := 3 + if err:= driver.runSSHCommand("sudo stop docker", numberOfRetries); err != nil { + return err + } + + if err:= driver.runSSHCommand("sudo bash -c \"curl -sS https://bfirsh.s3.amazonaws.com/docker/docker-1.3.1-dev-identity-auth > /usr/bin/docker\"", numberOfRetries); err != nil { + return err + } + + log.Debugf("Updating /etc/default/docker to use identity auth...") + + cmdString := fmt.Sprintf(`sudo bash -c 'cat < /etc/default/docker +export DOCKER_OPTS="--auth=identity --host=tcp://0.0.0.0:%v" +EOF'`, driver.DockerPort) + if err:= driver.runSSHCommand(cmdString, numberOfRetries); err != nil { + return err + } + + log.Debugf("Adding key to authorized-keys.d...") + + if err := driver.addPublicKeyToAuthorizedHosts("/tmp/.docker/authorized-keys.d", numberOfRetries); err != nil { + return err + } + + if err:= driver.runSSHCommand("sudo cp -a /tmp/.docker/ /", numberOfRetries); err != nil { + return err + } + + if err:= driver.runSSHCommand("rm -r /tmp/.docker/", numberOfRetries); err != nil { + return err + } + + if err:= driver.runSSHCommand("sudo start docker", numberOfRetries); err != nil { + return err + } + + return nil +} + +func (driver *Driver) addPublicKeyToAuthorizedHosts(authorizedKeysPath string, retries int) error { + if err := drivers.AddPublicKeyToAuthorizedHosts(driver, authorizedKeysPath ); err != nil { + if err.Error() == "exit status 255" { + if retries == 0 { + return err + } + return driver.addPublicKeyToAuthorizedHosts(authorizedKeysPath, retries -1) + } + + return err + } + + return nil +} + +func (driver *Driver) runSSHCommand(command string, retries int) error { + cmd, err := driver.GetSSHCommand(command) + if err != nil { + return err + } + if err := cmd.Run(); err != nil { + if err.Error() == "exit status 255" { + if retries == 0 { + return err + } + return driver.runSSHCommand(command, retries -1) + } + + return err + } + return nil }