blob: 2eb5b8f57397c06965c0fdb632283a10a9b145cb [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
gio0eaf2712024-04-14 13:08:46 +040031}
32
33func dodoAppCmd() *cobra.Command {
34 cmd := &cobra.Command{
35 Use: "dodo-app",
36 RunE: dodoAppCmdRun,
37 }
38 cmd.Flags().IntVar(
39 &dodoAppFlags.port,
40 "port",
41 8080,
42 "",
43 )
gioa60f0de2024-07-08 10:49:48 +040044 cmd.Flags().IntVar(
45 &dodoAppFlags.apiPort,
46 "api-port",
47 8081,
48 "",
49 )
50 cmd.Flags().StringVar(
51 &dodoAppFlags.db,
52 "db",
53 "",
54 "",
55 )
gio0eaf2712024-04-14 13:08:46 +040056 cmd.Flags().StringVar(
57 &dodoAppFlags.repoAddr,
58 "repo-addr",
59 "",
60 "",
61 )
62 cmd.Flags().StringVar(
63 &dodoAppFlags.sshKey,
64 "ssh-key",
65 "",
66 "",
67 )
68 cmd.Flags().StringVar(
69 &dodoAppFlags.self,
70 "self",
71 "",
72 "",
73 )
74 cmd.Flags().StringVar(
75 &dodoAppFlags.namespace,
76 "namespace",
77 "",
78 "",
79 )
80 cmd.Flags().StringVar(
giocb34ad22024-07-11 08:01:13 +040081 &dodoAppFlags.envAppManagerAddr,
82 "env-app-manager-addr",
83 "",
84 "",
85 )
86 cmd.Flags().StringVar(
gio0eaf2712024-04-14 13:08:46 +040087 &dodoAppFlags.envConfig,
88 "env-config",
89 "",
90 "",
91 )
gio266c04f2024-07-03 14:18:45 +040092 cmd.Flags().StringVar(
93 &dodoAppFlags.appAdminKey,
94 "app-admin-key",
95 "",
96 "",
97 )
98 cmd.Flags().StringVar(
99 &dodoAppFlags.gitRepoPublicKey,
100 "git-repo-public-key",
101 "",
102 "",
103 )
gio0eaf2712024-04-14 13:08:46 +0400104 return cmd
105}
106
107func dodoAppCmdRun(cmd *cobra.Command, args []string) error {
gioa60f0de2024-07-08 10:49:48 +0400108 sshKey, err := os.ReadFile(dodoAppFlags.sshKey)
109 if err != nil {
110 return err
111 }
gio0eaf2712024-04-14 13:08:46 +0400112 envConfig, err := os.Open(dodoAppFlags.envConfig)
113 if err != nil {
114 return err
115 }
116 defer envConfig.Close()
117 var env installer.EnvConfig
118 if err := json.NewDecoder(envConfig).Decode(&env); err != nil {
119 return err
120 }
gio33059762024-07-05 13:19:07 +0400121 cg := soft.RealClientGetter{}
122 softClient, err := cg.Get(dodoAppFlags.repoAddr, sshKey, log.Default())
gio0eaf2712024-04-14 13:08:46 +0400123 if err != nil {
124 return err
125 }
giof8843412024-05-22 16:38:05 +0400126 jc, err := newJobCreator()
127 if err != nil {
128 return err
129 }
gio33059762024-07-05 13:19:07 +0400130 nsc, err := newNSCreator()
131 if err != nil {
gio266c04f2024-07-03 14:18:45 +0400132 return err
133 }
gioa60f0de2024-07-08 10:49:48 +0400134 if ok, err := softClient.RepoExists(welcome.ConfigRepoName); err != nil {
135 return err
136 } else if !ok {
137 if err := softClient.AddRepository(welcome.ConfigRepoName); err != nil {
138 return err
139 }
140 }
141 configRepo, err := softClient.GetRepo(welcome.ConfigRepoName)
142 if err != nil {
143 return err
144 }
145 db, err := sql.Open("sqlite3", dodoAppFlags.db)
146 if err != nil {
147 return err
148 }
149 st, err := welcome.NewStore(configRepo, db)
150 if err != nil {
151 return err
152 }
gio9d66f322024-07-06 13:45:10 +0400153 s, err := welcome.NewDodoAppServer(
gioa60f0de2024-07-08 10:49:48 +0400154 st,
gio33059762024-07-05 13:19:07 +0400155 dodoAppFlags.port,
gioa60f0de2024-07-08 10:49:48 +0400156 dodoAppFlags.apiPort,
gio33059762024-07-05 13:19:07 +0400157 dodoAppFlags.self,
158 string(sshKey),
159 dodoAppFlags.gitRepoPublicKey,
160 softClient,
161 dodoAppFlags.namespace,
giocb34ad22024-07-11 08:01:13 +0400162 dodoAppFlags.envAppManagerAddr,
gio33059762024-07-05 13:19:07 +0400163 nsc,
164 jc,
165 env,
166 )
gio9d66f322024-07-06 13:45:10 +0400167 if err != nil {
168 return err
169 }
gio33059762024-07-05 13:19:07 +0400170 if dodoAppFlags.appAdminKey != "" {
gio81246f02024-07-10 12:02:15 +0400171 if _, err := s.CreateApp("app", dodoAppFlags.appAdminKey); err != nil {
gio0eaf2712024-04-14 13:08:46 +0400172 return err
173 }
gio0eaf2712024-04-14 13:08:46 +0400174 }
gio0eaf2712024-04-14 13:08:46 +0400175 return s.Start()
176}