diff --git a/build/ctl.sh b/build/ctl.sh new file mode 100755 index 0000000..b518993 --- /dev/null +++ b/build/ctl.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +set -e + +CURRENT_DIR="$(pwd)" +SRC_DIR="$CURRENT_DIR/src" + +cd "$SRC_DIR" + +SOURCE="cmd/ctl/main.go" +OUTPUT="linuxusctl" + +go build -o "$CURRENT_DIR/$OUTPUT" "$SOURCE" + +cd "$CURRENT_DIR" \ No newline at end of file diff --git a/ctl/linuxus-completion.bash b/build/linuxus-completion.bash similarity index 100% rename from ctl/linuxus-completion.bash rename to build/linuxus-completion.bash diff --git a/cfg/config.yml b/cfg/config.yml index b2c898b..87b3922 100644 --- a/cfg/config.yml +++ b/cfg/config.yml @@ -1,5 +1,4 @@ user_service: - source_dir: src/service container: name_prefix: linuxus_user_ network_name_prefix: linuxus_user_net_ @@ -35,7 +34,6 @@ user_service: # session_timeout: 3600 auth_service: - source_dir: src/auth container: name: linuxus_auth external_port: 8080 @@ -56,7 +54,6 @@ auth_service: allow_signup: true manager_service: - source_dir: src/manager container: name: linuxus_manager network: linuxus_manager_net diff --git a/ctl/build.sh b/ctl/build.sh deleted file mode 100755 index 07d9f8f..0000000 --- a/ctl/build.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -set -e - -CURRENT_DIR=$(pwd) -SOURCE_DIR=$(dirname "$(realpath "$0")") - -SOURCE="cmd/main.go" -OUTPUT="linuxusctl" - -cd "$SOURCE_DIR" - -go build -o "../$OUTPUT" "$SOURCE" - -cd "$CURRENT_DIR" \ No newline at end of file diff --git a/ctl/go.mod b/ctl/go.mod deleted file mode 100644 index bd375fc..0000000 --- a/ctl/go.mod +++ /dev/null @@ -1,43 +0,0 @@ -module github.com/elecbug/linuxus/ctl - -go 1.26.1 - -require ( - github.com/containerd/errdefs v1.0.0 - github.com/docker/docker v28.5.2+incompatible - github.com/docker/go-connections v0.7.0 - golang.org/x/crypto v0.50.0 - golang.org/x/term v0.42.0 - gopkg.in/yaml.v3 v3.0.1 -) - -replace github.com/elecbug/linuxus/pkg/system_api => ../pkg/system_api - -require ( - github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect - github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/containerd/errdefs/pkg v0.3.0 // indirect - github.com/containerd/log v0.1.0 // indirect - github.com/distribution/reference v0.6.0 // indirect - github.com/docker/go-units v0.5.0 // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/go-logr/logr v1.4.3 // indirect - github.com/go-logr/stdr v1.2.2 // indirect - github.com/moby/docker-image-spec v1.3.1 // indirect - github.com/moby/sys/atomicwriter v0.1.0 // indirect - github.com/moby/term v0.5.2 // indirect - github.com/morikuni/aec v1.1.0 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.1.1 // indirect - github.com/pkg/errors v0.9.1 // indirect - go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 // indirect - go.opentelemetry.io/otel v1.43.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0 // indirect - go.opentelemetry.io/otel/metric v1.43.0 // indirect - go.opentelemetry.io/otel/trace v1.43.0 // indirect - golang.org/x/sys v0.43.0 // indirect - golang.org/x/time v0.15.0 // indirect - gotest.tools/v3 v3.5.2 // indirect -) diff --git a/doc/USAGE.md b/doc/USAGE.md index 7f1bee0..94867bf 100644 --- a/doc/USAGE.md +++ b/doc/USAGE.md @@ -30,7 +30,7 @@ sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin d Build the control CLI: ```bash -./ctl/build.sh +./build/ctl.sh ``` Generated executable: diff --git a/src/auth/go.mod b/src/auth/go.mod deleted file mode 100644 index 5892e1e..0000000 --- a/src/auth/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/elecbug/linuxus/src/auth - -go 1.26.1 - -require golang.org/x/crypto v0.50.0 diff --git a/src/auth/go.sum b/src/auth/go.sum deleted file mode 100644 index 2524922..0000000 --- a/src/auth/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= -golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= -golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= -golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= diff --git a/src/auth/cmd/main.go b/src/cmd/auth/main.go similarity index 97% rename from src/auth/cmd/main.go rename to src/cmd/auth/main.go index 10214e9..aae3292 100644 --- a/src/auth/cmd/main.go +++ b/src/cmd/auth/main.go @@ -7,8 +7,8 @@ import ( "strings" "time" - "github.com/elecbug/linuxus/src/auth/internal/handler" - "github.com/elecbug/linuxus/src/auth/internal/user" + "github.com/elecbug/linuxus/src/internal/auth/handler" + "github.com/elecbug/linuxus/src/internal/auth/user" ) // main loads configuration, registers routes, and starts the auth server. diff --git a/ctl/cmd/main.go b/src/cmd/ctl/main.go similarity index 96% rename from ctl/cmd/main.go rename to src/cmd/ctl/main.go index c5b6335..3b29260 100644 --- a/ctl/cmd/main.go +++ b/src/cmd/ctl/main.go @@ -6,10 +6,10 @@ import ( "os" "path/filepath" - "github.com/elecbug/linuxus/ctl/internal/app" - "github.com/elecbug/linuxus/ctl/internal/cli" - "github.com/elecbug/linuxus/ctl/internal/config" - "github.com/elecbug/linuxus/ctl/internal/format" + "github.com/elecbug/linuxus/src/internal/ctl/app" + "github.com/elecbug/linuxus/src/internal/ctl/cli" + "github.com/elecbug/linuxus/src/internal/ctl/config" + "github.com/elecbug/linuxus/src/internal/ctl/format" ) // main executes the CLI entrypoint and prints user-friendly errors. diff --git a/src/manager/cmd/main.go b/src/cmd/manager/main.go similarity index 98% rename from src/manager/cmd/main.go rename to src/cmd/manager/main.go index 7eafdd2..cc2ef22 100644 --- a/src/manager/cmd/main.go +++ b/src/cmd/manager/main.go @@ -7,8 +7,8 @@ import ( "strconv" "time" - "github.com/elecbug/linuxus/src/manager/internal/config" - "github.com/elecbug/linuxus/src/manager/internal/handler" + "github.com/elecbug/linuxus/src/internal/manager/config" + "github.com/elecbug/linuxus/src/internal/manager/handler" ) // main loads environment configuration and starts the manager server. diff --git a/src/auth/Dockerfile b/src/docker/auth.Dockerfile similarity index 96% rename from src/auth/Dockerfile rename to src/docker/auth.Dockerfile index 89806d8..141fe6e 100644 --- a/src/auth/Dockerfile +++ b/src/docker/auth.Dockerfile @@ -8,7 +8,7 @@ RUN go mod download COPY cmd ./cmd COPY internal ./internal -RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o auth-server cmd/main.go +RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o auth-server cmd/auth/main.go FROM debian:bookworm-slim diff --git a/src/manager/Dockerfile b/src/docker/manager.Dockerfile similarity index 92% rename from src/manager/Dockerfile rename to src/docker/manager.Dockerfile index 61ee9ba..2dbd83d 100644 --- a/src/manager/Dockerfile +++ b/src/docker/manager.Dockerfile @@ -10,7 +10,7 @@ RUN go mod download COPY cmd ./cmd COPY internal ./internal -RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o linuxus-manager cmd/main.go +RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o linuxus-manager cmd/manager/main.go FROM ubuntu:22.04 diff --git a/src/service/start.sh b/src/docker/start.sh similarity index 100% rename from src/service/start.sh rename to src/docker/start.sh diff --git a/src/service/Dockerfile b/src/docker/user.Dockerfile similarity index 96% rename from src/service/Dockerfile rename to src/docker/user.Dockerfile index 3b9ecfb..5fdbdb7 100644 --- a/src/service/Dockerfile +++ b/src/docker/user.Dockerfile @@ -22,7 +22,7 @@ RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # Create a fixed runtime user at build time RUN groupadd -g 1000 $CONTAINER_RUNTIME_USER && useradd -m -u 1000 -g 1000 -s /bin/bash $CONTAINER_RUNTIME_USER -COPY start.sh /start.sh +COPY docker/start.sh /start.sh RUN chmod +x /start.sh CMD ["/start.sh"] \ No newline at end of file diff --git a/src/manager/go.mod b/src/go.mod similarity index 89% rename from src/manager/go.mod rename to src/go.mod index 4f1b568..d2872c8 100644 --- a/src/manager/go.mod +++ b/src/go.mod @@ -1,10 +1,14 @@ -module github.com/elecbug/linuxus/src/manager +module github.com/elecbug/linuxus/src go 1.26.1 require ( github.com/containerd/errdefs v1.0.0 github.com/docker/docker v28.5.2+incompatible + github.com/docker/go-connections v0.7.0 + golang.org/x/crypto v0.50.0 + golang.org/x/term v0.42.0 + gopkg.in/yaml.v3 v3.0.1 ) require ( @@ -13,7 +17,6 @@ require ( github.com/containerd/errdefs/pkg v0.3.0 // indirect github.com/containerd/log v0.1.0 // indirect github.com/distribution/reference v0.6.0 // indirect - github.com/docker/go-connections v0.7.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-logr/logr v1.4.3 // indirect diff --git a/ctl/go.sum b/src/go.sum similarity index 97% rename from ctl/go.sum rename to src/go.sum index 0828207..62ec2fd 100644 --- a/ctl/go.sum +++ b/src/go.sum @@ -12,8 +12,6 @@ github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151X github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= -github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= @@ -89,7 +87,6 @@ golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.42.0 h1:UiKe+zDFmJobeJ5ggPwOshJIVt6/Ft0rcfrXZDLWAWY= diff --git a/src/auth/internal/handler/app.go b/src/internal/auth/handler/app.go similarity index 99% rename from src/auth/internal/handler/app.go rename to src/internal/auth/handler/app.go index 4962f1d..9663f6b 100644 --- a/src/auth/internal/handler/app.go +++ b/src/internal/auth/handler/app.go @@ -13,7 +13,7 @@ import ( "sync" "time" - "github.com/elecbug/linuxus/src/auth/internal/page" + "github.com/elecbug/linuxus/src/internal/auth/page" ) // App holds auth server state, templates, and manager integration clients. diff --git a/src/auth/internal/handler/app_test.go b/src/internal/auth/handler/app_test.go similarity index 100% rename from src/auth/internal/handler/app_test.go rename to src/internal/auth/handler/app_test.go diff --git a/src/auth/internal/handler/handle_login.go b/src/internal/auth/handler/handle_login.go similarity index 99% rename from src/auth/internal/handler/handle_login.go rename to src/internal/auth/handler/handle_login.go index a4cbb72..1e52b23 100644 --- a/src/auth/internal/handler/handle_login.go +++ b/src/internal/auth/handler/handle_login.go @@ -11,7 +11,7 @@ import ( "strings" "time" - "github.com/elecbug/linuxus/src/auth/internal/user" + "github.com/elecbug/linuxus/src/internal/auth/user" "golang.org/x/crypto/bcrypt" ) diff --git a/src/auth/internal/handler/handle_login_test.go b/src/internal/auth/handler/handle_login_test.go similarity index 100% rename from src/auth/internal/handler/handle_login_test.go rename to src/internal/auth/handler/handle_login_test.go diff --git a/src/auth/internal/handler/handle_logout.go b/src/internal/auth/handler/handle_logout.go similarity index 100% rename from src/auth/internal/handler/handle_logout.go rename to src/internal/auth/handler/handle_logout.go diff --git a/src/auth/internal/handler/handle_root.go b/src/internal/auth/handler/handle_root.go similarity index 100% rename from src/auth/internal/handler/handle_root.go rename to src/internal/auth/handler/handle_root.go diff --git a/src/auth/internal/handler/handle_service.go b/src/internal/auth/handler/handle_service.go similarity index 100% rename from src/auth/internal/handler/handle_service.go rename to src/internal/auth/handler/handle_service.go diff --git a/src/auth/internal/handler/handle_signup.go b/src/internal/auth/handler/handle_signup.go similarity index 96% rename from src/auth/internal/handler/handle_signup.go rename to src/internal/auth/handler/handle_signup.go index 056d4e7..4d53447 100644 --- a/src/auth/internal/handler/handle_signup.go +++ b/src/internal/auth/handler/handle_signup.go @@ -5,8 +5,8 @@ import ( "net/http" "strings" - "github.com/elecbug/linuxus/src/auth/internal/page" - "github.com/elecbug/linuxus/src/auth/internal/user" + "github.com/elecbug/linuxus/src/internal/auth/page" + "github.com/elecbug/linuxus/src/internal/auth/user" ) // handleSignup processes GET and POST requests to the signup endpoint for user registration. diff --git a/src/auth/internal/handler/handle_terminal.go b/src/internal/auth/handler/handle_terminal.go similarity index 100% rename from src/auth/internal/handler/handle_terminal.go rename to src/internal/auth/handler/handle_terminal.go diff --git a/src/auth/internal/handler/manager_client.go b/src/internal/auth/handler/manager_client.go similarity index 98% rename from src/auth/internal/handler/manager_client.go rename to src/internal/auth/handler/manager_client.go index f18ef31..d41c12c 100644 --- a/src/auth/internal/handler/manager_client.go +++ b/src/internal/auth/handler/manager_client.go @@ -10,7 +10,7 @@ import ( "strings" "time" - "github.com/elecbug/linuxus/src/auth/internal/packet" + "github.com/elecbug/linuxus/src/internal/auth/packet" ) // ensureUserContainerReady asks the manager service to ensure a user runtime is ready. diff --git a/src/auth/internal/html/attribute.go b/src/internal/auth/html/attribute.go similarity index 100% rename from src/auth/internal/html/attribute.go rename to src/internal/auth/html/attribute.go diff --git a/src/auth/internal/html/css.go b/src/internal/auth/html/css.go similarity index 100% rename from src/auth/internal/html/css.go rename to src/internal/auth/html/css.go diff --git a/src/auth/internal/html/css_content.go b/src/internal/auth/html/css_content.go similarity index 100% rename from src/auth/internal/html/css_content.go rename to src/internal/auth/html/css_content.go diff --git a/src/auth/internal/html/html.go b/src/internal/auth/html/html.go similarity index 100% rename from src/auth/internal/html/html.go rename to src/internal/auth/html/html.go diff --git a/src/auth/internal/html/html_page.go b/src/internal/auth/html/html_page.go similarity index 100% rename from src/auth/internal/html/html_page.go rename to src/internal/auth/html/html_page.go diff --git a/src/auth/internal/html/page_test.go b/src/internal/auth/html/page_test.go similarity index 100% rename from src/auth/internal/html/page_test.go rename to src/internal/auth/html/page_test.go diff --git a/src/auth/internal/packet/manager.go b/src/internal/auth/packet/manager.go similarity index 100% rename from src/auth/internal/packet/manager.go rename to src/internal/auth/packet/manager.go diff --git a/src/auth/internal/page/css.go b/src/internal/auth/page/css.go similarity index 99% rename from src/auth/internal/page/css.go rename to src/internal/auth/page/css.go index 467d323..c1baa59 100644 --- a/src/auth/internal/page/css.go +++ b/src/internal/auth/page/css.go @@ -3,7 +3,7 @@ package page import ( "fmt" - html "github.com/elecbug/linuxus/src/auth/internal/html" + html "github.com/elecbug/linuxus/src/internal/auth/html" ) // getLoginCSS builds style rules for the login page. diff --git a/src/auth/internal/page/html.go b/src/internal/auth/page/html.go similarity index 99% rename from src/auth/internal/page/html.go rename to src/internal/auth/page/html.go index 8714fee..0bd2d76 100644 --- a/src/auth/internal/page/html.go +++ b/src/internal/auth/page/html.go @@ -1,7 +1,7 @@ package page import ( - "github.com/elecbug/linuxus/src/auth/internal/html" + "github.com/elecbug/linuxus/src/internal/auth/html" ) // GetLoginPage renders the login HTML template. diff --git a/src/auth/internal/page/value.go b/src/internal/auth/page/value.go similarity index 100% rename from src/auth/internal/page/value.go rename to src/internal/auth/page/value.go diff --git a/src/auth/internal/user/user.go b/src/internal/auth/user/user.go similarity index 100% rename from src/auth/internal/user/user.go rename to src/internal/auth/user/user.go diff --git a/ctl/internal/app/app.go b/src/internal/ctl/app/app.go similarity index 94% rename from ctl/internal/app/app.go rename to src/internal/ctl/app/app.go index b3ae400..5fd8ec9 100644 --- a/ctl/internal/app/app.go +++ b/src/internal/ctl/app/app.go @@ -5,8 +5,8 @@ import ( "fmt" "github.com/docker/docker/client" - "github.com/elecbug/linuxus/ctl/internal/config" - "github.com/elecbug/linuxus/ctl/internal/system_api" + "github.com/elecbug/linuxus/src/internal/ctl/config" + "github.com/elecbug/linuxus/src/internal/ctl/system_api" ) // App stores runtime state, config, and Docker dependencies for linuxusctl. diff --git a/ctl/internal/app/config.go b/src/internal/ctl/app/config.go similarity index 83% rename from ctl/internal/app/config.go rename to src/internal/ctl/app/config.go index dffdf6c..f29ea63 100644 --- a/ctl/internal/app/config.go +++ b/src/internal/ctl/app/config.go @@ -24,10 +24,6 @@ func (a *App) LoadConfig() error { // normalizeConfigPaths resolves source-relative paths to absolute paths. func (a *App) normalizeConfigPaths() { - a.Config.UserService.SourceDir = a.absFromSource(a.Config.UserService.SourceDir) - a.Config.AuthService.SourceDir = a.absFromSource(a.Config.AuthService.SourceDir) - a.Config.ManagerService.SourceDir = a.absFromSource(a.Config.ManagerService.SourceDir) - a.Config.AuthService.Mounts.HostAuthListPath = a.absFromSource(a.Config.AuthService.Mounts.HostAuthListPath) a.Config.Volumes.Host.Homes = a.absFromSource(a.Config.Volumes.Host.Homes) diff --git a/ctl/internal/app/disk.go b/src/internal/ctl/app/disk.go similarity index 99% rename from ctl/internal/app/disk.go rename to src/internal/ctl/app/disk.go index de65788..5f7bf8c 100644 --- a/ctl/internal/app/disk.go +++ b/src/internal/ctl/app/disk.go @@ -8,7 +8,7 @@ import ( "sort" "strings" - "github.com/elecbug/linuxus/ctl/internal/format" + "github.com/elecbug/linuxus/src/internal/ctl/format" ) // cleanVolumesAll unmounts and removes all user and shared disks after confirming with the user. diff --git a/ctl/internal/app/docker_build.go b/src/internal/ctl/app/docker_build.go similarity index 73% rename from ctl/internal/app/docker_build.go rename to src/internal/ctl/app/docker_build.go index f07955d..e57c3e8 100644 --- a/ctl/internal/app/docker_build.go +++ b/src/internal/ctl/app/docker_build.go @@ -6,10 +6,11 @@ import ( "fmt" "io" "os" + "path" "path/filepath" "github.com/docker/docker/api/types/build" - "github.com/elecbug/linuxus/ctl/internal/format" + "github.com/elecbug/linuxus/src/internal/ctl/format" ) // buildRuntimeImages builds all runtime images required by services. @@ -20,15 +21,15 @@ func (a *App) buildRuntimeImages() error { return fmt.Errorf("Docker client is not initialized") } - if err := a.buildImage(a.Config.AuthService.SourceDir, a.authImageName(), nil); err != nil { + if err := a.buildImage(path.Join(a.sourceDir, "docker/auth.Dockerfile"), a.authImageName(), nil); err != nil { return fmt.Errorf("failed to build auth image: %w", err) } - if err := a.buildImage(a.Config.ManagerService.SourceDir, a.managerImageName(), nil); err != nil { + if err := a.buildImage(path.Join(a.sourceDir, "docker/manager.Dockerfile"), a.managerImageName(), nil); err != nil { return fmt.Errorf("failed to build manager image: %w", err) } - if err := a.buildImage(a.Config.UserService.SourceDir, a.userImageName(), map[string]*string{ + if err := a.buildImage(path.Join(a.sourceDir, "docker/user.Dockerfile"), a.userImageName(), map[string]*string{ "CONTAINER_RUNTIME_USER": &a.Config.UserService.Runtime.LinuxUsername, }); err != nil { return fmt.Errorf("failed to build user image: %w", err) @@ -37,30 +38,45 @@ func (a *App) buildRuntimeImages() error { return nil } -// buildImage builds a Docker image from a source directory. -func (a *App) buildImage(sourceDir string, tag string, buildArgs map[string]*string) error { - buildCtx, err := tarBuildContext(sourceDir) +// buildImage builds a Docker image using the given Dockerfile. +func (a *App) buildImage(dockerfilePath string, tag string, buildArgs map[string]*string) error { + if dockerfilePath == "" { + return fmt.Errorf("Dockerfile path is empty") + } + + if tag == "" { + return fmt.Errorf("image tag is empty") + } + + if _, err := os.Stat(dockerfilePath); err != nil { + return fmt.Errorf("Dockerfile not found: %s: %w", dockerfilePath, err) + } + + contextDir := a.sourceDir + + relDockerfile, err := filepath.Rel(contextDir, dockerfilePath) if err != nil { - return err + return fmt.Errorf("failed to get relative Dockerfile path: %w", err) + } + + buildCtx, err := tarBuildContext(contextDir) + if err != nil { + return fmt.Errorf("failed to create Docker build context: %w", err) } resp, err := a.dockerClient.ImageBuild(a.context, buildCtx, build.ImageBuildOptions{ Tags: []string{tag}, - Dockerfile: "Dockerfile", + Dockerfile: filepath.ToSlash(relDockerfile), Remove: true, BuildArgs: buildArgs, }) if err != nil { - return err + return fmt.Errorf("failed to build image %s: %w", tag, err) } defer resp.Body.Close() - if inErr := format.DockerBuildLog(format.DETAIL_PREFIX, resp.Body, tag); inErr != nil { - return fmt.Errorf("failed to process Docker build log for image %s: %w", tag, inErr) - } - - if err != nil { - return fmt.Errorf("failed to build image %s: %w", tag, err) + if err := format.DockerBuildLog(format.DETAIL_PREFIX, resp.Body, tag); err != nil { + return fmt.Errorf("failed to process Docker build log for image %s: %w", tag, err) } return nil diff --git a/ctl/internal/app/docker_container.go b/src/internal/ctl/app/docker_container.go similarity index 98% rename from ctl/internal/app/docker_container.go rename to src/internal/ctl/app/docker_container.go index b41959b..6341bf9 100644 --- a/ctl/internal/app/docker_container.go +++ b/src/internal/ctl/app/docker_container.go @@ -8,8 +8,8 @@ import ( "github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/network" "github.com/docker/go-connections/nat" - "github.com/elecbug/linuxus/ctl/internal/format" - "github.com/elecbug/linuxus/ctl/internal/spec" + "github.com/elecbug/linuxus/src/internal/ctl/format" + "github.com/elecbug/linuxus/src/internal/ctl/spec" ) // ensureAuthContainer creates or recreates the auth runtime container. diff --git a/ctl/internal/app/docker_inspect.go b/src/internal/ctl/app/docker_inspect.go similarity index 96% rename from ctl/internal/app/docker_inspect.go rename to src/internal/ctl/app/docker_inspect.go index 014a263..4abbbff 100644 --- a/ctl/internal/app/docker_inspect.go +++ b/src/internal/ctl/app/docker_inspect.go @@ -6,8 +6,8 @@ import ( "github.com/containerd/errdefs" "github.com/docker/docker/api/types/network" - "github.com/elecbug/linuxus/ctl/internal/format" - "github.com/elecbug/linuxus/ctl/internal/spec" + "github.com/elecbug/linuxus/src/internal/ctl/format" + "github.com/elecbug/linuxus/src/internal/ctl/spec" ) // showContainerInfos retrieves and displays information about the runtime-managed containers. diff --git a/ctl/internal/app/docker_network.go b/src/internal/ctl/app/docker_network.go similarity index 96% rename from ctl/internal/app/docker_network.go rename to src/internal/ctl/app/docker_network.go index 1ba673f..d1f0121 100644 --- a/ctl/internal/app/docker_network.go +++ b/src/internal/ctl/app/docker_network.go @@ -6,8 +6,8 @@ import ( "github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/network" - "github.com/elecbug/linuxus/ctl/internal/format" - "github.com/elecbug/linuxus/ctl/internal/spec" + "github.com/elecbug/linuxus/src/internal/ctl/format" + "github.com/elecbug/linuxus/src/internal/ctl/spec" ) // ensureRuntimeNetworks creates required runtime networks. diff --git a/ctl/internal/app/service.go b/src/internal/ctl/app/service.go similarity index 98% rename from ctl/internal/app/service.go rename to src/internal/ctl/app/service.go index 926b25c..f5a1121 100644 --- a/ctl/internal/app/service.go +++ b/src/internal/ctl/app/service.go @@ -4,8 +4,8 @@ import ( "fmt" "strings" - "github.com/elecbug/linuxus/ctl/internal/cli" - "github.com/elecbug/linuxus/ctl/internal/format" + "github.com/elecbug/linuxus/src/internal/ctl/cli" + "github.com/elecbug/linuxus/src/internal/ctl/format" ) // ServiceUp builds images and starts all runtime-managed services. diff --git a/ctl/internal/app/spec.go b/src/internal/ctl/app/spec.go similarity index 98% rename from ctl/internal/app/spec.go rename to src/internal/ctl/app/spec.go index 80f1611..55bbac9 100644 --- a/ctl/internal/app/spec.go +++ b/src/internal/ctl/app/spec.go @@ -3,8 +3,8 @@ package app import ( "fmt" - "github.com/elecbug/linuxus/ctl/internal/format" - "github.com/elecbug/linuxus/ctl/internal/spec" + "github.com/elecbug/linuxus/src/internal/ctl/format" + "github.com/elecbug/linuxus/src/internal/ctl/spec" ) // buildAuthRuntimeSpec builds the auth service container runtime specification. diff --git a/ctl/internal/app/user.go b/src/internal/ctl/app/user.go similarity index 100% rename from ctl/internal/app/user.go rename to src/internal/ctl/app/user.go diff --git a/ctl/internal/cli/cli.go b/src/internal/ctl/cli/cli.go similarity index 100% rename from ctl/internal/cli/cli.go rename to src/internal/ctl/cli/cli.go diff --git a/ctl/internal/config/config.go b/src/internal/ctl/config/config.go similarity index 95% rename from ctl/internal/config/config.go rename to src/internal/ctl/config/config.go index 0227023..7d36c05 100644 --- a/ctl/internal/config/config.go +++ b/src/internal/ctl/config/config.go @@ -4,9 +4,6 @@ package config type Config struct { // UserService configures user image and runtime settings. UserService struct { - // SourceDir is the Docker build context path for user service. - SourceDir string `yaml:"source_dir"` - // Container groups naming, runtime, and user limit settings. Container struct { // NamePrefix is prefixed to generated user container names. @@ -41,9 +38,6 @@ type Config struct { // AuthService configures the authentication gateway service. AuthService struct { - // SourceDir is the Docker build context path for auth service. - SourceDir string `yaml:"source_dir"` - // Container defines auth container runtime settings. Container struct { // Name is the auth container name. @@ -94,9 +88,6 @@ type Config struct { // ManagerService configures manager runtime and session behavior. ManagerService struct { - // SourceDir is the Docker build context path for manager service. - SourceDir string `yaml:"source_dir"` - // Container defines runtime and network settings for manager. Container struct { // Name is the manager container name. diff --git a/ctl/internal/config/validate.go b/src/internal/ctl/config/validate.go similarity index 93% rename from ctl/internal/config/validate.go rename to src/internal/ctl/config/validate.go index 36be1cd..c37c7e5 100644 --- a/ctl/internal/config/validate.go +++ b/src/internal/ctl/config/validate.go @@ -7,19 +7,13 @@ import ( "strings" "time" - "github.com/elecbug/linuxus/ctl/internal/format" + "github.com/elecbug/linuxus/src/internal/ctl/format" ) // ValidateConfig validates required config values before runtime operations. func ValidateConfig(cfg *Config) error { errMsgs := []string{} - if cfg.UserService.SourceDir == "" { - errMsgs = append(errMsgs, "user_service.source_dir is required") - } else if err := existDir(cfg.UserService.SourceDir); err != nil { - errMsgs = append(errMsgs, fmt.Sprintf("user_service.source_dir (%v)", err)) - } - if cfg.UserService.Container.NamePrefix == "" { errMsgs = append(errMsgs, "user_service.container.name_prefix is required") } else if !isValidDockerPrefix(cfg.UserService.Container.NamePrefix) { @@ -72,12 +66,6 @@ func ValidateConfig(cfg *Config) error { errMsgs = append(errMsgs, fmt.Sprintf("user_service.limits.admin (%v)", err)) } - if cfg.AuthService.SourceDir == "" { - errMsgs = append(errMsgs, "auth_service.source_dir is required") - } else if err := existDir(cfg.AuthService.SourceDir); err != nil { - errMsgs = append(errMsgs, fmt.Sprintf("auth_service.source_dir (%v)", err)) - } - if cfg.AuthService.Container.Name == "" { errMsgs = append(errMsgs, "auth_service.container.name is required") } else if !isValidDockerID(cfg.AuthService.Container.Name) { @@ -132,12 +120,6 @@ func ValidateConfig(cfg *Config) error { errMsgs = append(errMsgs, fmt.Sprintf("auth_service.security.trusted_proxies (%v)", err)) } - if cfg.ManagerService.SourceDir == "" { - errMsgs = append(errMsgs, "manager_service.source_dir is required") - } else if err := existDir(cfg.ManagerService.SourceDir); err != nil { - errMsgs = append(errMsgs, fmt.Sprintf("manager_service.source_dir (%v)", err)) - } - if cfg.ManagerService.Container.Name == "" { errMsgs = append(errMsgs, "manager_service.container.name is required") } else if !isValidDockerID(cfg.ManagerService.Container.Name) { @@ -261,19 +243,6 @@ func ValidateConfig(cfg *Config) error { return nil } -// existDir checks if the given path existDir and is a directory. -func existDir(path string) error { - _, err := os.Stat(path) - if err != nil { - if os.IsNotExist(err) { - return fmt.Errorf("path does not exist: %s", path) - } - return err - } - - return nil -} - // usablePath checks if the given path is usable (exists or can be created). func usablePath(path string) error { if _, err := os.Stat(path); err != nil { diff --git a/ctl/internal/format/format.go b/src/internal/ctl/format/format.go similarity index 100% rename from ctl/internal/format/format.go rename to src/internal/ctl/format/format.go diff --git a/ctl/internal/format/log.go b/src/internal/ctl/format/log.go similarity index 100% rename from ctl/internal/format/log.go rename to src/internal/ctl/format/log.go diff --git a/ctl/internal/format/parse.go b/src/internal/ctl/format/parse.go similarity index 99% rename from ctl/internal/format/parse.go rename to src/internal/ctl/format/parse.go index a083576..741da45 100644 --- a/ctl/internal/format/parse.go +++ b/src/internal/ctl/format/parse.go @@ -7,7 +7,7 @@ import ( "github.com/docker/docker/api/types/container" "github.com/docker/go-connections/nat" - "github.com/elecbug/linuxus/ctl/internal/spec" + "github.com/elecbug/linuxus/src/internal/ctl/spec" ) // StringToNanoCPUs converts a CPU value to Docker NanoCPUs. diff --git a/ctl/internal/spec/info.go b/src/internal/ctl/spec/info.go similarity index 100% rename from ctl/internal/spec/info.go rename to src/internal/ctl/spec/info.go diff --git a/ctl/internal/spec/spec.go b/src/internal/ctl/spec/spec.go similarity index 100% rename from ctl/internal/spec/spec.go rename to src/internal/ctl/spec/spec.go diff --git a/ctl/internal/system_api/api.go b/src/internal/ctl/system_api/api.go similarity index 100% rename from ctl/internal/system_api/api.go rename to src/internal/ctl/system_api/api.go diff --git a/src/manager/internal/config/config.go b/src/internal/manager/config/config.go similarity index 100% rename from src/manager/internal/config/config.go rename to src/internal/manager/config/config.go diff --git a/src/manager/internal/handler/handle_session.go b/src/internal/manager/handler/handle_session.go similarity index 98% rename from src/manager/internal/handler/handle_session.go rename to src/internal/manager/handler/handle_session.go index 622c02c..6cc67fa 100644 --- a/src/manager/internal/handler/handle_session.go +++ b/src/internal/manager/handler/handle_session.go @@ -11,7 +11,7 @@ import ( "github.com/containerd/errdefs" "github.com/docker/docker/api/types/container" - "github.com/elecbug/linuxus/src/manager/internal/packet" + "github.com/elecbug/linuxus/src/internal/manager/packet" ) // HandleUserSessionState records active session counts reported by auth service. diff --git a/src/manager/internal/handler/handle_up.go b/src/internal/manager/handler/handle_up.go similarity index 99% rename from src/manager/internal/handler/handle_up.go rename to src/internal/manager/handler/handle_up.go index 39e97c3..457e4da 100644 --- a/src/manager/internal/handler/handle_up.go +++ b/src/internal/manager/handler/handle_up.go @@ -15,8 +15,8 @@ import ( "github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/network" "github.com/docker/docker/client" - "github.com/elecbug/linuxus/src/manager/internal/config" - "github.com/elecbug/linuxus/src/manager/internal/packet" + "github.com/elecbug/linuxus/src/internal/manager/config" + "github.com/elecbug/linuxus/src/internal/manager/packet" ) // HandleUserUp handles user runtime preparation requests. diff --git a/src/manager/internal/handler/server.go b/src/internal/manager/handler/server.go similarity index 98% rename from src/manager/internal/handler/server.go rename to src/internal/manager/handler/server.go index 5f673f6..d65ba20 100644 --- a/src/manager/internal/handler/server.go +++ b/src/internal/manager/handler/server.go @@ -13,7 +13,7 @@ import ( "time" "github.com/docker/docker/client" - "github.com/elecbug/linuxus/src/manager/internal/config" + "github.com/elecbug/linuxus/src/internal/manager/config" ) // Server holds manager service dependencies and runtime state tracking. diff --git a/src/manager/internal/handler/util.go b/src/internal/manager/handler/util.go similarity index 100% rename from src/manager/internal/handler/util.go rename to src/internal/manager/handler/util.go diff --git a/src/manager/internal/packet/auth.go b/src/internal/manager/packet/auth.go similarity index 100% rename from src/manager/internal/packet/auth.go rename to src/internal/manager/packet/auth.go diff --git a/src/manager/go.sum b/src/manager/go.sum deleted file mode 100644 index 9b63dba..0000000 --- a/src/manager/go.sum +++ /dev/null @@ -1,99 +0,0 @@ -github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= -github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= -github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= -github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= -github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= -github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE= -github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk= -github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= -github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= -github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/docker v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaftjlSWt4AFexzM= -github.com/docker/docker v28.5.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.7.0 h1:6SsRfJddP22WMrCkj19x9WKjEDTB+ahsdiGYf0mN39c= -github.com/docker/go-connections v0.7.0/go.mod h1:no1qkHdjq7kLMGUXYAduOhYPSJxxvgWBh7ogVvptn3Q= -github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= -github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= -github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= -github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= -github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= -github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= -github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= -github.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw= -github.com/moby/sys/atomicwriter v0.1.0/go.mod h1:Ul8oqv2ZMNHOceF643P6FKPXeCmYtlQMvpizfsSoaWs= -github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU= -github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko= -github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ= -github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc= -github.com/morikuni/aec v1.1.0 h1:vBBl0pUnvi/Je71dsRrhMBtreIqNMYErSAbEeb8jrXQ= -github.com/morikuni/aec v1.1.0/go.mod h1:xDRgiq/iw5l+zkao76YTKzKttOp2cwPEne25HDkJnBw= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= -github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= -github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= -go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 h1:CqXxU8VOmDefoh0+ztfGaymYbhdB/tT3zs79QaZTNGY= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0/go.mod h1:BuhAPThV8PBHBvg8ZzZ/Ok3idOdhWIodywz2xEcRbJo= -go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= -go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 h1:88Y4s2C8oTui1LGM6bTWkw0ICGcOLCAI5l6zsD1j20k= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0/go.mod h1:Vl1/iaggsuRlrHf/hfPJPvVag77kKyvrLeD10kpMl+A= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0 h1:3iZJKlCZufyRzPzlQhUIWVmfltrXuGyfjREgGP3UUjc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0/go.mod h1:/G+nUPfhq2e+qiXMGxMwumDrP5jtzU+mWN7/sjT2rak= -go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= -go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= -go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= -go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= -go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= -go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= -go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= -go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= -go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= -go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= -golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= -golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= -golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= -golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= -golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= -golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= -golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= -google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 h1:VPWxll4HlMw1Vs/qXtN7BvhZqsS9cdAittCNvVENElA= -google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:7QBABkRtR8z+TEnmXTqIqwJLlzrZKVfAUm7tY3yGv0M= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 h1:m8qni9SQFH0tJc1X0vmnpw/0t+AImlSvp30sEupozUg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM= -google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4= -google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= -google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= -gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= diff --git a/src/auth/static/favicon.png b/src/static/favicon.png similarity index 100% rename from src/auth/static/favicon.png rename to src/static/favicon.png