@@ -3,21 +3,16 @@ package main
33import (
44 "context"
55 "flag"
6- "fmt"
76 "log"
87 "math/rand"
98 "net/http"
109 "os"
1110 "strings"
12- "syscall"
1311 "time"
1412
1513 "berty.tech/yolo/v2/go/pkg/bintray"
16- "berty.tech/yolo/v2/go/pkg/yolopb"
17- "berty.tech/yolo/v2/go/pkg/yolosvc"
1814 "go.uber.org/zap"
1915 "golang.org/x/oauth2"
20- "moul.io/godev"
2116 "moul.io/hcfilters"
2217 "moul.io/zapconfig"
2318
@@ -29,11 +24,16 @@ import (
2924 "github.com/jinzhu/gorm"
3025 _ "github.com/jinzhu/gorm/dialects/sqlite"
3126 circleci "github.com/jszwedko/go-circleci"
32- "github.com/oklog/run"
3327 "github.com/peterbourgon/diskv"
3428 ff "github.com/peterbourgon/ff/v2"
3529 "github.com/peterbourgon/ff/v2/ffcli"
36- "github.com/tevino/abool"
30+ )
31+
32+ var (
33+ verbose bool
34+ logFormat string
35+ dbStorePath string
36+ withPreloading bool
3737)
3838
3939func main () {
@@ -46,312 +46,22 @@ func main() {
4646
4747func yolo (args []string ) error {
4848 log .SetFlags (0 )
49- var (
50- verbose bool
51- logFormat string
52- devMode bool
53- withCache bool
54- maxBuilds int
55- buildkiteToken string
56- githubToken string
57- githubRepos string
58- bintrayUsername string
59- bintrayToken string
60- artifactsCachePath string
61- circleciToken string
62- dbStorePath string
63- withPreloading bool
64- grpcBind string
65- httpBind string
66- corsAllowedOrigins string
67- requestTimeout time.Duration
68- shutdownTimeout time.Duration
69- basicAuth string
70- authSalt string
71- httpCachePath string
72- realm string
73- once bool
74- iosPrivkeyPath string
75- iosProvPath string
76- iosPrivkeyPass string
77- )
78- var (
79- rootFlagSet = flag .NewFlagSet ("yolo" , flag .ExitOnError )
80- serverFlagSet = flag .NewFlagSet ("server" , flag .ExitOnError )
81- storeFlagSet = flag .NewFlagSet ("store" , flag .ExitOnError )
82- )
49+ rootFlagSet := flag .NewFlagSet ("yolo" , flag .ExitOnError )
8350 rand .Seed (time .Now ().UnixNano ())
8451 rootFlagSet .SetOutput (os .Stderr )
8552 rootFlagSet .BoolVar (& verbose , "v" , false , "increase log verbosity" )
8653 rootFlagSet .StringVar (& logFormat , "log-format" , "console" , strings .Join (zapconfig .AvailablePresets , ", " ))
87- serverFlagSet .BoolVar (& devMode , "dev-mode" , false , "enable insecure helpers" )
88- serverFlagSet .BoolVar (& withCache , "with-cache" , false , "enable API caching" )
89- serverFlagSet .StringVar (& buildkiteToken , "buildkite-token" , "" , "BuildKite API Token" )
90- serverFlagSet .StringVar (& bintrayUsername , "bintray-username" , "" , "Bintray username" )
91- serverFlagSet .StringVar (& bintrayToken , "bintray-token" , "" , "Bintray API Token" )
92- serverFlagSet .StringVar (& circleciToken , "circleci-token" , "" , "CircleCI API Token" )
93- serverFlagSet .StringVar (& githubToken , "github-token" , "" , "GitHub API Token" )
94- serverFlagSet .StringVar (& githubRepos , "github-repos" , "berty/berty" , "GitHub repositories to watch" )
95- serverFlagSet .StringVar (& dbStorePath , "db-path" , ":memory:" , "DB Store path" )
96- serverFlagSet .StringVar (& artifactsCachePath , "artifacts-cache-path" , "" , "Artifacts caching path" )
97- serverFlagSet .IntVar (& maxBuilds , "max-builds" , 100 , "maximum builds to fetch from external services (pagination)" )
98- serverFlagSet .StringVar (& httpBind , "http-bind" , ":8000" , "HTTP bind address" )
99- serverFlagSet .StringVar (& grpcBind , "grpc-bind" , ":9000" , "gRPC bind address" )
100- serverFlagSet .StringVar (& corsAllowedOrigins , "cors-allowed-origins" , "" , "CORS allowed origins (*.domain.tld)" )
101- serverFlagSet .DurationVar (& requestTimeout , "request-timeout" , 5 * time .Second , "request timeout" )
102- serverFlagSet .DurationVar (& shutdownTimeout , "shutdown-timeout" , 6 * time .Second , "server shutdown timeout" )
103- serverFlagSet .StringVar (& basicAuth , "basic-auth-password" , "" , "if set, enables basic authentication" )
104- serverFlagSet .StringVar (& realm , "realm" , "Yolo" , "authentication Realm" )
105- serverFlagSet .StringVar (& authSalt , "auth-salt" , "" , "salt used to generate authentication tokens at the end of the URLs" )
106- serverFlagSet .StringVar (& httpCachePath , "http-cache-path" , "" , "if set, will cache http client requests" )
107- serverFlagSet .BoolVar (& once , "once" , false , "just run workers once" )
108- serverFlagSet .StringVar (& iosPrivkeyPath , "ios-privkey" , "" , "iOS signing: path to private key or p12 file (PEM or DER format)" )
109- serverFlagSet .StringVar (& iosProvPath , "ios-prov" , "" , "iOS signing: path to mobile provisioning profile" )
110- serverFlagSet .StringVar (& iosPrivkeyPass , "ios-pass" , "" , "iOS signing: password for private key or p12 file" )
111- storeFlagSet .StringVar (& dbStorePath , "db-path" , ":memory:" , "DB Store path" )
112- storeFlagSet .BoolVar (& withPreloading , "with-preloading" , false , "with auto DB preloading" )
113-
114- server := & ffcli.Command {
115- Name : `server` ,
116- ShortHelp : `Start a Yolo Server` ,
117- FlagSet : serverFlagSet ,
118- Options : []ff.Option {ff .WithEnvVarNoPrefix ()},
119- Exec : func (ctx context.Context , _ []string ) error {
120- logger , err := loggerFromArgs (verbose , logFormat )
121- if err != nil {
122- return err
123- }
124- ctx , cancel := context .WithCancel (ctx )
125- defer cancel ()
126-
127- roundTripper , rtCloser := roundTripperFromArgs (ctx , httpCachePath , logger )
128- defer rtCloser ()
129- http .DefaultTransport = roundTripper
130-
131- db , err := dbFromArgs (dbStorePath , logger )
132- if err != nil {
133- return err
134- }
135- defer db .Close ()
136-
137- gr := run.Group {}
138- gr .Add (run .SignalHandler (ctx , syscall .SIGKILL , syscall .SIGTERM ))
139-
140- cc := abool .New () // clear cache signal
141-
142- // service conns
143- var bkc * buildkite.Client
144- if buildkiteToken != "" {
145- bkc , err = buildkiteClientFromArgs (buildkiteToken )
146- if err != nil {
147- return err
148- }
149- }
150- var ccc * circleci.Client
151- if circleciToken != "" {
152- ccc , err = circleciClientFromArgs (circleciToken )
153- if err != nil {
154- return err
155- }
156- }
157- var btc * bintray.Client
158- if bintrayToken != "" && bintrayUsername != "" {
159- btc , err = bintrayClientFromArgs (bintrayUsername , bintrayToken , logger )
160- if err != nil {
161- return err
162- }
163- }
164- ghc , err := githubClientFromArgs (githubToken )
165- if err != nil {
166- return err
167- }
168-
169- if devMode {
170- logger .Warn ("--dev-mode: insecure helpers are enabled" )
171- }
172-
173- if artifactsCachePath != "" {
174- if err := os .MkdirAll (artifactsCachePath , 0o755 ); err != nil {
175- return err
176- }
177- }
178-
179- // service
180- svc , err := yolosvc .NewService (db , yolosvc.ServiceOpts {
181- Logger : logger ,
182- BuildkiteClient : bkc ,
183- CircleciClient : ccc ,
184- BintrayClient : btc ,
185- GithubClient : ghc ,
186- AuthSalt : authSalt ,
187- DevMode : devMode ,
188- ArtifactsCachePath : artifactsCachePath ,
189- IOSPrivkeyPath : iosPrivkeyPath ,
190- IOSProvPath : iosProvPath ,
191- IOSPrivkeyPass : iosPrivkeyPass ,
192- })
193- if err != nil {
194- return err
195- }
196-
197- // service workers
198- if bkc != nil {
199- opts := yolosvc.BuildkiteWorkerOpts {Logger : logger , MaxBuilds : maxBuilds , ClearCache : cc , Once : once }
200- gr .Add (func () error { return svc .BuildkiteWorker (ctx , opts ) }, func (_ error ) { cancel () })
201- }
202- if ccc != nil {
203- opts := yolosvc.CircleciWorkerOpts {Logger : logger , MaxBuilds : maxBuilds , ClearCache : cc , Once : once }
204- gr .Add (func () error { return svc .CircleciWorker (ctx , opts ) }, func (_ error ) { cancel () })
205- }
206- if btc != nil {
207- opts := yolosvc.BintrayWorkerOpts {Logger : logger , ClearCache : cc , Once : once }
208- gr .Add (func () error { return svc .BintrayWorker (ctx , opts ) }, func (_ error ) { cancel () })
209- }
210- if ! once { // disable pkgman when running with --once
211- opts := yolosvc.PkgmanWorkerOpts {Logger : logger , ClearCache : cc , Once : once }
212- gr .Add (func () error { return svc .PkgmanWorker (ctx , opts ) }, func (_ error ) { cancel () })
213- }
214- if githubToken != "" {
215- opts := yolosvc.GithubWorkerOpts {Logger : logger , MaxBuilds : maxBuilds , ClearCache : cc , Once : once , ReposFilter : githubRepos , Token : githubToken }
216- gr .Add (func () error { return svc .GitHubWorker (ctx , opts ) }, func (_ error ) { cancel () })
217- }
218-
219- // server/API
220- server , err := yolosvc .NewServer (ctx , svc , yolosvc.ServerOpts {
221- Logger : logger ,
222- GRPCBind : grpcBind ,
223- HTTPBind : httpBind ,
224- RequestTimeout : requestTimeout ,
225- ShutdownTimeout : shutdownTimeout ,
226- CORSAllowedOrigins : corsAllowedOrigins ,
227- BasicAuth : basicAuth ,
228- Realm : realm ,
229- AuthSalt : authSalt ,
230- DevMode : devMode ,
231- WithCache : withCache ,
232- ClearCache : cc ,
233- })
234- if err != nil {
235- return err
236- }
237- gr .Add (func () error { return server .Start () }, func (_ error ) { server .Stop () })
238-
239- return gr .Run ()
240- },
241- }
242-
243- dumpObjects := & ffcli.Command {
244- Name : `dump-objects` ,
245- FlagSet : storeFlagSet ,
246- Options : []ff.Option {ff .WithEnvVarNoPrefix ()},
247- Exec : func (_ context.Context , _ []string ) error {
248- logger , err := loggerFromArgs (verbose , logFormat )
249- if err != nil {
250- return err
251- }
252- db , err := dbFromArgs (dbStorePath , logger )
253- if err != nil {
254- return err
255- }
256- defer db .Close ()
257-
258- svc , err := yolosvc .NewService (db , yolosvc.ServiceOpts {
259- Logger : logger ,
260- DevMode : true ,
261- })
262- if err != nil {
263- return err
264- }
26554
266- ctx := context .Background ()
267- input := & yolopb.DevDumpObjects_Request {
268- WithPreloading : true ,
269- }
270- ret , err := svc .DevDumpObjects (ctx , input )
271- if err != nil {
272- return err
273- }
274- fmt .Println (godev .PrettyJSONPB (ret ))
275-
276- return nil
55+ root := & ffcli.Command {
56+ ShortUsage : `server [flags] <subcommand>` ,
57+ FlagSet : rootFlagSet ,
58+ Subcommands : []* ffcli.Command {
59+ serverCommand (),
60+ dumpObjectsCommand (),
61+ infoCommand (),
62+ treeCommand (),
27763 },
278- }
279-
280- tree := & ffcli.Command {
281- Name : `tree` ,
282- FlagSet : storeFlagSet ,
28364 Options : []ff.Option {ff .WithEnvVarNoPrefix ()},
284- Exec : func (ctx context.Context , _ []string ) error {
285- logger , err := loggerFromArgs (verbose , logFormat )
286- if err != nil {
287- return err
288- }
289- db , err := dbFromArgs (dbStorePath , logger )
290- if err != nil {
291- return err
292- }
293- defer db .Close ()
294-
295- svc , err := yolosvc .NewService (db , yolosvc.ServiceOpts {
296- Logger : logger ,
297- DevMode : true ,
298- })
299- if err != nil {
300- return err
301- }
302-
303- input := & yolopb.DevDumpObjects_Request {
304- WithPreloading : true ,
305- }
306- ret , err := svc .DevDumpObjects (ctx , input )
307- if err != nil {
308- return err
309- }
310- fmt .Println (ret .Batch .DisplayTreeFormat ())
311-
312- return nil
313- },
314- }
315-
316- info := & ffcli.Command {
317- Name : `info` ,
318- FlagSet : storeFlagSet ,
319- Options : []ff.Option {ff .WithEnvVarNoPrefix ()},
320- Exec : func (_ context.Context , _ []string ) error {
321- logger , err := loggerFromArgs (verbose , logFormat )
322- if err != nil {
323- return err
324- }
325- db , err := dbFromArgs (dbStorePath , logger )
326- if err != nil {
327- return err
328- }
329- defer db .Close ()
330-
331- svc , err := yolosvc .NewService (db , yolosvc.ServiceOpts {
332- Logger : logger ,
333- DevMode : true ,
334- })
335- if err != nil {
336- return err
337- }
338-
339- ctx := context .Background ()
340- ret , err := svc .Status (ctx , nil )
341- if err != nil {
342- return err
343- }
344- fmt .Println (godev .PrettyJSONPB (ret ))
345-
346- return nil
347- },
348- }
349-
350- root := & ffcli.Command {
351- ShortUsage : `server [flags] <subcommand>` ,
352- FlagSet : rootFlagSet ,
353- Subcommands : []* ffcli.Command {server , dumpObjects , info , tree },
354- Options : []ff.Option {ff .WithEnvVarNoPrefix ()},
35565 Exec : func (_ context.Context , _ []string ) error {
35666 return flag .ErrHelp
35767 },
0 commit comments