blob: a6521d8f7c4b1dc2611280ba1b6dcb5ecdfd7e63 [file] [log] [blame]
gio0eaf2712024-04-14 13:08:46 +04001package main
2
3import (
gioa60f0de2024-07-08 10:49:48 +04004 "database/sql"
gio0eaf2712024-04-14 13:08:46 +04005 "encoding/json"
gio0eaf2712024-04-14 13:08:46 +04006 "log"
7 "os"
8
9 "github.com/giolekva/pcloud/core/installer"
10 "github.com/giolekva/pcloud/core/installer/soft"
11 "github.com/giolekva/pcloud/core/installer/welcome"
12
gioa60f0de2024-07-08 10:49:48 +040013 _ "github.com/ncruces/go-sqlite3"
14 _ "github.com/ncruces/go-sqlite3/driver"
15 _ "github.com/ncruces/go-sqlite3/embed"
gio0eaf2712024-04-14 13:08:46 +040016 "github.com/spf13/cobra"
17)
18
19var dodoAppFlags struct {
gio266c04f2024-07-03 14:18:45 +040020 port int
gioa60f0de2024-07-08 10:49:48 +040021 apiPort int
gio266c04f2024-07-03 14:18:45 +040022 sshKey string
23 repoAddr string
24 self string
25 namespace string
26 envConfig string
27 appAdminKey string
28 gitRepoPublicKey string
gioa60f0de2024-07-08 10:49:48 +040029 db string
gio0eaf2712024-04-14 13:08:46 +040030}
31
32func dodoAppCmd() *cobra.Command {
33 cmd := &cobra.Command{
34 Use: "dodo-app",
35 RunE: dodoAppCmdRun,
36 }
37 cmd.Flags().IntVar(
38 &dodoAppFlags.port,
39 "port",
40 8080,
41 "",
42 )
gioa60f0de2024-07-08 10:49:48 +040043 cmd.Flags().IntVar(
44 &dodoAppFlags.apiPort,
45 "api-port",
46 8081,
47 "",
48 )
49 cmd.Flags().StringVar(
50 &dodoAppFlags.db,
51 "db",
52 "",
53 "",
54 )
gio0eaf2712024-04-14 13:08:46 +040055 cmd.Flags().StringVar(
56 &dodoAppFlags.repoAddr,
57 "repo-addr",
58 "",
59 "",
60 )
61 cmd.Flags().StringVar(
62 &dodoAppFlags.sshKey,
63 "ssh-key",
64 "",
65 "",
66 )
67 cmd.Flags().StringVar(
68 &dodoAppFlags.self,
69 "self",
70 "",
71 "",
72 )
73 cmd.Flags().StringVar(
74 &dodoAppFlags.namespace,
75 "namespace",
76 "",
77 "",
78 )
79 cmd.Flags().StringVar(
80 &dodoAppFlags.envConfig,
81 "env-config",
82 "",
83 "",
84 )
gio266c04f2024-07-03 14:18:45 +040085 cmd.Flags().StringVar(
86 &dodoAppFlags.appAdminKey,
87 "app-admin-key",
88 "",
89 "",
90 )
91 cmd.Flags().StringVar(
92 &dodoAppFlags.gitRepoPublicKey,
93 "git-repo-public-key",
94 "",
95 "",
96 )
gio0eaf2712024-04-14 13:08:46 +040097 return cmd
98}
99
100func dodoAppCmdRun(cmd *cobra.Command, args []string) error {
gioa60f0de2024-07-08 10:49:48 +0400101 sshKey, err := os.ReadFile(dodoAppFlags.sshKey)
102 if err != nil {
103 return err
104 }
gio0eaf2712024-04-14 13:08:46 +0400105 envConfig, err := os.Open(dodoAppFlags.envConfig)
106 if err != nil {
107 return err
108 }
109 defer envConfig.Close()
110 var env installer.EnvConfig
111 if err := json.NewDecoder(envConfig).Decode(&env); err != nil {
112 return err
113 }
gio33059762024-07-05 13:19:07 +0400114 cg := soft.RealClientGetter{}
115 softClient, err := cg.Get(dodoAppFlags.repoAddr, sshKey, log.Default())
gio0eaf2712024-04-14 13:08:46 +0400116 if err != nil {
117 return err
118 }
giof8843412024-05-22 16:38:05 +0400119 jc, err := newJobCreator()
120 if err != nil {
121 return err
122 }
gio33059762024-07-05 13:19:07 +0400123 nsc, err := newNSCreator()
124 if err != nil {
gio266c04f2024-07-03 14:18:45 +0400125 return err
126 }
gioa60f0de2024-07-08 10:49:48 +0400127 if ok, err := softClient.RepoExists(welcome.ConfigRepoName); err != nil {
128 return err
129 } else if !ok {
130 if err := softClient.AddRepository(welcome.ConfigRepoName); err != nil {
131 return err
132 }
133 }
134 configRepo, err := softClient.GetRepo(welcome.ConfigRepoName)
135 if err != nil {
136 return err
137 }
138 db, err := sql.Open("sqlite3", dodoAppFlags.db)
139 if err != nil {
140 return err
141 }
142 st, err := welcome.NewStore(configRepo, db)
143 if err != nil {
144 return err
145 }
gio9d66f322024-07-06 13:45:10 +0400146 s, err := welcome.NewDodoAppServer(
gioa60f0de2024-07-08 10:49:48 +0400147 st,
gio33059762024-07-05 13:19:07 +0400148 dodoAppFlags.port,
gioa60f0de2024-07-08 10:49:48 +0400149 dodoAppFlags.apiPort,
gio33059762024-07-05 13:19:07 +0400150 dodoAppFlags.self,
151 string(sshKey),
152 dodoAppFlags.gitRepoPublicKey,
153 softClient,
154 dodoAppFlags.namespace,
155 nsc,
156 jc,
157 env,
158 )
gio9d66f322024-07-06 13:45:10 +0400159 if err != nil {
160 return err
161 }
gio33059762024-07-05 13:19:07 +0400162 if dodoAppFlags.appAdminKey != "" {
gio81246f02024-07-10 12:02:15 +0400163 if _, err := s.CreateApp("app", dodoAppFlags.appAdminKey); err != nil {
gio0eaf2712024-04-14 13:08:46 +0400164 return err
165 }
gio0eaf2712024-04-14 13:08:46 +0400166 }
gio0eaf2712024-04-14 13:08:46 +0400167 return s.Start()
168}