blob: f61ee78fbc13036273ddf5c2c56d52f4ee18a523 [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"
gio43b0f422024-08-21 10:40:13 +040011 "github.com/giolekva/pcloud/core/installer/tasks"
gio0eaf2712024-04-14 13:08:46 +040012 "github.com/giolekva/pcloud/core/installer/welcome"
13
gioa60f0de2024-07-08 10:49:48 +040014 _ "github.com/ncruces/go-sqlite3"
15 _ "github.com/ncruces/go-sqlite3/driver"
16 _ "github.com/ncruces/go-sqlite3/embed"
gio0eaf2712024-04-14 13:08:46 +040017 "github.com/spf13/cobra"
18)
19
20var dodoAppFlags struct {
gio11617ac2024-07-15 16:09:04 +040021 external bool
giocb34ad22024-07-11 08:01:13 +040022 port int
23 apiPort int
24 sshKey string
25 repoAddr string
26 self string
gio11617ac2024-07-15 16:09:04 +040027 repoPublicAddr string
giocb34ad22024-07-11 08:01:13 +040028 namespace string
29 envAppManagerAddr string
30 envConfig string
giocb34ad22024-07-11 08:01:13 +040031 gitRepoPublicKey string
32 db string
gio23bdc1b2024-07-11 16:07:47 +040033 networks []string
giocafd4e62024-07-31 10:53:40 +040034 fetchUsersAddr string
gio0eaf2712024-04-14 13:08:46 +040035}
36
37func dodoAppCmd() *cobra.Command {
38 cmd := &cobra.Command{
39 Use: "dodo-app",
40 RunE: dodoAppCmdRun,
41 }
gio11617ac2024-07-15 16:09:04 +040042 cmd.Flags().BoolVar(
43 &dodoAppFlags.external,
44 "external",
45 false,
46 "",
47 )
gio0eaf2712024-04-14 13:08:46 +040048 cmd.Flags().IntVar(
49 &dodoAppFlags.port,
50 "port",
51 8080,
52 "",
53 )
gioa60f0de2024-07-08 10:49:48 +040054 cmd.Flags().IntVar(
55 &dodoAppFlags.apiPort,
56 "api-port",
57 8081,
58 "",
59 )
60 cmd.Flags().StringVar(
61 &dodoAppFlags.db,
62 "db",
63 "",
64 "",
65 )
gio0eaf2712024-04-14 13:08:46 +040066 cmd.Flags().StringVar(
67 &dodoAppFlags.repoAddr,
68 "repo-addr",
69 "",
70 "",
71 )
72 cmd.Flags().StringVar(
73 &dodoAppFlags.sshKey,
74 "ssh-key",
75 "",
76 "",
77 )
78 cmd.Flags().StringVar(
79 &dodoAppFlags.self,
80 "self",
81 "",
82 "",
83 )
84 cmd.Flags().StringVar(
giocafd4e62024-07-31 10:53:40 +040085 &dodoAppFlags.fetchUsersAddr,
86 "fetch-users-addr",
87 "",
88 "",
89 )
90 cmd.Flags().StringVar(
gio11617ac2024-07-15 16:09:04 +040091 &dodoAppFlags.repoPublicAddr,
92 "repo-public-addr",
93 "",
94 "",
95 )
96 cmd.Flags().StringVar(
gio0eaf2712024-04-14 13:08:46 +040097 &dodoAppFlags.namespace,
98 "namespace",
99 "",
100 "",
101 )
102 cmd.Flags().StringVar(
giocb34ad22024-07-11 08:01:13 +0400103 &dodoAppFlags.envAppManagerAddr,
104 "env-app-manager-addr",
105 "",
106 "",
107 )
108 cmd.Flags().StringVar(
gio0eaf2712024-04-14 13:08:46 +0400109 &dodoAppFlags.envConfig,
110 "env-config",
111 "",
112 "",
113 )
gio266c04f2024-07-03 14:18:45 +0400114 cmd.Flags().StringVar(
gio266c04f2024-07-03 14:18:45 +0400115 &dodoAppFlags.gitRepoPublicKey,
116 "git-repo-public-key",
117 "",
118 "",
119 )
gio23bdc1b2024-07-11 16:07:47 +0400120 cmd.Flags().StringSliceVar(
121 &dodoAppFlags.networks,
122 "networks",
123 []string{},
124 "",
125 )
gio0eaf2712024-04-14 13:08:46 +0400126 return cmd
127}
128
129func dodoAppCmdRun(cmd *cobra.Command, args []string) error {
gioa60f0de2024-07-08 10:49:48 +0400130 sshKey, err := os.ReadFile(dodoAppFlags.sshKey)
131 if err != nil {
132 return err
133 }
gio0eaf2712024-04-14 13:08:46 +0400134 envConfig, err := os.Open(dodoAppFlags.envConfig)
135 if err != nil {
136 return err
137 }
138 defer envConfig.Close()
139 var env installer.EnvConfig
140 if err := json.NewDecoder(envConfig).Decode(&env); err != nil {
141 return err
142 }
gio33059762024-07-05 13:19:07 +0400143 cg := soft.RealClientGetter{}
144 softClient, err := cg.Get(dodoAppFlags.repoAddr, sshKey, log.Default())
gio0eaf2712024-04-14 13:08:46 +0400145 if err != nil {
146 return err
147 }
giof8843412024-05-22 16:38:05 +0400148 jc, err := newJobCreator()
149 if err != nil {
150 return err
151 }
gio33059762024-07-05 13:19:07 +0400152 nsc, err := newNSCreator()
153 if err != nil {
gio266c04f2024-07-03 14:18:45 +0400154 return err
155 }
gioa60f0de2024-07-08 10:49:48 +0400156 if ok, err := softClient.RepoExists(welcome.ConfigRepoName); err != nil {
157 return err
158 } else if !ok {
159 if err := softClient.AddRepository(welcome.ConfigRepoName); err != nil {
160 return err
161 }
162 }
163 configRepo, err := softClient.GetRepo(welcome.ConfigRepoName)
164 if err != nil {
165 return err
166 }
167 db, err := sql.Open("sqlite3", dodoAppFlags.db)
168 if err != nil {
169 return err
170 }
171 st, err := welcome.NewStore(configRepo, db)
172 if err != nil {
173 return err
174 }
gio11617ac2024-07-15 16:09:04 +0400175 var nf welcome.NetworkFilter
176 if len(dodoAppFlags.networks) == 0 {
177 nf = welcome.NewNoNetworkFilter()
178 } else {
179 nf = welcome.NewAllowListFilter(dodoAppFlags.networks)
180 }
181 if dodoAppFlags.external {
182 nf = welcome.NewCombinedFilter(welcome.NewNetworkFilterByOwner(st), nf)
183 }
184 var ug welcome.UserGetter
185 if dodoAppFlags.external {
186 ug = welcome.NewExternalUserGetter()
187 } else {
188 ug = welcome.NewInternalUserGetter()
189 }
gio43b0f422024-08-21 10:40:13 +0400190 reconciler := &tasks.SequentialReconciler{
191 []tasks.Reconciler{
192 &tasks.SourceGitReconciler{},
193 // &tasks.KustomizationReconciler{},
194 },
195 }
gio9d66f322024-07-06 13:45:10 +0400196 s, err := welcome.NewDodoAppServer(
gioa60f0de2024-07-08 10:49:48 +0400197 st,
gio11617ac2024-07-15 16:09:04 +0400198 nf,
199 ug,
gio33059762024-07-05 13:19:07 +0400200 dodoAppFlags.port,
gioa60f0de2024-07-08 10:49:48 +0400201 dodoAppFlags.apiPort,
gio33059762024-07-05 13:19:07 +0400202 dodoAppFlags.self,
gio11617ac2024-07-15 16:09:04 +0400203 dodoAppFlags.repoPublicAddr,
gio33059762024-07-05 13:19:07 +0400204 string(sshKey),
205 dodoAppFlags.gitRepoPublicKey,
206 softClient,
207 dodoAppFlags.namespace,
giocb34ad22024-07-11 08:01:13 +0400208 dodoAppFlags.envAppManagerAddr,
gio33059762024-07-05 13:19:07 +0400209 nsc,
210 jc,
211 env,
giocafd4e62024-07-31 10:53:40 +0400212 dodoAppFlags.external,
213 dodoAppFlags.fetchUsersAddr,
gio43b0f422024-08-21 10:40:13 +0400214 reconciler,
gio33059762024-07-05 13:19:07 +0400215 )
gio9d66f322024-07-06 13:45:10 +0400216 if err != nil {
217 return err
218 }
gio0eaf2712024-04-14 13:08:46 +0400219 return s.Start()
220}