11package main
22
33import (
4+ "errors"
5+ "flag"
6+ "fmt"
7+ "io"
48 "os"
9+ "runtime/debug"
510 "time"
611
712 "github.com/gotify/server/v2/config"
13+ "github.com/gotify/server/v2/config/migrate"
814 "github.com/gotify/server/v2/database"
915 "github.com/gotify/server/v2/mode"
1016 "github.com/gotify/server/v2/model"
@@ -27,26 +33,83 @@ var (
2733)
2834
2935func main () {
30- log .Logger = log .Output (zerolog.ConsoleWriter {Out : os .Stdout , TimeFormat : time .RFC3339 , NoColor : noColor ()})
36+ os .Exit (run (os .Args [1 :], os .Stdout , os .Stderr ))
37+ }
3138
39+ func run (args []string , stdout , stderr io.Writer ) int {
3240 vInfo := & model.VersionInfo {Version : Version , Commit : Commit , BuildDate : BuildDate }
41+ fs := flag .NewFlagSet ("gotify" , flag .ContinueOnError )
42+ fs .SetOutput (stderr )
43+ fs .Usage = func () { printUsage (stderr ) }
44+ if err := fs .Parse (args ); err != nil {
45+ if errors .Is (err , flag .ErrHelp ) {
46+ return 0
47+ }
48+ return 2
49+ }
50+
51+ command := fs .Arg (0 )
52+ switch command {
53+ case "serve" , "" :
54+ return serve (vInfo )
55+ case "version" :
56+ fmt .Fprintln (stdout , "Version:" , vInfo .Version )
57+ fmt .Fprintln (stdout , "Commit:" , vInfo .Commit )
58+ fmt .Fprintln (stdout , "Build Date:" , vInfo .BuildDate )
59+ fmt .Fprintln (stdout , "Go Build Info:" )
60+ b , ok := debug .ReadBuildInfo ()
61+ if ok {
62+ fmt .Fprintln (stdout , b )
63+ }
64+ return 0
65+ case "migrate-config" :
66+ content , err := migrate .Config (fs .Arg (1 ))
67+ if err != nil {
68+ fmt .Fprintln (stderr , err )
69+ return 1
70+ }
71+ fmt .Fprintln (stdout , content )
72+ return 0
73+ default :
74+ if command != "" {
75+ fmt .Fprintf (stderr , "gotify: unknown command %q\n \n " , command )
76+ }
77+ printUsage (stderr )
78+ return 2
79+ }
80+ }
81+
82+ func serve (vInfo * model.VersionInfo ) int {
3383 mode .Set (Mode )
3484
85+ conf , futureLogs := config .Get ()
86+ log .Logger = log .Output (zerolog.ConsoleWriter {Out : os .Stdout , TimeFormat : time .RFC3339 , NoColor : noColor (conf .NoColor )}).Level (zerolog .Level (conf .LogLevel ))
3587 log .Info ().Str ("version" , vInfo .Version ).Str ("build_date" , BuildDate ).Msg ("Gotify" )
36- conf := config .Get ()
88+
89+ exit := false
90+ for _ , futureLog := range futureLogs {
91+ log .WithLevel (futureLog .Level ).Msg (futureLog .Msg )
92+ exit = exit || futureLog .Level == zerolog .FatalLevel || futureLog .Level == zerolog .PanicLevel
93+ }
94+ if exit {
95+ return 1
96+ }
3797
3898 if conf .PluginsDir != "" {
3999 if err := os .MkdirAll (conf .PluginsDir , 0o755 ); err != nil {
40- panic (err )
100+ log .Error ().Err (err ).Str ("dir" , conf .PluginsDir ).Msg ("Cannot create plugins directory" )
101+ return 1
41102 }
42103 }
43104 if err := os .MkdirAll (conf .UploadedImagesDir , 0o755 ); err != nil {
44- panic (err )
105+ log .Error ().Err (err ).Str ("dir" , conf .UploadedImagesDir ).Msg ("Cannot create uploaded images directory" )
106+ return 1
45107 }
46108
47109 db , err := database .New (conf .Database .Dialect , conf .Database .Connection , conf .DefaultUser .Name , conf .DefaultUser .Pass , conf .PassStrength , true , time .Now )
48110 if err != nil {
49- panic (err )
111+ log .Error ().Err (err ).Msg ("Cannot initialize database" )
112+ return 1
50113 }
51114 defer db .Close ()
52115
@@ -55,13 +118,25 @@ func main() {
55118
56119 if err := runner .Run (engine , conf ); err != nil {
57120 log .Error ().Err (err ).Msg ("Server error" )
58- os . Exit ( 1 )
121+ return 1
59122 }
123+ return 0
124+ }
125+
126+ func printUsage (w io.Writer ) {
127+ fmt .Fprint (w , `Usage: gotify [flags] <command> [arguments]
128+
129+ Commands:
130+ serve Start the Gotify server.
131+ migrate-config <file.yml> Convert an old YAML config file to the new env
132+ format and print it to stdout.
133+ version Show version information
134+ ` )
60135}
61136
62- func noColor () bool {
137+ func noColor (noColorEnv string ) bool {
63138 // https://no-color.org/
64- if os . Getenv ( "NO_COLOR" ) == "1" {
139+ if noColorEnv == "1" {
65140 return true
66141 }
67142
0 commit comments