installer: split up new env creation into chain of tasks
diff --git a/core/installer/tasks/activate.go b/core/installer/tasks/activate.go
new file mode 100644
index 0000000..f8b8018
--- /dev/null
+++ b/core/installer/tasks/activate.go
@@ -0,0 +1,99 @@
+package tasks
+
+import (
+	"bytes"
+	"embed"
+	"encoding/base64"
+	"fmt"
+	"path"
+	"strings"
+	"text/template"
+
+	"github.com/charmbracelet/keygen"
+
+	"github.com/giolekva/pcloud/core/installer"
+)
+
+//go:embed env-tmpl
+var filesTmpls embed.FS
+
+type activateEnvTask struct {
+	basicTask
+	env Env
+	st  *state
+}
+
+func NewActivateEnvTask(env Env, st *state) Task {
+	return &activateEnvTask{
+		basicTask: basicTask{
+			title: fmt.Sprintf("Activate %s environment", env.Name),
+		},
+		env: env,
+		st:  st,
+	}
+}
+
+func (t *activateEnvTask) Start() {
+	ssPublicKeys, err := t.st.ssClient.GetPublicKeys()
+	if err != nil {
+		t.callDoneListeners(err)
+		return
+	}
+	if err := t.addNewEnv(
+		t.st.repo,
+		strings.Split(t.st.ssClient.Addr, ":")[0],
+		t.st.keys,
+		ssPublicKeys,
+	); err != nil {
+		t.callDoneListeners(err)
+		return
+	}
+	t.callDoneListeners(nil)
+}
+
+func (t *activateEnvTask) addNewEnv(
+	repoIO installer.RepoIO,
+	repoHost string,
+	keys *keygen.KeyPair,
+	configRepoPublicKeys []string,
+) error {
+	kust, err := repoIO.ReadKustomization("environments/kustomization.yaml")
+	if err != nil {
+		return err
+	}
+	kust.AddResources(t.env.Name)
+	tmpls, err := template.ParseFS(filesTmpls, "env-tmpl/*.yaml")
+	if err != nil {
+		return err
+	}
+	var knownHosts bytes.Buffer
+	for _, key := range configRepoPublicKeys {
+		fmt.Fprintf(&knownHosts, "%s %s\n", repoHost, key)
+	}
+	for _, tmpl := range tmpls.Templates() {
+		dstPath := path.Join("environments", t.env.Name, tmpl.Name())
+		dst, err := repoIO.Writer(dstPath)
+		if err != nil {
+			return err
+		}
+		defer dst.Close()
+
+		if err := tmpl.Execute(dst, map[string]string{
+			"Name":       t.env.Name,
+			"PrivateKey": base64.StdEncoding.EncodeToString(keys.RawPrivateKey()),
+			"PublicKey":  base64.StdEncoding.EncodeToString(keys.RawAuthorizedKey()),
+			"RepoHost":   repoHost,
+			"RepoName":   "config",
+			"KnownHosts": base64.StdEncoding.EncodeToString(knownHosts.Bytes()),
+		}); err != nil {
+			return err
+		}
+	}
+	if err := repoIO.WriteKustomization("environments/kustomization.yaml", *kust); err != nil {
+		return err
+	}
+	if err := repoIO.CommitAndPush(fmt.Sprintf("%s: initialize environment", t.env.Name)); err != nil {
+		return err
+	}
+	return nil
+}