blob: ef62f5c65256437f143652cd9f0c463d32d52ba1 [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 {
gio11617ac2024-07-15 16:09:04 +040020 external bool
giocb34ad22024-07-11 08:01:13 +040021 port int
22 apiPort int
23 sshKey string
24 repoAddr string
25 self string
gio11617ac2024-07-15 16:09:04 +040026 repoPublicAddr string
giocb34ad22024-07-11 08:01:13 +040027 namespace string
28 envAppManagerAddr string
29 envConfig string
giocb34ad22024-07-11 08:01:13 +040030 gitRepoPublicKey string
31 db string
gio23bdc1b2024-07-11 16:07:47 +040032 networks []string
giocafd4e62024-07-31 10:53:40 +040033 fetchUsersAddr string
gio0eaf2712024-04-14 13:08:46 +040034}
35
36func dodoAppCmd() *cobra.Command {
37 cmd := &cobra.Command{
38 Use: "dodo-app",
39 RunE: dodoAppCmdRun,
40 }
gio11617ac2024-07-15 16:09:04 +040041 cmd.Flags().BoolVar(
42 &dodoAppFlags.external,
43 "external",
44 false,
45 "",
46 )
gio0eaf2712024-04-14 13:08:46 +040047 cmd.Flags().IntVar(
48 &dodoAppFlags.port,
49 "port",
50 8080,
51 "",
52 )
gioa60f0de2024-07-08 10:49:48 +040053 cmd.Flags().IntVar(
54 &dodoAppFlags.apiPort,
55 "api-port",
56 8081,
57 "",
58 )
59 cmd.Flags().StringVar(
60 &dodoAppFlags.db,
61 "db",
62 "",
63 "",
64 )
gio0eaf2712024-04-14 13:08:46 +040065 cmd.Flags().StringVar(
66 &dodoAppFlags.repoAddr,
67 "repo-addr",
68 "",
69 "",
70 )
71 cmd.Flags().StringVar(
72 &dodoAppFlags.sshKey,
73 "ssh-key",
74 "",
75 "",
76 )
77 cmd.Flags().StringVar(
78 &dodoAppFlags.self,
79 "self",
80 "",
81 "",
82 )
83 cmd.Flags().StringVar(
giocafd4e62024-07-31 10:53:40 +040084 &dodoAppFlags.fetchUsersAddr,
85 "fetch-users-addr",
86 "",
87 "",
88 )
89 cmd.Flags().StringVar(
gio11617ac2024-07-15 16:09:04 +040090 &dodoAppFlags.repoPublicAddr,
91 "repo-public-addr",
92 "",
93 "",
94 )
95 cmd.Flags().StringVar(
gio0eaf2712024-04-14 13:08:46 +040096 &dodoAppFlags.namespace,
97 "namespace",
98 "",
99 "",
100 )
101 cmd.Flags().StringVar(
giocb34ad22024-07-11 08:01:13 +0400102 &dodoAppFlags.envAppManagerAddr,
103 "env-app-manager-addr",
104 "",
105 "",
106 )
107 cmd.Flags().StringVar(
gio0eaf2712024-04-14 13:08:46 +0400108 &dodoAppFlags.envConfig,
109 "env-config",
110 "",
111 "",
112 )
gio266c04f2024-07-03 14:18:45 +0400113 cmd.Flags().StringVar(
gio266c04f2024-07-03 14:18:45 +0400114 &dodoAppFlags.gitRepoPublicKey,
115 "git-repo-public-key",
116 "",
117 "",
118 )
gio23bdc1b2024-07-11 16:07:47 +0400119 cmd.Flags().StringSliceVar(
120 &dodoAppFlags.networks,
121 "networks",
122 []string{},
123 "",
124 )
gio0eaf2712024-04-14 13:08:46 +0400125 return cmd
126}
127
128func dodoAppCmdRun(cmd *cobra.Command, args []string) error {
gioa60f0de2024-07-08 10:49:48 +0400129 sshKey, err := os.ReadFile(dodoAppFlags.sshKey)
130 if err != nil {
131 return err
132 }
gio0eaf2712024-04-14 13:08:46 +0400133 envConfig, err := os.Open(dodoAppFlags.envConfig)
134 if err != nil {
135 return err
136 }
137 defer envConfig.Close()
138 var env installer.EnvConfig
139 if err := json.NewDecoder(envConfig).Decode(&env); err != nil {
140 return err
141 }
gio33059762024-07-05 13:19:07 +0400142 cg := soft.RealClientGetter{}
143 softClient, err := cg.Get(dodoAppFlags.repoAddr, sshKey, log.Default())
gio0eaf2712024-04-14 13:08:46 +0400144 if err != nil {
145 return err
146 }
giof8843412024-05-22 16:38:05 +0400147 jc, err := newJobCreator()
148 if err != nil {
149 return err
150 }
gio33059762024-07-05 13:19:07 +0400151 nsc, err := newNSCreator()
152 if err != nil {
gio266c04f2024-07-03 14:18:45 +0400153 return err
154 }
gioa60f0de2024-07-08 10:49:48 +0400155 if ok, err := softClient.RepoExists(welcome.ConfigRepoName); err != nil {
156 return err
157 } else if !ok {
158 if err := softClient.AddRepository(welcome.ConfigRepoName); err != nil {
159 return err
160 }
161 }
162 configRepo, err := softClient.GetRepo(welcome.ConfigRepoName)
163 if err != nil {
164 return err
165 }
166 db, err := sql.Open("sqlite3", dodoAppFlags.db)
167 if err != nil {
168 return err
169 }
170 st, err := welcome.NewStore(configRepo, db)
171 if err != nil {
172 return err
173 }
gio11617ac2024-07-15 16:09:04 +0400174 var nf welcome.NetworkFilter
175 if len(dodoAppFlags.networks) == 0 {
176 nf = welcome.NewNoNetworkFilter()
177 } else {
178 nf = welcome.NewAllowListFilter(dodoAppFlags.networks)
179 }
180 if dodoAppFlags.external {
181 nf = welcome.NewCombinedFilter(welcome.NewNetworkFilterByOwner(st), nf)
182 }
183 var ug welcome.UserGetter
184 if dodoAppFlags.external {
185 ug = welcome.NewExternalUserGetter()
186 } else {
187 ug = welcome.NewInternalUserGetter()
188 }
gio9d66f322024-07-06 13:45:10 +0400189 s, err := welcome.NewDodoAppServer(
gioa60f0de2024-07-08 10:49:48 +0400190 st,
gio11617ac2024-07-15 16:09:04 +0400191 nf,
192 ug,
gio33059762024-07-05 13:19:07 +0400193 dodoAppFlags.port,
gioa60f0de2024-07-08 10:49:48 +0400194 dodoAppFlags.apiPort,
gio33059762024-07-05 13:19:07 +0400195 dodoAppFlags.self,
gio11617ac2024-07-15 16:09:04 +0400196 dodoAppFlags.repoPublicAddr,
gio33059762024-07-05 13:19:07 +0400197 string(sshKey),
198 dodoAppFlags.gitRepoPublicKey,
199 softClient,
200 dodoAppFlags.namespace,
giocb34ad22024-07-11 08:01:13 +0400201 dodoAppFlags.envAppManagerAddr,
gio33059762024-07-05 13:19:07 +0400202 nsc,
203 jc,
204 env,
giocafd4e62024-07-31 10:53:40 +0400205 dodoAppFlags.external,
206 dodoAppFlags.fetchUsersAddr,
gio33059762024-07-05 13:19:07 +0400207 )
gio9d66f322024-07-06 13:45:10 +0400208 if err != nil {
209 return err
210 }
gio0eaf2712024-04-14 13:08:46 +0400211 return s.Start()
212}