neko/cmd/root.go

141 lines
3.1 KiB
Go
Raw Normal View History

package cmd
import (
"fmt"
"io"
"os"
"path/filepath"
"runtime"
2021-03-17 03:24:58 +13:00
"strings"
"time"
"github.com/rs/zerolog"
"github.com/rs/zerolog/diode"
"github.com/rs/zerolog/log"
"github.com/spf13/cobra"
"github.com/spf13/viper"
2020-10-29 07:15:48 +13:00
"demodesk/neko"
2022-01-14 12:22:23 +13:00
"demodesk/neko/internal/config"
)
func Execute() error {
return root.Execute()
}
var root = &cobra.Command{
Use: "neko",
Short: "neko streaming server",
Long: `neko streaming server`,
2022-01-17 08:35:57 +13:00
Version: neko.Version.String(),
}
func init() {
2022-01-17 08:35:57 +13:00
rootConfig := config.Root{}
2022-01-14 12:22:23 +13:00
cobra.OnInitialize(func() {
//////
// logs
//////
console := zerolog.ConsoleWriter{Out: os.Stdout}
2021-09-27 08:29:56 +13:00
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
zerolog.SetGlobalLevel(zerolog.InfoLevel)
2021-09-27 08:29:56 +13:00
logs := viper.GetBool("logs")
if !logs {
log.Logger = log.Output(console)
} else {
2021-09-27 08:29:56 +13:00
logsPath := filepath.Join(".", "logs")
if runtime.GOOS == "linux" {
2021-09-27 08:29:56 +13:00
logsPath = "/var/log/neko"
}
2021-09-27 08:29:56 +13:00
if _, err := os.Stat(logsPath); os.IsNotExist(err) {
_ = os.Mkdir(logsPath, os.ModePerm)
}
2021-09-27 08:29:56 +13:00
latest := filepath.Join(logsPath, "neko-latest.log")
if _, err := os.Stat(latest); err == nil {
err = os.Rename(latest, filepath.Join(logsPath, "neko."+time.Now().Format("2006-01-02T15-04-05Z07-00")+".log"))
if err != nil {
log.Panic().Err(err).Msg("failed to rotate log file")
}
}
logf, err := os.OpenFile(latest, os.O_RDWR|os.O_CREATE, 0666)
if err != nil {
log.Panic().Err(err).Msg("failed to create log file")
}
logger := diode.NewWriter(logf, 1000, 10*time.Millisecond, func(missed int) {
fmt.Printf("logger dropped %d messages", missed)
})
log.Logger = log.Output(io.MultiWriter(console, logger))
}
//////
// configs
//////
config := viper.GetString("config") // Use config file from the flag.
if config == "" {
config = os.Getenv("NEKO_CONFIG") // Use config file from the environment variable.
}
if config != "" {
viper.SetConfigFile(config)
} else {
if runtime.GOOS == "linux" {
viper.AddConfigPath("/etc/neko/")
}
viper.AddConfigPath(".")
viper.SetConfigName("neko")
}
viper.SetEnvPrefix("NEKO")
2021-03-17 03:24:58 +13:00
viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
viper.AutomaticEnv() // read in environment variables that match
2021-09-27 08:29:56 +13:00
err := viper.ReadInConfig()
if err != nil && config != "" {
log.Err(err)
}
2021-09-27 08:29:56 +13:00
// get full config file path
config = viper.ConfigFileUsed()
//////
// debug
//////
debug := viper.GetBool("debug")
if debug {
2021-01-18 07:10:59 +13:00
zerolog.SetGlobalLevel(zerolog.DebugLevel)
}
logger := log.With().
Bool("debug", debug).
2021-09-27 08:29:56 +13:00
Bool("logs", logs).
Str("config", config).
Logger()
2021-09-27 08:29:56 +13:00
if config == "" {
logger.Warn().Msg("preflight complete without config file")
} else {
2021-09-27 08:29:56 +13:00
if _, err := os.Stat(config); os.IsNotExist(err) {
2021-09-02 09:10:06 +12:00
logger.Err(err).Msg("preflight complete with nonexistent config file")
2021-03-19 07:47:28 +13:00
} else {
2021-09-27 08:29:56 +13:00
logger.Info().Msg("preflight complete with config file")
2021-03-19 07:47:28 +13:00
}
}
2022-01-17 08:35:57 +13:00
rootConfig.Set()
})
2022-01-17 08:35:57 +13:00
if err := rootConfig.Init(root); err != nil {
log.Panic().Err(err).Msg("unable to run root command")
}
2022-01-17 08:35:57 +13:00
root.SetVersionTemplate(neko.Version.Details())
}