blob: ea5e7fda9501e4f16aa048a57a2f82222b9e75ab [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 {
giocb34ad22024-07-11 08:01:13 +040020 port int
21 apiPort int
22 sshKey string
23 repoAddr string
24 self string
25 namespace string
26 envAppManagerAddr string
27 envConfig string
28 appAdminKey string
29 gitRepoPublicKey string
30 db string
gio23bdc1b2024-07-11 16:07:47 +040031 networks []string
gio0eaf2712024-04-14 13:08:46 +040032}
33
34func dodoAppCmd() *cobra.Command {
35 cmd := &cobra.Command{
36 Use: "dodo-app",
37 RunE: dodoAppCmdRun,
38 }
39 cmd.Flags().IntVar(
40 &dodoAppFlags.port,
41 "port",
42 8080,
43 "",
44 )
gioa60f0de2024-07-08 10:49:48 +040045 cmd.Flags().IntVar(
46 &dodoAppFlags.apiPort,
47 "api-port",
48 8081,
49 "",
50 )
51 cmd.Flags().StringVar(
52 &dodoAppFlags.db,
53 "db",
54 "",
55 "",
56 )
gio0eaf2712024-04-14 13:08:46 +040057 cmd.Flags().StringVar(
58 &dodoAppFlags.repoAddr,
59 "repo-addr",
60 "",
61 "",
62 )
63 cmd.Flags().StringVar(
64 &dodoAppFlags.sshKey,
65 "ssh-key",
66 "",
67 "",
68 )
69 cmd.Flags().StringVar(
70 &dodoAppFlags.self,
71 "self",
72 "",
73 "",
74 )
75 cmd.Flags().StringVar(
76 &dodoAppFlags.namespace,
77 "namespace",
78 "",
79 "",
80 )
81 cmd.Flags().StringVar(
giocb34ad22024-07-11 08:01:13 +040082 &dodoAppFlags.envAppManagerAddr,
83 "env-app-manager-addr",
84 "",
85 "",
86 )
87 cmd.Flags().StringVar(
gio0eaf2712024-04-14 13:08:46 +040088 &dodoAppFlags.envConfig,
89 "env-config",
90 "",
91 "",
92 )
gio266c04f2024-07-03 14:18:45 +040093 cmd.Flags().StringVar(
94 &dodoAppFlags.appAdminKey,
95 "app-admin-key",
96 "",
97 "",
98 )
99 cmd.Flags().StringVar(
100 &dodoAppFlags.gitRepoPublicKey,
101 "git-repo-public-key",
102 "",
103 "",
104 )
gio23bdc1b2024-07-11 16:07:47 +0400105 cmd.Flags().StringSliceVar(
106 &dodoAppFlags.networks,
107 "networks",
108 []string{},
109 "",
110 )
gio0eaf2712024-04-14 13:08:46 +0400111 return cmd
112}
113
114func dodoAppCmdRun(cmd *cobra.Command, args []string) error {
gioa60f0de2024-07-08 10:49:48 +0400115 sshKey, err := os.ReadFile(dodoAppFlags.sshKey)
116 if err != nil {
117 return err
118 }
gio0eaf2712024-04-14 13:08:46 +0400119 envConfig, err := os.Open(dodoAppFlags.envConfig)
120 if err != nil {
121 return err
122 }
123 defer envConfig.Close()
124 var env installer.EnvConfig
125 if err := json.NewDecoder(envConfig).Decode(&env); err != nil {
126 return err
127 }
gio33059762024-07-05 13:19:07 +0400128 cg := soft.RealClientGetter{}
129 softClient, err := cg.Get(dodoAppFlags.repoAddr, sshKey, log.Default())
gio0eaf2712024-04-14 13:08:46 +0400130 if err != nil {
131 return err
132 }
giof8843412024-05-22 16:38:05 +0400133 jc, err := newJobCreator()
134 if err != nil {
135 return err
136 }
gio33059762024-07-05 13:19:07 +0400137 nsc, err := newNSCreator()
138 if err != nil {
gio266c04f2024-07-03 14:18:45 +0400139 return err
140 }
gioa60f0de2024-07-08 10:49:48 +0400141 if ok, err := softClient.RepoExists(welcome.ConfigRepoName); err != nil {
142 return err
143 } else if !ok {
144 if err := softClient.AddRepository(welcome.ConfigRepoName); err != nil {
145 return err
146 }
147 }
148 configRepo, err := softClient.GetRepo(welcome.ConfigRepoName)
149 if err != nil {
150 return err
151 }
152 db, err := sql.Open("sqlite3", dodoAppFlags.db)
153 if err != nil {
154 return err
155 }
156 st, err := welcome.NewStore(configRepo, db)
157 if err != nil {
158 return err
159 }
gio9d66f322024-07-06 13:45:10 +0400160 s, err := welcome.NewDodoAppServer(
gioa60f0de2024-07-08 10:49:48 +0400161 st,
gio33059762024-07-05 13:19:07 +0400162 dodoAppFlags.port,
gioa60f0de2024-07-08 10:49:48 +0400163 dodoAppFlags.apiPort,
gio33059762024-07-05 13:19:07 +0400164 dodoAppFlags.self,
165 string(sshKey),
166 dodoAppFlags.gitRepoPublicKey,
167 softClient,
168 dodoAppFlags.namespace,
giocb34ad22024-07-11 08:01:13 +0400169 dodoAppFlags.envAppManagerAddr,
gio23bdc1b2024-07-11 16:07:47 +0400170 dodoAppFlags.networks,
gio33059762024-07-05 13:19:07 +0400171 nsc,
172 jc,
173 env,
174 )
gio9d66f322024-07-06 13:45:10 +0400175 if err != nil {
176 return err
177 }
gio33059762024-07-05 13:19:07 +0400178 if dodoAppFlags.appAdminKey != "" {
gio23bdc1b2024-07-11 16:07:47 +0400179 if _, err := s.CreateApp("app", dodoAppFlags.appAdminKey, "Private"); err != nil {
gio0eaf2712024-04-14 13:08:46 +0400180 return err
181 }
gio0eaf2712024-04-14 13:08:46 +0400182 }
gio0eaf2712024-04-14 13:08:46 +0400183 return s.Start()
184}