blob: 20b8d262796c7ffa192d200a391f4c7934afb5a7 [file] [log] [blame]
Davit Tabidze207ce082024-04-09 19:15:25 +04001package main
2
3import (
4 "fmt"
gio09a3e5b2024-04-26 14:11:06 +04005 "log"
giodd213152024-09-27 11:26:59 +02006 "net/url"
Davit Tabidze56f86a42024-04-09 19:15:25 +04007 "os"
Davit Tabidze207ce082024-04-09 19:15:25 +04008
Davit Tabidze56f86a42024-04-09 19:15:25 +04009 "github.com/giolekva/pcloud/core/installer"
gio59946282024-10-07 12:55:51 +040010 "github.com/giolekva/pcloud/core/installer/server/launcher"
Davit Tabidze56f86a42024-04-09 19:15:25 +040011 "github.com/giolekva/pcloud/core/installer/soft"
gio09a3e5b2024-04-26 14:11:06 +040012
Davit Tabidze207ce082024-04-09 19:15:25 +040013 "github.com/spf13/cobra"
Davit Tabidze56f86a42024-04-09 19:15:25 +040014 "golang.org/x/crypto/ssh"
Davit Tabidze207ce082024-04-09 19:15:25 +040015)
16
17var launcherFlags struct {
giodd213152024-09-27 11:26:59 +020018 // TODO(gio): rename to auth-base-addr
Davit Tabidze563b6ad2024-06-11 13:38:56 +040019 logoutURL string
gio09a3e5b2024-04-26 14:11:06 +040020 port int
21 repoAddr string
22 sshKey string
Davit Tabidze207ce082024-04-09 19:15:25 +040023}
24
25func launcherCmd() *cobra.Command {
26 cmd := &cobra.Command{
27 Use: "launcher",
28 RunE: launcherCmdRun,
29 }
30 cmd.Flags().IntVar(
31 &launcherFlags.port,
32 "port",
33 8080,
34 "",
35 )
36 cmd.Flags().StringVar(
Davit Tabidze563b6ad2024-06-11 13:38:56 +040037 &launcherFlags.logoutURL,
Davit Tabidze207ce082024-04-09 19:15:25 +040038 "logout-url",
39 "",
40 "",
41 )
Davit Tabidze56f86a42024-04-09 19:15:25 +040042 cmd.Flags().StringVar(
43 &launcherFlags.repoAddr,
44 "repo-addr",
45 "",
46 "The address of the repository",
47 )
48 cmd.Flags().StringVar(
49 &launcherFlags.sshKey,
50 "ssh-key",
51 "",
52 "The path to the SSH key file",
53 )
Davit Tabidze207ce082024-04-09 19:15:25 +040054 return cmd
55}
56
57func launcherCmdRun(cmd *cobra.Command, args []string) error {
Davit Tabidze56f86a42024-04-09 19:15:25 +040058 sshKey, err := os.ReadFile(launcherFlags.sshKey)
59 if err != nil {
gio09a3e5b2024-04-26 14:11:06 +040060 return err
Davit Tabidze56f86a42024-04-09 19:15:25 +040061 }
62 signer, err := ssh.ParsePrivateKey(sshKey)
63 if err != nil {
gio09a3e5b2024-04-26 14:11:06 +040064 return err
Davit Tabidze56f86a42024-04-09 19:15:25 +040065 }
66 addr, err := soft.ParseRepositoryAddress(launcherFlags.repoAddr)
67 if err != nil {
68 return err
69 }
70 repo, err := soft.CloneRepository(addr, signer)
71 if err != nil {
gio09a3e5b2024-04-26 14:11:06 +040072 return err
Davit Tabidze56f86a42024-04-09 19:15:25 +040073 }
gio09a3e5b2024-04-26 14:11:06 +040074 log.Println("Cloned repository")
gioe72b54f2024-04-22 10:44:41 +040075 repoIO, err := soft.NewRepoIO(repo, signer)
Davit Tabidze56f86a42024-04-09 19:15:25 +040076 if err != nil {
gio09a3e5b2024-04-26 14:11:06 +040077 return err
Davit Tabidze56f86a42024-04-09 19:15:25 +040078 }
giof6ad2982024-08-23 17:42:49 +040079 appManager, err := installer.NewAppManager(repoIO, nil, nil, nil, nil, nil, "/apps")
Davit Tabidze56f86a42024-04-09 19:15:25 +040080 if err != nil {
gio09a3e5b2024-04-26 14:11:06 +040081 return err
Davit Tabidze56f86a42024-04-09 19:15:25 +040082 }
giodd213152024-09-27 11:26:59 +020083 authBaseAddr, err := url.Parse(launcherFlags.logoutURL)
84 if err != nil {
85 return err
86 }
gio59946282024-10-07 12:55:51 +040087 s, err := launcher.NewLauncherServer(
Davit Tabidze207ce082024-04-09 19:15:25 +040088 launcherFlags.port,
giodd213152024-09-27 11:26:59 +020089 fmt.Sprintf("https://%s", authBaseAddr.Host),
gio59946282024-10-07 12:55:51 +040090 &launcher.AppManagerDirectory{AppManager: appManager},
Davit Tabidze207ce082024-04-09 19:15:25 +040091 )
92 if err != nil {
93 return fmt.Errorf("failed to create LauncherServer: %v", err)
94 }
95 s.Start()
96 return nil
97}