blob: 5fc6e3e365d87d0046f20b4da8fea784e3fec799 [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
gio0eaf2712024-04-14 13:08:46 +040033}
34
35func dodoAppCmd() *cobra.Command {
36 cmd := &cobra.Command{
37 Use: "dodo-app",
38 RunE: dodoAppCmdRun,
39 }
gio11617ac2024-07-15 16:09:04 +040040 cmd.Flags().BoolVar(
41 &dodoAppFlags.external,
42 "external",
43 false,
44 "",
45 )
gio0eaf2712024-04-14 13:08:46 +040046 cmd.Flags().IntVar(
47 &dodoAppFlags.port,
48 "port",
49 8080,
50 "",
51 )
gioa60f0de2024-07-08 10:49:48 +040052 cmd.Flags().IntVar(
53 &dodoAppFlags.apiPort,
54 "api-port",
55 8081,
56 "",
57 )
58 cmd.Flags().StringVar(
59 &dodoAppFlags.db,
60 "db",
61 "",
62 "",
63 )
gio0eaf2712024-04-14 13:08:46 +040064 cmd.Flags().StringVar(
65 &dodoAppFlags.repoAddr,
66 "repo-addr",
67 "",
68 "",
69 )
70 cmd.Flags().StringVar(
71 &dodoAppFlags.sshKey,
72 "ssh-key",
73 "",
74 "",
75 )
76 cmd.Flags().StringVar(
77 &dodoAppFlags.self,
78 "self",
79 "",
80 "",
81 )
82 cmd.Flags().StringVar(
gio11617ac2024-07-15 16:09:04 +040083 &dodoAppFlags.repoPublicAddr,
84 "repo-public-addr",
85 "",
86 "",
87 )
88 cmd.Flags().StringVar(
gio0eaf2712024-04-14 13:08:46 +040089 &dodoAppFlags.namespace,
90 "namespace",
91 "",
92 "",
93 )
94 cmd.Flags().StringVar(
giocb34ad22024-07-11 08:01:13 +040095 &dodoAppFlags.envAppManagerAddr,
96 "env-app-manager-addr",
97 "",
98 "",
99 )
100 cmd.Flags().StringVar(
gio0eaf2712024-04-14 13:08:46 +0400101 &dodoAppFlags.envConfig,
102 "env-config",
103 "",
104 "",
105 )
gio266c04f2024-07-03 14:18:45 +0400106 cmd.Flags().StringVar(
gio266c04f2024-07-03 14:18:45 +0400107 &dodoAppFlags.gitRepoPublicKey,
108 "git-repo-public-key",
109 "",
110 "",
111 )
gio23bdc1b2024-07-11 16:07:47 +0400112 cmd.Flags().StringSliceVar(
113 &dodoAppFlags.networks,
114 "networks",
115 []string{},
116 "",
117 )
gio0eaf2712024-04-14 13:08:46 +0400118 return cmd
119}
120
121func dodoAppCmdRun(cmd *cobra.Command, args []string) error {
gioa60f0de2024-07-08 10:49:48 +0400122 sshKey, err := os.ReadFile(dodoAppFlags.sshKey)
123 if err != nil {
124 return err
125 }
gio0eaf2712024-04-14 13:08:46 +0400126 envConfig, err := os.Open(dodoAppFlags.envConfig)
127 if err != nil {
128 return err
129 }
130 defer envConfig.Close()
131 var env installer.EnvConfig
132 if err := json.NewDecoder(envConfig).Decode(&env); err != nil {
133 return err
134 }
gio33059762024-07-05 13:19:07 +0400135 cg := soft.RealClientGetter{}
136 softClient, err := cg.Get(dodoAppFlags.repoAddr, sshKey, log.Default())
gio0eaf2712024-04-14 13:08:46 +0400137 if err != nil {
138 return err
139 }
giof8843412024-05-22 16:38:05 +0400140 jc, err := newJobCreator()
141 if err != nil {
142 return err
143 }
gio33059762024-07-05 13:19:07 +0400144 nsc, err := newNSCreator()
145 if err != nil {
gio266c04f2024-07-03 14:18:45 +0400146 return err
147 }
gioa60f0de2024-07-08 10:49:48 +0400148 if ok, err := softClient.RepoExists(welcome.ConfigRepoName); err != nil {
149 return err
150 } else if !ok {
151 if err := softClient.AddRepository(welcome.ConfigRepoName); err != nil {
152 return err
153 }
154 }
155 configRepo, err := softClient.GetRepo(welcome.ConfigRepoName)
156 if err != nil {
157 return err
158 }
159 db, err := sql.Open("sqlite3", dodoAppFlags.db)
160 if err != nil {
161 return err
162 }
163 st, err := welcome.NewStore(configRepo, db)
164 if err != nil {
165 return err
166 }
gio11617ac2024-07-15 16:09:04 +0400167 var nf welcome.NetworkFilter
168 if len(dodoAppFlags.networks) == 0 {
169 nf = welcome.NewNoNetworkFilter()
170 } else {
171 nf = welcome.NewAllowListFilter(dodoAppFlags.networks)
172 }
173 if dodoAppFlags.external {
174 nf = welcome.NewCombinedFilter(welcome.NewNetworkFilterByOwner(st), nf)
175 }
176 var ug welcome.UserGetter
177 if dodoAppFlags.external {
178 ug = welcome.NewExternalUserGetter()
179 } else {
180 ug = welcome.NewInternalUserGetter()
181 }
gio9d66f322024-07-06 13:45:10 +0400182 s, err := welcome.NewDodoAppServer(
gioa60f0de2024-07-08 10:49:48 +0400183 st,
gio11617ac2024-07-15 16:09:04 +0400184 nf,
185 ug,
gio33059762024-07-05 13:19:07 +0400186 dodoAppFlags.port,
gioa60f0de2024-07-08 10:49:48 +0400187 dodoAppFlags.apiPort,
gio33059762024-07-05 13:19:07 +0400188 dodoAppFlags.self,
gio11617ac2024-07-15 16:09:04 +0400189 dodoAppFlags.repoPublicAddr,
gio33059762024-07-05 13:19:07 +0400190 string(sshKey),
191 dodoAppFlags.gitRepoPublicKey,
192 softClient,
193 dodoAppFlags.namespace,
giocb34ad22024-07-11 08:01:13 +0400194 dodoAppFlags.envAppManagerAddr,
gio33059762024-07-05 13:19:07 +0400195 nsc,
196 jc,
197 env,
198 )
gio9d66f322024-07-06 13:45:10 +0400199 if err != nil {
200 return err
201 }
gio0eaf2712024-04-14 13:08:46 +0400202 return s.Start()
203}