installer: orginize bootstrapper, improve service IP handling
diff --git a/core/installer/cmd/welcome.go b/core/installer/cmd/welcome.go
index 6d2d7e0..0a38d13 100644
--- a/core/installer/cmd/welcome.go
+++ b/core/installer/cmd/welcome.go
@@ -1,18 +1,13 @@
 package main
 
 import (
-	"fmt"
 	"golang.org/x/crypto/ssh"
-	"net"
 	"os"
 
-	"github.com/go-git/go-billy/v5/memfs"
-	"github.com/go-git/go-git/v5"
-	gitssh "github.com/go-git/go-git/v5/plumbing/transport/ssh"
-	"github.com/go-git/go-git/v5/storage/memory"
 	"github.com/spf13/cobra"
 
 	"github.com/giolekva/pcloud/core/installer"
+	"github.com/giolekva/pcloud/core/installer/soft"
 	"github.com/giolekva/pcloud/core/installer/welcome"
 )
 
@@ -53,38 +48,27 @@
 	if err != nil {
 		return err
 	}
-	auth := authSSH(sshKey)
-	repo, err := git.Clone(memory.NewStorage(), memfs.New(), &git.CloneOptions{
-		URL:             welcomeFlags.repo,
-		Auth:            auth,
-		RemoteName:      "origin",
-		ReferenceName:   "refs/heads/master",
-		Depth:           1,
-		InsecureSkipTLS: true,
-		Progress:        os.Stdout,
-	})
+	signer, err := ssh.ParsePrivateKey(sshKey)
+	if err != nil {
+		return err
+	}
+	addr, err := soft.ParseRepositoryAddress(welcomeFlags.repo)
+	if err != nil {
+		return err
+	}
+	repo, err := soft.CloneRepo(addr, signer)
+	if err != nil {
+		return err
+	}
 	nsCreator, err := newNSCreator()
 	if err != nil {
 		return err
 	}
 	s := welcome.NewServer(
 		welcomeFlags.port,
-		installer.NewRepoIO(repo, auth.Signer),
+		installer.NewRepoIO(repo, signer),
 		nsCreator,
 	)
 	s.Start()
 	return nil
 }
-
-func authSSH(pemBytes []byte) *gitssh.PublicKeys {
-	a, err := gitssh.NewPublicKeys("git", pemBytes, "")
-	if err != nil {
-		panic(err)
-	}
-	a.HostKeyCallback = func(hostname string, remote net.Addr, key ssh.PublicKey) error {
-		// TODO(giolekva): verify server public key
-		fmt.Printf("--- %+v\n", ssh.MarshalAuthorizedKey(key))
-		return nil
-	}
-	return a
-}