installer: use soft-serve keygen lib
diff --git a/charts/certificate-issuer-public/templates/issuer.yaml b/charts/certificate-issuer-public/templates/issuer.yaml
index 79f44f9..4bc338c 100644
--- a/charts/certificate-issuer-public/templates/issuer.yaml
+++ b/charts/certificate-issuer-public/templates/issuer.yaml
@@ -14,3 +14,4 @@
http01:
ingress:
class: {{ .Values.issuer.ingressClass }}
+ serviceType: ClusterIP
diff --git a/core/auth/ui/Makefile b/core/auth/ui/Makefile
index 89871d8..2a148fc 100644
--- a/core/auth/ui/Makefile
+++ b/core/auth/ui/Makefile
@@ -15,6 +15,16 @@
build_amd64:
go build -o server_amd64 *.go
-push: clean build_arm64 # build_amd64
- podman build --tag=giolekva/auth-ui:latest .
- podman push giolekva/auth-ui:latest
+push_arm64: clean build_arm64
+ podman build --platform linux/arm64 --tag=giolekva/auth-ui:arm64 .
+ podman push giolekva/auth-ui:arm64
+
+push_amd64: clean build_amd64
+ podman build --platform linux/amd64 --tag=giolekva/auth-ui:amd64 .
+ podman push giolekva/auth-ui:amd64
+
+
+push: push_arm64 push_amd64
+ podman manifest create giolekva/auth-ui:latest giolekva/auth-ui:arm64 giolekva/auth-ui:amd64
+ podman manifest push giolekva/auth-ui:latest docker://docker.io/giolekva/auth-ui:latest
+ podman manifest rm giolekva/auth-ui:latest
diff --git a/core/headscale/Makefile b/core/headscale/Makefile
index 57ec3d8..75f860f 100644
--- a/core/headscale/Makefile
+++ b/core/headscale/Makefile
@@ -15,6 +15,16 @@
build_amd64:
go build -o server_amd64 *.go
-push: clean build_arm64 # build_amd64
- podman build --tag=giolekva/headscale-api:latest .
- podman push giolekva/headscale-api:latest
+push_arm64: clean build_arm64
+ podman build --platform linux/arm64 --tag=giolekva/headscale-api:arm64 .
+ podman push giolekva/headscale-api:arm64
+
+push_amd64: clean build_amd64
+ podman build --platform linux/amd64 --tag=giolekva/headscale-api:amd64 .
+ podman push giolekva/headscale-api:amd64
+
+
+push: push_arm64 push_amd64
+ podman manifest create giolekva/headscale-api:latest giolekva/headscale-api:arm64 giolekva/headscale-api:amd64
+ podman manifest push giolekva/headscale-api:latest docker://docker.io/giolekva/headscale-api:latest
+ podman manifest rm giolekva/headscale-api:latest
diff --git a/core/installer/Makefile b/core/installer/Makefile
index 4d76e6b..ec56861 100644
--- a/core/installer/Makefile
+++ b/core/installer/Makefile
@@ -7,11 +7,12 @@
docker build --file=Dockerfile.flux --tag=giolekva/flux:latest . --platform=linux/arm64
docker push giolekva/flux:latest
+build: export CGO_ENABLED=0
build: clean
go build -o pcloud cmd/*.go
bootstrap:
- ./pcloud --kubeconfig=../../scripts/hetzner/kubeconfig bootstrap --env-name=dodo --charts-dir=../../charts --admin-pub-key=/Users/lekva/.ssh/id_rsa.pub --from-ip=192.168.100.210 --to-ip=192.168.100.240 --storage-dir=/pcloud-storage/longhorn
+ ./pcloud --kubeconfig=../../priv/kubeconfig-hetzner bootstrap --env-name=dodo --charts-dir=../../charts --admin-pub-key=/Users/lekva/.ssh/id_rsa.pub --from-ip=192.168.100.210 --to-ip=192.168.100.240 --storage-dir=/pcloud-storage/longhorn
create_env:
./pcloud --kubeconfig=../../priv/kubeconfig create-env --admin-priv-key=/Users/lekva/.ssh/id_rsa --name=lekva --ip=192.168.0.211 --admin-username=gio
diff --git a/core/installer/bootstrapper.go b/core/installer/bootstrapper.go
index 957f1ab..7e3cb8a 100644
--- a/core/installer/bootstrapper.go
+++ b/core/installer/bootstrapper.go
@@ -32,8 +32,7 @@
}
func (b Bootstrapper) Run(env EnvConfig) error {
- bootstrapJobKeys, err := NewSSHKeyPair()
- if err != nil {
+ if err := b.ns.Create(env.Name); err != nil {
return err
}
if err := b.installMetallb(env); err != nil {
@@ -43,13 +42,17 @@
return err
}
time.Sleep(1 * time.Minute) // TODO(giolekva): implement proper wait
- if err := b.installSoftServe(bootstrapJobKeys.Public, env.Name, env.ServiceIPs.ConfigRepo); err != nil {
+ bootstrapJobKeys, err := NewSSHKeyPair("bootstrapper")
+ if err != nil {
+ return err
+ }
+ if err := b.installSoftServe(bootstrapJobKeys.AuthorizedKey(), env.Name, env.ServiceIPs.ConfigRepo); err != nil {
return err
}
var ss *soft.Client
err = backoff.Retry(func() error {
var err error
- ss, err = soft.NewClient(netip.AddrPortFrom(env.ServiceIPs.ConfigRepo, 22), []byte(bootstrapJobKeys.Private), log.Default())
+ ss, err = soft.NewClient(netip.AddrPortFrom(env.ServiceIPs.ConfigRepo, 22), bootstrapJobKeys.RawPrivateKey(), log.Default())
return err
}, backoff.NewConstantBackOff(5*time.Second))
if err != nil {
@@ -76,7 +79,7 @@
if err := b.installEnvManager(ss, repoIO, nsGen, b.ns, env); err != nil {
return err
}
- if ss.RemovePublicKey("admin", bootstrapJobKeys.Public); err != nil {
+ if ss.RemovePublicKey("admin", bootstrapJobKeys.AuthorizedKey()); err != nil {
return err
}
return nil
@@ -242,7 +245,7 @@
func (b Bootstrapper) installSoftServe(adminPublicKey string, envName string, repoIP netip.Addr) error {
fmt.Println("Installing SoftServe")
- keys, err := NewSSHKeyPair()
+ keys, err := NewSSHKeyPair("soft-serve")
if err != nil {
return err
}
@@ -260,8 +263,8 @@
"tag": "v0.5.4",
"pullPolicy": "IfNotPresent",
},
- "privateKey": keys.Private,
- "publicKey": keys.Public,
+ "privateKey": string(keys.RawPrivateKey()),
+ "publicKey": string(keys.RawAuthorizedKey()),
"adminKey": adminPublicKey,
"reservedIP": repoIP.String(),
}
@@ -279,11 +282,11 @@
}
func (b Bootstrapper) installFluxcd(ss *soft.Client, envName string) error {
- keys, err := NewSSHKeyPair()
+ keys, err := NewSSHKeyPair("fluxcd")
if err != nil {
return err
}
- if err := ss.AddUser("flux", keys.Public); err != nil {
+ if err := ss.AddUser("flux", keys.AuthorizedKey()); err != nil {
return err
}
if err := ss.MakeUserAdmin("flux"); err != nil {
@@ -302,7 +305,7 @@
ss.GetRepoAddress(envName),
ss.Addr.Addr().String(),
string(ssPublic),
- keys.Private,
+ string(keys.RawPrivateKey()),
envName,
); err != nil {
return err
@@ -443,12 +446,12 @@
}
func (b Bootstrapper) installEnvManager(ss *soft.Client, repo RepoIO, nsGen NamespaceGenerator, nsCreator NamespaceCreator, env EnvConfig) error {
- keys, err := NewSSHKeyPair()
+ keys, err := NewSSHKeyPair("env-manager")
if err != nil {
return err
}
user := fmt.Sprintf("%s-env-manager", env.Name)
- if err := ss.AddUser(user, keys.Public); err != nil {
+ if err := ss.AddUser(user, keys.AuthorizedKey()); err != nil {
return err
}
if err := ss.MakeUserAdmin(user); err != nil {
@@ -479,7 +482,7 @@
"RepoIP": env.ServiceIPs.ConfigRepo,
"RepoPort": 22,
"RepoName": env.Name,
- "SSHPrivateKey": keys.Private,
+ "SSHPrivateKey": string(keys.RawPrivateKey()),
},
}
if len(namespaces) > 0 {
diff --git a/core/installer/cmd/env_manager.go b/core/installer/cmd/env_manager.go
index a77061a..8e21c67 100644
--- a/core/installer/cmd/env_manager.go
+++ b/core/installer/cmd/env_manager.go
@@ -3,7 +3,6 @@
import (
"log"
"net/netip"
- "os"
"github.com/spf13/cobra"
@@ -52,7 +51,7 @@
}
func envManagerCmdRun(cmd *cobra.Command, args []string) error {
- sshKey, err := os.ReadFile(envManagerFlags.sshKey)
+ sshKey, err := installer.NewSSHKeyPair(envManagerFlags.sshKey)
if err != nil {
return err
}
@@ -60,15 +59,17 @@
if err != nil {
return err
}
- ss, err := soft.NewClient(repoAddr, sshKey, log.Default())
+ ss, err := soft.NewClient(repoAddr, sshKey.RawPrivateKey(), log.Default())
if err != nil {
return err
}
+ log.Printf("Created Soft Serve client\n")
repo, err := ss.GetRepo(envManagerFlags.repoName)
if err != nil {
return err
}
- repoIO := installer.NewRepoIO(repo, ss.Signer)
+ log.Printf("Cloned repo: %s\n", envManagerFlags.repoName)
+ repoIO := installer.NewRepoIO(repo, sshKey.Signer())
nsCreator, err := newNSCreator()
if err != nil {
return err
@@ -79,6 +80,7 @@
repoIO,
nsCreator,
)
+ log.Printf("Starting server\n")
s.Start()
return nil
}
diff --git a/core/installer/go.mod b/core/installer/go.mod
index 1721cf0..275673a 100644
--- a/core/installer/go.mod
+++ b/core/installer/go.mod
@@ -5,11 +5,13 @@
require (
github.com/Masterminds/sprig/v3 v3.2.2
github.com/cenkalti/backoff/v4 v4.1.2
- github.com/go-git/go-billy/v5 v5.4.1
- github.com/go-git/go-git/v5 v5.7.0
+ github.com/charmbracelet/keygen v0.5.0
+ github.com/go-git/go-billy/v5 v5.5.0
+ github.com/go-git/go-git/v5 v5.10.0
+ github.com/gorilla/mux v1.8.0
github.com/labstack/echo/v4 v4.10.2
github.com/spf13/cobra v1.4.0
- golang.org/x/crypto v0.9.0
+ golang.org/x/crypto v0.14.0
golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1
helm.sh/helm/v3 v3.9.0
k8s.io/api v0.24.0
@@ -19,14 +21,15 @@
)
require (
+ dario.cat/mergo v1.0.0 // indirect
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
github.com/BurntSushi/toml v1.0.0 // indirect
github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd // indirect
github.com/Masterminds/goutils v1.1.1 // indirect
github.com/Masterminds/semver/v3 v3.1.1 // indirect
github.com/Masterminds/squirrel v1.5.2 // indirect
- github.com/Microsoft/go-winio v0.5.2 // indirect
- github.com/ProtonMail/go-crypto v0.0.0-20230518184743-7afd39499903 // indirect
+ github.com/Microsoft/go-winio v0.6.1 // indirect
+ github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect
github.com/PuerkitoBio/purell v1.1.1 // indirect
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
github.com/acomagu/bufpipe v1.0.4 // indirect
@@ -36,7 +39,7 @@
github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 // indirect
github.com/cloudflare/circl v1.3.3 // indirect
github.com/containerd/containerd v1.6.3 // indirect
- github.com/cyphar/filepath-securejoin v0.2.3 // indirect
+ github.com/cyphar/filepath-securejoin v0.2.4 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/docker/cli v20.10.11+incompatible // indirect
github.com/docker/distribution v2.8.1+incompatible // indirect
@@ -67,7 +70,6 @@
github.com/google/gofuzz v1.2.0 // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
github.com/google/uuid v1.2.0 // indirect
- github.com/gorilla/mux v1.8.0 // indirect
github.com/gosuri/uitable v0.0.4 // indirect
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 // indirect
github.com/huandu/xstrings v1.3.2 // indirect
@@ -114,8 +116,8 @@
github.com/russross/blackfriday v1.5.2 // indirect
github.com/sergi/go-diff v1.1.0 // indirect
github.com/shopspring/decimal v1.2.0 // indirect
- github.com/sirupsen/logrus v1.8.1 // indirect
- github.com/skeema/knownhosts v1.1.1 // indirect
+ github.com/sirupsen/logrus v1.9.0 // indirect
+ github.com/skeema/knownhosts v1.2.0 // indirect
github.com/spf13/cast v1.4.1 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/stretchr/testify v1.8.1 // indirect
@@ -127,13 +129,15 @@
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca // indirect
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect
- golang.org/x/net v0.10.0 // indirect
+ golang.org/x/mod v0.12.0 // indirect
+ golang.org/x/net v0.17.0 // indirect
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect
- golang.org/x/sync v0.1.0 // indirect
- golang.org/x/sys v0.8.0 // indirect
- golang.org/x/term v0.8.0 // indirect
- golang.org/x/text v0.9.0 // indirect
+ golang.org/x/sync v0.3.0 // indirect
+ golang.org/x/sys v0.13.0 // indirect
+ golang.org/x/term v0.13.0 // indirect
+ golang.org/x/text v0.13.0 // indirect
golang.org/x/time v0.3.0 // indirect
+ golang.org/x/tools v0.13.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368 // indirect
google.golang.org/grpc v1.43.0 // indirect
diff --git a/core/installer/go.sum b/core/installer/go.sum
index f3a698c..5f126a9 100644
--- a/core/installer/go.sum
+++ b/core/installer/go.sum
@@ -36,6 +36,8 @@
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
+dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk=
+dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8=
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
@@ -64,14 +66,15 @@
github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk=
github.com/Masterminds/squirrel v1.5.2 h1:UiOEi2ZX4RCSkpiNDQN5kro/XIBpSRk9iTqdIRPzUXE=
github.com/Masterminds/squirrel v1.5.2/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10=
-github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA=
github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
+github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
+github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
github.com/Microsoft/hcsshim v0.9.2 h1:wB06W5aYFfUB3IvootYAY2WnOmIdgPGfqSI6tufQNnY=
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
-github.com/ProtonMail/go-crypto v0.0.0-20230518184743-7afd39499903 h1:ZK3C5DtzV2nVAQTx5S5jQvMeDqWtD1By5mOoyY/xJek=
-github.com/ProtonMail/go-crypto v0.0.0-20230518184743-7afd39499903/go.mod h1:8TI4H3IbrackdNgv+92dI+rhpCaLqM0IfpgCgenFvRE=
+github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 h1:kkhsdkhsCvIsutKu5zLMgWtgh9YxGCNAw8Ad8hjwfYg=
+github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0=
github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
@@ -109,7 +112,7 @@
github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd h1:rFt+Y/IK1aEZkEHchZRSq9OQbsSzIT/OrI8YFFmRIng=
github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ=
github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o=
-github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
+github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
github.com/cenkalti/backoff/v4 v4.1.2 h1:6Yo7N8UP2K6LWZnW94DLVSSrbobcWdVzAYOisuDPIFo=
github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
@@ -121,11 +124,12 @@
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 h1:7aWHqerlJ41y6FOsEUvknqgXnGmJyJSbjhAWq5pO4F8=
github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw=
+github.com/charmbracelet/keygen v0.5.0 h1:XY0fsoYiCSM9axkrU+2ziE6u6YjJulo/b9Dghnw6MZc=
+github.com/charmbracelet/keygen v0.5.0/go.mod h1:DfvCgLHxZ9rJxdK0DGw3C/LkV4SgdGbnliHcObV3L+8=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
-github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I=
github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs=
github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
@@ -154,8 +158,8 @@
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw=
github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
-github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI=
-github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
+github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg=
+github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
@@ -184,7 +188,7 @@
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
-github.com/elazarl/goproxy v0.0.0-20221015165544-a0805db90819 h1:RIB4cRk+lBqKK3Oy0r2gRX4ui7tuhiZq2SuTtTCi0/0=
+github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU=
github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk=
github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
@@ -224,11 +228,11 @@
github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic=
-github.com/go-git/go-billy/v5 v5.4.1 h1:Uwp5tDRkPr+l/TnbHOQzp+tmJfLceOlbVucgpTz8ix4=
-github.com/go-git/go-billy/v5 v5.4.1/go.mod h1:vjbugF6Fz7JIflbVpl1hJsGjSHNltrSw45YK/ukIvQg=
-github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20230305113008-0c11038e723f h1:Pz0DHeFij3XFhoBRGUDPzSJ+w2UcK5/0JvF8DRI58r8=
-github.com/go-git/go-git/v5 v5.7.0 h1:t9AudWVLmqzlo+4bqdf7GY+46SUuRsx59SboFxkq2aE=
-github.com/go-git/go-git/v5 v5.7.0/go.mod h1:coJHKEOk5kUClpsNlXrUvPrDxY3w3gjHvhcZd8Fodw8=
+github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU=
+github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow=
+github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4=
+github.com/go-git/go-git/v5 v5.10.0 h1:F0x3xXrAWmhwtzoCokU4IMPcBdncG+HAAqi9FcOOjbQ=
+github.com/go-git/go-git/v5 v5.10.0/go.mod h1:1FOZ/pQnqw24ghP2n7cunVl0ON55BsjPYvhWHvZGhoo=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
@@ -443,8 +447,8 @@
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
-github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
@@ -557,7 +561,7 @@
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
-github.com/onsi/gomega v1.15.0 h1:WjP/FQ/sk43MRmnEcT+MlDw2TFvkrXlprrPST/IudjU=
+github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI=
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.0.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec=
@@ -617,6 +621,7 @@
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
+github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
github.com/rubenv/sql-migrate v1.1.1 h1:haR5Hn8hbW9/SpAICrXoZqXnywS7Q5WijwkQENPeNWY=
github.com/rubenv/sql-migrate v1.1.1/go.mod h1:/7TZymwxN8VWumcIxw1jjHEcR1djpdkMHQPT4FWdnbQ=
github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo=
@@ -634,10 +639,11 @@
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
-github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
-github.com/skeema/knownhosts v1.1.1 h1:MTk78x9FPgDFVFkDLTrsnnfCJl7g1C/nnKvePgrIngE=
-github.com/skeema/knownhosts v1.1.1/go.mod h1:g4fPeYpque7P0xefxtGzV81ihjC8sX2IqpAoNkjxbMo=
+github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
+github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
+github.com/skeema/knownhosts v1.2.0 h1:h9r9cf0+u7wSE+M183ZtMGgOJKiL96brpaz5ekfJCpM=
+github.com/skeema/knownhosts v1.2.0/go.mod h1:g4fPeYpque7P0xefxtGzV81ihjC8sX2IqpAoNkjxbMo=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
@@ -768,9 +774,10 @@
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
-golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=
-golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
+golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
+golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -811,6 +818,8 @@
golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc=
+golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -861,10 +870,11 @@
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
-golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
-golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
+golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
+golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -892,8 +902,9 @@
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
+golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -960,7 +971,6 @@
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -970,17 +980,19 @@
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
-golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
+golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
-golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols=
-golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
+golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek=
+golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -990,10 +1002,11 @@
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
-golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
-golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
+golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1062,6 +1075,8 @@
golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
+golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ=
+golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
diff --git a/core/installer/keys.go b/core/installer/keys.go
index 695176f..d3dd1d7 100644
--- a/core/installer/keys.go
+++ b/core/installer/keys.go
@@ -1,40 +1,9 @@
package installer
import (
- "crypto/ed25519"
- "crypto/rand"
- "crypto/x509"
- "encoding/pem"
-
- "golang.org/x/crypto/ssh"
+ "github.com/charmbracelet/keygen"
)
-type KeyPair struct {
- Public string
- Private string
-}
-
-func NewSSHKeyPair() (KeyPair, error) {
- pub, priv, err := ed25519.GenerateKey(rand.Reader)
- if err != nil {
- return KeyPair{}, err
- }
- privEnc, err := x509.MarshalPKCS8PrivateKey(priv)
- if err != nil {
- return KeyPair{}, err
- }
- privPem := pem.EncodeToMemory(
- &pem.Block{
- Type: "PRIVATE KEY",
- Bytes: privEnc,
- },
- )
- pubKey, err := ssh.NewPublicKey(pub)
- if err != nil {
- return KeyPair{}, err
- }
- return KeyPair{
- Public: string(ssh.MarshalAuthorizedKey(pubKey)),
- Private: string(privPem),
- }, nil
+func NewSSHKeyPair(path string) (*keygen.KeyPair, error) {
+ return keygen.New(path, keygen.WithKeyType(keygen.Ed25519))
}
diff --git a/core/installer/kube.go b/core/installer/kube.go
index bf22f40..3fa253b 100644
--- a/core/installer/kube.go
+++ b/core/installer/kube.go
@@ -5,6 +5,7 @@
"fmt"
corev1 "k8s.io/api/core/v1"
+ "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
@@ -53,6 +54,8 @@
Name: name,
},
}, metav1.CreateOptions{})
- fmt.Printf("++++ Created ns: %s %+v\n", name, err)
+ if err != nil && errors.IsAlreadyExists(err) {
+ return nil
+ }
return err
}
diff --git a/core/installer/namespace.go b/core/installer/namespace.go
index 0acc608..7c2a7fd 100644
--- a/core/installer/namespace.go
+++ b/core/installer/namespace.go
@@ -20,6 +20,18 @@
return "", nil
}
+type suffixGenerator struct {
+ suffix string
+}
+
+func NewSuffixGenerator(suffix string) SuffixGenerator {
+ return &suffixGenerator{suffix}
+}
+
+func (g *suffixGenerator) Generate() (string, error) {
+ return g.suffix, nil
+}
+
type fixedLengthRandomSuffixGenerator struct {
len int
}
diff --git a/core/installer/repoio.go b/core/installer/repoio.go
index aae063c..54d9a7d 100644
--- a/core/installer/repoio.go
+++ b/core/installer/repoio.go
@@ -378,6 +378,8 @@
} else {
ret[k] = v
}
+ } else if t == "boolean" {
+ ret[k] = v
} else {
ret[k], err = deriveValues(v, def, networks)
if err != nil {
diff --git a/core/installer/soft/client.go b/core/installer/soft/client.go
index d23a2f7..4f0bf16 100644
--- a/core/installer/soft/client.go
+++ b/core/installer/soft/client.go
@@ -1,6 +1,7 @@
package soft
import (
+ "errors"
"fmt"
"golang.org/x/crypto/ssh"
"log"
@@ -12,6 +13,7 @@
"github.com/go-git/go-billy/v5/memfs"
"github.com/go-git/go-git/v5"
+ "github.com/go-git/go-git/v5/plumbing/transport"
gitssh "github.com/go-git/go-git/v5/plumbing/transport/ssh"
"github.com/go-git/go-git/v5/storage/memory"
)
@@ -103,8 +105,8 @@
}
func ParseRepositoryAddress(addr string) (RepositoryAddress, error) {
- items := regexp.MustCompile(`ssh://.*)/(.*)`).FindStringSubmatch(addr)
- if len(items) != 2 {
+ items := regexp.MustCompile(`ssh://(.*)/(.*)`).FindStringSubmatch(addr)
+ if len(items) != 3 {
return RepositoryAddress{}, fmt.Errorf("Invalid address")
}
ipPort, err := netip.ParseAddrPort(items[1])
@@ -138,7 +140,7 @@
InsecureSkipTLS: true,
Progress: os.Stdout,
})
- if err != nil {
+ if err != nil && !errors.Is(err, transport.ErrEmptyRemoteRepository) {
return nil, err
}
return &Repository{
diff --git a/core/installer/values-tmpl/core-auth-storage.yaml b/core/installer/values-tmpl/core-auth-storage.yaml
index 368b433..8ae3b71 100644
--- a/core/installer/values-tmpl/core-auth-storage.yaml
+++ b/core/installer/values-tmpl/core-auth-storage.yaml
@@ -15,7 +15,7 @@
values:
fullnameOverride: postgres
image:
- repository: arm64v8/postgres
+ repository: library/postgres # arm64v8/postgres
tag: 15.3
service:
type: ClusterIP
diff --git a/core/installer/values-tmpl/headscale.yaml b/core/installer/values-tmpl/headscale.yaml
index c3894c2..9b43351 100644
--- a/core/installer/values-tmpl/headscale.yaml
+++ b/core/installer/values-tmpl/headscale.yaml
@@ -22,7 +22,7 @@
pullPolicy: IfNotPresent
storage:
size: 5Gi
- ingressClassName: pcloud-ingress-public
+ ingressClassName: {{ .Global.Id }}-ingress-public
certificateIssuer: {{ .Global.Id }}-public
domain: {{ .Values.Subdomain }}.{{ .Global.Domain }}
publicBaseDomain: {{ .Global.Domain }}
diff --git a/core/installer/values-tmpl/metallb-ipaddresspool.jsonschema b/core/installer/values-tmpl/metallb-ipaddresspool.jsonschema
index 479ef98..d76700b 100644
--- a/core/installer/values-tmpl/metallb-ipaddresspool.jsonschema
+++ b/core/installer/values-tmpl/metallb-ipaddresspool.jsonschema
@@ -4,7 +4,8 @@
"Name": { "type": "string" },
"From": { "type": "string" },
"To": { "type": "string" },
- "AutoAssign": { "type": "boolean" }
+ "AutoAssign": { "type": "boolean" },
+ "Namespace": { "type": "string" }
},
"additionalProperties": false
}
diff --git a/core/installer/values-tmpl/metallb-ipaddresspool.yaml b/core/installer/values-tmpl/metallb-ipaddresspool.yaml
index 4eeacc9..87b55f4 100644
--- a/core/installer/values-tmpl/metallb-ipaddresspool.yaml
+++ b/core/installer/values-tmpl/metallb-ipaddresspool.yaml
@@ -17,3 +17,4 @@
from: {{ .Values.From }}
to: {{ .Values.To }}
autoAssign: {{ .Values.AutoAssign }}
+ namespace: {{ .Values.Namespace }}
diff --git a/core/installer/welcome/env-tmpl/config-source.yaml b/core/installer/welcome/env-tmpl/config-source.yaml
index 5af1f9c..895c5e4 100644
--- a/core/installer/welcome/env-tmpl/config-source.yaml
+++ b/core/installer/welcome/env-tmpl/config-source.yaml
@@ -4,7 +4,6 @@
name: {{ .Name }}
namespace: {{ .Name }}
spec:
- gitImplementation: go-git
interval: 1m0s
ref:
branch: master
diff --git a/core/installer/welcome/env.go b/core/installer/welcome/env.go
index e08c073..20b4354 100644
--- a/core/installer/welcome/env.go
+++ b/core/installer/welcome/env.go
@@ -10,7 +10,8 @@
"path"
"text/template"
- "github.com/labstack/echo/v4"
+ "github.com/charmbracelet/keygen"
+ "github.com/gorilla/mux"
"github.com/giolekva/pcloud/core/installer"
"github.com/giolekva/pcloud/core/installer/soft"
@@ -39,15 +40,19 @@
}
func (s *EnvServer) Start() {
- e := echo.New()
- e.StaticFS("/static", echo.MustSubFS(staticAssets, "static"))
- e.GET("/env", s.createEnvForm)
- e.POST("/env", s.createEnv)
- log.Fatal(e.Start(fmt.Sprintf(":%d", s.port)))
+ r := mux.NewRouter()
+ r.PathPrefix("/static/").Handler(http.FileServer(http.FS(staticAssets)))
+ r.Path("/env").Methods("GET").HandlerFunc(s.createEnvForm)
+ r.Path("/env").Methods("POST").HandlerFunc(s.createEnv)
+ http.Handle("/", r)
+ log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", s.port), nil))
}
-func (s *EnvServer) createEnvForm(c echo.Context) error {
- return c.HTML(http.StatusOK, createEnvFormHtml)
+func (s *EnvServer) createEnvForm(w http.ResponseWriter, r *http.Request) {
+ log.Printf("asdasd\n")
+ if _, err := w.Write([]byte(createEnvFormHtml)); err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ }
}
type createEnvReq struct {
@@ -56,68 +61,77 @@
Domain string `json:"domain"`
}
-func (s *EnvServer) createEnv(c echo.Context) error {
+func (s *EnvServer) createEnv(w http.ResponseWriter, r *http.Request) {
var req createEnvReq
if err := func() error {
var err error
- f, err := c.FormParams()
- if err != nil {
+ if err = r.ParseForm(); err != nil {
return err
}
- if req.Name, err = getFormValue(f, "name"); err != nil {
+ if req.Name, err = getFormValue(r.PostForm, "name"); err != nil {
return err
}
- if req.Domain, err = getFormValue(f, "domain"); err != nil {
+ if req.Domain, err = getFormValue(r.PostForm, "domain"); err != nil {
return err
}
- if req.ContactEmail, err = getFormValue(f, "contact-email"); err != nil {
+ if req.ContactEmail, err = getFormValue(r.PostForm, "contact-email"); err != nil {
return err
}
return nil
}(); err != nil {
- if err := json.NewDecoder(c.Request().Body).Decode(&req); err != nil {
- return err
+ if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
}
}
- keys, err := installer.NewSSHKeyPair()
+ fluxUserName := fmt.Sprintf("flux-%s", req.Name)
+ keys, err := installer.NewSSHKeyPair(fluxUserName)
if err != nil {
- return err
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
}
{
readme := fmt.Sprintf("# %s PCloud environment", req.Name)
if err := s.ss.AddRepository(req.Name, readme); err != nil {
- return err
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
}
- fluxUserName := fmt.Sprintf("flux-%s", req.Name)
- if err := s.ss.AddUser(fluxUserName, keys.Public); err != nil {
- return err
+ if err := s.ss.AddUser(fluxUserName, keys.AuthorizedKey()); err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
}
if err := s.ss.AddCollaborator(req.Name, fluxUserName); err != nil {
- return err
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
}
}
{
repo, err := s.ss.GetRepo(req.Name)
if err != nil {
- return err
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
}
var env installer.EnvConfig
r, err := s.repo.Reader("config.yaml")
if err != nil {
- return err
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
}
defer r.Close()
if err := installer.ReadYaml(r, &env); err != nil {
- return err
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
}
if err := initNewEnv(s.ss, installer.NewRepoIO(repo, s.ss.Signer), s.nsCreator, req, env); err != nil {
- return err
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
}
}
{
ssPubKey, err := s.ss.GetPublicKey()
if err != nil {
- return err
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
}
if err := addNewEnv(
s.repo,
@@ -125,10 +139,14 @@
keys,
ssPubKey,
); err != nil {
- return err
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
}
}
- return c.String(http.StatusOK, "OK")
+ if _, err := w.Write([]byte("OK")); err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
}
func initNewEnv(
@@ -191,41 +209,45 @@
}
r.CommitAndPush("initialize config")
nsGen := installer.NewPrefixGenerator(req.Name + "-")
- suffixGen := installer.NewEmptySuffixGenerator()
+ emptySuffixGen := installer.NewEmptySuffixGenerator()
{
app, err := appsRepo.Find("metallb-ipaddresspool")
if err != nil {
return err
}
- if err := appManager.Install(*app, nsGen, suffixGen, map[string]any{
+ if err := appManager.Install(*app, nsGen, installer.NewSuffixGenerator("-ingress-private"), map[string]any{
"Name": fmt.Sprintf("%s-ingress-private", req.Name),
"From": "10.1.0.1",
"To": "10.1.0.1",
"AutoAssign": false,
+ "Namespace": "metallb-system",
}); err != nil {
return err
}
- if err := appManager.Install(*app, nsGen, suffixGen, map[string]any{
+ if err := appManager.Install(*app, nsGen, installer.NewSuffixGenerator("-headscale"), map[string]any{
"Name": fmt.Sprintf("%s-headscale", req.Name),
"From": "10.1.0.2",
"To": "10.1.0.2",
"AutoAssign": false,
+ "Namespace": "metallb-system",
}); err != nil {
return err
}
- if err := appManager.Install(*app, nsGen, suffixGen, map[string]any{
+ if err := appManager.Install(*app, nsGen, installer.NewSuffixGenerator("-soft-serve"), map[string]any{
"Name": fmt.Sprintf("%s-soft-serve", req.Name), // TODO(giolekva): rename to config repo
"From": "10.1.0.3",
"To": "10.1.0.3",
"AutoAssign": false,
+ "Namespace": "metallb-system",
}); err != nil {
return err
}
- if err := appManager.Install(*app, nsGen, suffixGen, map[string]any{
+ if err := appManager.Install(*app, nsGen, emptySuffixGen, map[string]any{
"Name": req.Name,
"From": "10.1.0.100",
"To": "10.1.0.254",
"AutoAssign": false,
+ "Namespace": "metallb-system",
}); err != nil {
return err
}
@@ -235,7 +257,7 @@
if err != nil {
return err
}
- if err := appManager.Install(*app, nsGen, suffixGen, map[string]any{}); err != nil {
+ if err := appManager.Install(*app, nsGen, emptySuffixGen, map[string]any{}); err != nil {
return err
}
}
@@ -244,7 +266,7 @@
if err != nil {
return err
}
- if err := appManager.Install(*app, nsGen, suffixGen, map[string]any{}); err != nil {
+ if err := appManager.Install(*app, nsGen, emptySuffixGen, map[string]any{}); err != nil {
return err
}
}
@@ -253,7 +275,7 @@
if err != nil {
return err
}
- if err := appManager.Install(*app, nsGen, suffixGen, map[string]any{
+ if err := appManager.Install(*app, nsGen, emptySuffixGen, map[string]any{
"Subdomain": "test", // TODO(giolekva): make core-auth chart actually use this
}); err != nil {
return err
@@ -264,19 +286,19 @@
if err != nil {
return err
}
- if err := appManager.Install(*app, nsGen, suffixGen, map[string]any{
+ if err := appManager.Install(*app, nsGen, emptySuffixGen, map[string]any{
"Subdomain": "headscale",
}); err != nil {
return err
}
}
{
- keys, err := installer.NewSSHKeyPair()
+ keys, err := installer.NewSSHKeyPair("welcome")
if err != nil {
return err
}
user := fmt.Sprintf("%s-welcome", req.Name)
- if err := ss.AddUser(user, keys.Public); err != nil {
+ if err := ss.AddUser(user, keys.AuthorizedKey()); err != nil {
return err
}
if err := ss.AddCollaborator(req.Name, user); err != nil {
@@ -286,20 +308,20 @@
if err != nil {
return err
}
- if err := appManager.Install(*app, nsGen, suffixGen, map[string]any{
+ if err := appManager.Install(*app, nsGen, emptySuffixGen, map[string]any{
"RepoAddr": ss.GetRepoAddress(req.Name),
- "SSHPrivateKey": keys.Private,
+ "SSHPrivateKey": string(keys.RawPrivateKey()),
}); err != nil {
return err
}
}
{
- keys, err := installer.NewSSHKeyPair()
+ user := fmt.Sprintf("%s-appmanager", req.Name)
+ keys, err := installer.NewSSHKeyPair(user)
if err != nil {
return err
}
- user := fmt.Sprintf("%s-appmanager", req.Name)
- if err := ss.AddUser(user, keys.Public); err != nil {
+ if err := ss.AddUser(user, keys.AuthorizedKey()); err != nil {
return err
}
if err := ss.AddCollaborator(req.Name, user); err != nil {
@@ -309,9 +331,9 @@
if err != nil {
return err
}
- if err := appManager.Install(*app, nsGen, suffixGen, map[string]any{
+ if err := appManager.Install(*app, nsGen, emptySuffixGen, map[string]any{
"RepoAddr": ss.GetRepoAddress(req.Name),
- "SSHPrivateKey": keys.Private,
+ "SSHPrivateKey": string(keys.RawPrivateKey()),
}); err != nil {
return err
}
@@ -322,7 +344,7 @@
func addNewEnv(
repoIO installer.RepoIO,
req createEnvReq,
- keys installer.KeyPair,
+ keys *keygen.KeyPair,
pcloudRepoPublicKey []byte,
) error {
kust, err := repoIO.ReadKustomization("environments/kustomization.yaml")
@@ -344,8 +366,8 @@
defer dst.Close()
if err := tmpl.Execute(dst, map[string]string{
"Name": req.Name,
- "PrivateKey": base64.StdEncoding.EncodeToString([]byte(keys.Private)),
- "PublicKey": base64.StdEncoding.EncodeToString([]byte(keys.Public)),
+ "PrivateKey": base64.StdEncoding.EncodeToString(keys.RawPrivateKey()),
+ "PublicKey": base64.StdEncoding.EncodeToString(keys.RawAuthorizedKey()),
"GitHost": repoIP,
"KnownHosts": base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s %s", repoIP, pcloudRepoPublicKey))),
}); err != nil {