authelia/internal/suites/docker.go
Philipp Staiger 01b77384f9
feat(duo): multi device selection (#2137)
Allow users to select and save the preferred duo device and method, depending on availability in the duo account. A default enrollment URL is provided and adjusted if returned by the duo API. This allows auto-enrollment if enabled by the administrator.

Closes #594. Closes #1039.
2021-12-01 14:32:58 +11:00

93 lines
2.7 KiB
Go

package suites
import (
"fmt"
"os"
"os/exec"
"strings"
log "github.com/sirupsen/logrus"
"github.com/authelia/authelia/v4/internal/utils"
)
// DockerEnvironment represent a docker environment.
type DockerEnvironment struct {
dockerComposeFiles []string
}
// NewDockerEnvironment create a new docker environment.
func NewDockerEnvironment(files []string) *DockerEnvironment {
if os.Getenv("CI") == t {
for i := range files {
files[i] = strings.ReplaceAll(files[i], "{}", "dist")
}
} else {
for i := range files {
files[i] = strings.ReplaceAll(files[i], "{}", "dev")
}
}
return &DockerEnvironment{dockerComposeFiles: files}
}
func (de *DockerEnvironment) createCommandWithStdout(cmd string) *exec.Cmd {
dockerCmdLine := fmt.Sprintf("docker-compose -p authelia -f %s %s", strings.Join(de.dockerComposeFiles, " -f "), cmd)
log.Trace(dockerCmdLine)
return utils.CommandWithStdout("bash", "-c", dockerCmdLine)
}
func (de *DockerEnvironment) createCommand(cmd string) *exec.Cmd {
dockerCmdLine := fmt.Sprintf("docker-compose -p authelia -f %s %s", strings.Join(de.dockerComposeFiles, " -f "), cmd)
log.Trace(dockerCmdLine)
return utils.Command("bash", "-c", dockerCmdLine)
}
// Pull pull all images of needed in the environment.
func (de *DockerEnvironment) Pull(images ...string) error {
return de.createCommandWithStdout(fmt.Sprintf("pull %s", strings.Join(images, " "))).Run()
}
// Up spawn a docker environment.
func (de *DockerEnvironment) Up() error {
return de.createCommandWithStdout("up --build -d").Run()
}
// Restart restarts a service.
func (de *DockerEnvironment) Restart(service string) error {
return de.createCommandWithStdout(fmt.Sprintf("restart %s", service)).Run()
}
// Stop a docker service.
func (de *DockerEnvironment) Stop(service string) error {
return de.createCommandWithStdout(fmt.Sprintf("stop %s", service)).Run()
}
// Start a docker service.
func (de *DockerEnvironment) Start(service string) error {
return de.createCommandWithStdout(fmt.Sprintf("start %s", service)).Run()
}
// Down destroy a docker environment.
func (de *DockerEnvironment) Down() error {
return de.createCommandWithStdout("down -v").Run()
}
// Exec execute a command within a given service of the environment.
func (de *DockerEnvironment) Exec(service string, command []string) (string, error) {
cmd := de.createCommand(fmt.Sprintf("exec -T %s %s", service, strings.Join(command, " ")))
content, err := cmd.CombinedOutput()
return string(content), err
}
// Logs get logs of a given service of the environment.
func (de *DockerEnvironment) Logs(service string, flags []string) (string, error) {
cmd := de.createCommand(fmt.Sprintf("logs %s %s", strings.Join(flags, " "), service))
content, err := cmd.Output()
return string(content), err
}