installer: appmanager cmd
diff --git a/core/installer/cmd/app_manager.go b/core/installer/cmd/app_manager.go
new file mode 100644
index 0000000..1fc6d64
--- /dev/null
+++ b/core/installer/cmd/app_manager.go
@@ -0,0 +1,55 @@
+package main
+
+import (
+ "os"
+
+ "github.com/giolekva/pcloud/core/installer"
+ "github.com/spf13/cobra"
+ "golang.org/x/crypto/ssh"
+)
+
+var appManagerFlags struct {
+ sshKey string
+ repoAddr string
+}
+
+func appManagerCmd() *cobra.Command {
+ cmd := &cobra.Command{
+ Use: "appmanager",
+ RunE: installCmdRun,
+ }
+ cmd.Flags().StringVar(
+ &installFlags.sshKey,
+ "ssh-key",
+ "",
+ "",
+ )
+ cmd.Flags().StringVar(
+ &installFlags.repoAddr,
+ "repo-addr",
+ "",
+ "",
+ )
+ return cmd
+}
+
+func appManagerCmdRun(cmd *cobra.Command, args []string) error {
+ sshKey, err := os.ReadFile(installFlags.sshKey)
+ if err != nil {
+ return err
+ }
+ signer, err := ssh.ParsePrivateKey(sshKey)
+ if err != nil {
+ return err
+ }
+ repo, err := cloneRepo(installFlags.repoAddr, signer)
+ if err != nil {
+ return err
+ }
+ _, err = installer.NewAppManager(repo, signer)
+ if err != nil {
+ return err
+ }
+ // TODO(gio): start server
+ return nil
+}
diff --git a/core/installer/cmd/apps.go b/core/installer/cmd/apps.go
index b96ac6f..0a58be2 100644
--- a/core/installer/cmd/apps.go
+++ b/core/installer/cmd/apps.go
@@ -1,28 +1,22 @@
package main
import (
- "fmt"
- "io/ioutil"
"net"
"os"
- "time"
"github.com/giolekva/pcloud/core/installer"
"github.com/go-git/go-billy/v5/memfs"
"github.com/go-git/go-git/v5"
- "github.com/go-git/go-git/v5/plumbing/object"
gitssh "github.com/go-git/go-git/v5/plumbing/transport/ssh"
"github.com/go-git/go-git/v5/storage/memory"
"github.com/spf13/cobra"
"golang.org/x/crypto/ssh"
- "sigs.k8s.io/yaml"
)
const appDirName = "apps"
var installFlags struct {
sshKey string
- config string
appName string
repoAddr string
}
@@ -39,12 +33,6 @@
"",
)
cmd.Flags().StringVar(
- &installFlags.config,
- "config",
- "",
- "",
- )
- cmd.Flags().StringVar(
&installFlags.appName,
"app",
"",
@@ -59,30 +47,7 @@
return cmd
}
-type inMemoryAppRepository struct {
- apps []installer.App
-}
-
-func NewInMemoryAppRepository(apps []installer.App) installer.AppRepository {
- return &inMemoryAppRepository{
- apps,
- }
-}
-
-func (r inMemoryAppRepository) Find(name string) (*installer.App, error) {
- for _, a := range r.apps {
- if a.Name == name {
- return &a, nil
- }
- }
- return nil, fmt.Errorf("Application not found: %s", name)
-}
-
func installCmdRun(cmd *cobra.Command, args []string) error {
- cfg, err := readConfig(installFlags.config)
- if err != nil {
- return err
- }
sshKey, err := os.ReadFile(installFlags.sshKey)
if err != nil {
return err
@@ -95,58 +60,19 @@
if err != nil {
return err
}
- wt, err := repo.Worktree()
- if err != nil {
- return err
- }
- appRoot, err := wt.Filesystem.Chroot(appDirName)
- if err != nil {
- return err
- }
m, err := installer.NewAppManager(
- appRoot,
- cfg,
- NewInMemoryAppRepository(installer.CreateAllApps()),
+ repo,
+ signer,
)
if err != nil {
return err
}
- if err := m.Install(installFlags.appName); err != nil {
- return err
- }
- if st, err := wt.Status(); err != nil {
- return err
- } else {
- fmt.Printf("%+v\n", st)
- }
- wt.AddGlob("*")
- if st, err := wt.Status(); err != nil {
- return err
- } else {
- fmt.Printf("%+v\n", st)
- }
- if _, err := wt.Commit(fmt.Sprintf("install: %s", installFlags.appName), &git.CommitOptions{
- Author: &object.Signature{
- Name: "pcloud-appmanager",
- When: time.Now(),
- },
- }); err != nil {
- return err
- }
- return repo.Push(&git.PushOptions{
- RemoteName: "origin",
- Auth: auth(signer),
- })
-}
-
-func readConfig(config string) (installer.Config, error) {
- var cfg installer.Config
- inp, err := ioutil.ReadFile(config)
+ appRepo := installer.NewInMemoryAppRepository(installer.CreateAllApps())
+ app, err := appRepo.Find(installFlags.appName)
if err != nil {
- return cfg, err
+ return err
}
- err = yaml.UnmarshalStrict(inp, &cfg)
- return cfg, err
+ return m.Install(*app)
}
func cloneRepo(address string, signer ssh.Signer) (*git.Repository, error) {