blob: 2fe1697a3f96c8a0b7452b6592b93ac2cc75fdce [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
gio36b23b32024-08-25 12:20:54 +040035 headscaleAPIAddr string
gio0eaf2712024-04-14 13:08:46 +040036}
37
38func dodoAppCmd() *cobra.Command {
39 cmd := &cobra.Command{
40 Use: "dodo-app",
41 RunE: dodoAppCmdRun,
42 }
gio11617ac2024-07-15 16:09:04 +040043 cmd.Flags().BoolVar(
44 &dodoAppFlags.external,
45 "external",
46 false,
47 "",
48 )
gio0eaf2712024-04-14 13:08:46 +040049 cmd.Flags().IntVar(
50 &dodoAppFlags.port,
51 "port",
52 8080,
53 "",
54 )
gioa60f0de2024-07-08 10:49:48 +040055 cmd.Flags().IntVar(
56 &dodoAppFlags.apiPort,
57 "api-port",
58 8081,
59 "",
60 )
61 cmd.Flags().StringVar(
62 &dodoAppFlags.db,
63 "db",
64 "",
65 "",
66 )
gio0eaf2712024-04-14 13:08:46 +040067 cmd.Flags().StringVar(
68 &dodoAppFlags.repoAddr,
69 "repo-addr",
70 "",
71 "",
72 )
73 cmd.Flags().StringVar(
74 &dodoAppFlags.sshKey,
75 "ssh-key",
76 "",
77 "",
78 )
79 cmd.Flags().StringVar(
80 &dodoAppFlags.self,
81 "self",
82 "",
83 "",
84 )
85 cmd.Flags().StringVar(
giocafd4e62024-07-31 10:53:40 +040086 &dodoAppFlags.fetchUsersAddr,
87 "fetch-users-addr",
88 "",
89 "",
90 )
91 cmd.Flags().StringVar(
gio11617ac2024-07-15 16:09:04 +040092 &dodoAppFlags.repoPublicAddr,
93 "repo-public-addr",
94 "",
95 "",
96 )
97 cmd.Flags().StringVar(
gio0eaf2712024-04-14 13:08:46 +040098 &dodoAppFlags.namespace,
99 "namespace",
100 "",
101 "",
102 )
103 cmd.Flags().StringVar(
giocb34ad22024-07-11 08:01:13 +0400104 &dodoAppFlags.envAppManagerAddr,
105 "env-app-manager-addr",
106 "",
107 "",
108 )
109 cmd.Flags().StringVar(
gio0eaf2712024-04-14 13:08:46 +0400110 &dodoAppFlags.envConfig,
111 "env-config",
112 "",
113 "",
114 )
gio266c04f2024-07-03 14:18:45 +0400115 cmd.Flags().StringVar(
gio266c04f2024-07-03 14:18:45 +0400116 &dodoAppFlags.gitRepoPublicKey,
117 "git-repo-public-key",
118 "",
119 "",
120 )
gio23bdc1b2024-07-11 16:07:47 +0400121 cmd.Flags().StringSliceVar(
122 &dodoAppFlags.networks,
123 "networks",
124 []string{},
125 "",
126 )
gio36b23b32024-08-25 12:20:54 +0400127 cmd.Flags().StringVar(
128 &dodoAppFlags.headscaleAPIAddr,
129 "headscale-api-addr",
130 "",
131 "",
132 )
gio0eaf2712024-04-14 13:08:46 +0400133 return cmd
134}
135
136func dodoAppCmdRun(cmd *cobra.Command, args []string) error {
gioa60f0de2024-07-08 10:49:48 +0400137 sshKey, err := os.ReadFile(dodoAppFlags.sshKey)
138 if err != nil {
139 return err
140 }
gio0eaf2712024-04-14 13:08:46 +0400141 envConfig, err := os.Open(dodoAppFlags.envConfig)
142 if err != nil {
143 return err
144 }
145 defer envConfig.Close()
146 var env installer.EnvConfig
147 if err := json.NewDecoder(envConfig).Decode(&env); err != nil {
148 return err
149 }
gio33059762024-07-05 13:19:07 +0400150 cg := soft.RealClientGetter{}
151 softClient, err := cg.Get(dodoAppFlags.repoAddr, sshKey, log.Default())
gio0eaf2712024-04-14 13:08:46 +0400152 if err != nil {
153 return err
154 }
giof8843412024-05-22 16:38:05 +0400155 jc, err := newJobCreator()
156 if err != nil {
157 return err
158 }
gio33059762024-07-05 13:19:07 +0400159 nsc, err := newNSCreator()
160 if err != nil {
gio266c04f2024-07-03 14:18:45 +0400161 return err
162 }
gioa60f0de2024-07-08 10:49:48 +0400163 if ok, err := softClient.RepoExists(welcome.ConfigRepoName); err != nil {
164 return err
165 } else if !ok {
166 if err := softClient.AddRepository(welcome.ConfigRepoName); err != nil {
167 return err
168 }
169 }
170 configRepo, err := softClient.GetRepo(welcome.ConfigRepoName)
171 if err != nil {
172 return err
173 }
174 db, err := sql.Open("sqlite3", dodoAppFlags.db)
175 if err != nil {
176 return err
177 }
178 st, err := welcome.NewStore(configRepo, db)
179 if err != nil {
180 return err
181 }
gio11617ac2024-07-15 16:09:04 +0400182 var nf welcome.NetworkFilter
183 if len(dodoAppFlags.networks) == 0 {
184 nf = welcome.NewNoNetworkFilter()
185 } else {
186 nf = welcome.NewAllowListFilter(dodoAppFlags.networks)
187 }
188 if dodoAppFlags.external {
189 nf = welcome.NewCombinedFilter(welcome.NewNetworkFilterByOwner(st), nf)
190 }
191 var ug welcome.UserGetter
192 if dodoAppFlags.external {
193 ug = welcome.NewExternalUserGetter()
194 } else {
195 ug = welcome.NewInternalUserGetter()
196 }
gio43b0f422024-08-21 10:40:13 +0400197 reconciler := &tasks.SequentialReconciler{
198 []tasks.Reconciler{
199 &tasks.SourceGitReconciler{},
200 // &tasks.KustomizationReconciler{},
201 },
202 }
gio36b23b32024-08-25 12:20:54 +0400203 vpnKeyGen := installer.NewHeadscaleAPIClient(dodoAppFlags.headscaleAPIAddr)
gio9d66f322024-07-06 13:45:10 +0400204 s, err := welcome.NewDodoAppServer(
gioa60f0de2024-07-08 10:49:48 +0400205 st,
gio11617ac2024-07-15 16:09:04 +0400206 nf,
207 ug,
gio33059762024-07-05 13:19:07 +0400208 dodoAppFlags.port,
gioa60f0de2024-07-08 10:49:48 +0400209 dodoAppFlags.apiPort,
gio33059762024-07-05 13:19:07 +0400210 dodoAppFlags.self,
gio11617ac2024-07-15 16:09:04 +0400211 dodoAppFlags.repoPublicAddr,
gio33059762024-07-05 13:19:07 +0400212 string(sshKey),
213 dodoAppFlags.gitRepoPublicKey,
214 softClient,
215 dodoAppFlags.namespace,
giocb34ad22024-07-11 08:01:13 +0400216 dodoAppFlags.envAppManagerAddr,
gio33059762024-07-05 13:19:07 +0400217 nsc,
218 jc,
gio36b23b32024-08-25 12:20:54 +0400219 vpnKeyGen,
gio33059762024-07-05 13:19:07 +0400220 env,
giocafd4e62024-07-31 10:53:40 +0400221 dodoAppFlags.external,
222 dodoAppFlags.fetchUsersAddr,
gio43b0f422024-08-21 10:40:13 +0400223 reconciler,
gio33059762024-07-05 13:19:07 +0400224 )
gio9d66f322024-07-06 13:45:10 +0400225 if err != nil {
226 return err
227 }
gio0eaf2712024-04-14 13:08:46 +0400228 return s.Start()
229}