tarr/cmd/autharr/main.go
Markus Pesch f79b20e8a4
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
Initial Commit
2024-08-20 18:15:43 +02:00

124 lines
2.3 KiB
Go

package main
import (
"fmt"
"os"
"path/filepath"
"time"
"git.cryptic.systems/volker.raschek/tarr/pkg/config"
"git.cryptic.systems/volker.raschek/tarr/pkg/domain"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
var version string
func main() {
rootCmd := &cobra.Command{
Args: cobra.RangeArgs(1, 2),
Long: `autharr reads the XML or YAML configuration file and prints the API token on stdout`,
Example: `autharr /etc/bazarr/config.yaml
autharr /etc/lidarr/config.xml`,
RunE: runE,
Version: version,
Use: "autharr",
}
rootCmd.Flags().Bool("watch", false, "Listens for changes to the configuration and writes the token continuously to the output")
rootCmd.Execute()
}
func runE(cmd *cobra.Command, args []string) error {
watchCfg, err := cmd.Flags().GetBool("watch")
if err != nil {
return err
}
switch watchCfg {
case true:
return runWatch(cmd, args)
case false:
return runSingle(cmd, args)
}
return nil
}
func runSingle(_ *cobra.Command, args []string) error {
cfg, err := config.ReadConfig(args[0])
if err != nil {
return err
}
var dest string
if len(args) == 2 {
dest = args[1]
}
return writeConfig(cfg, dest)
}
func runWatch(cmd *cobra.Command, args []string) error {
// Initial output
err := runSingle(cmd, args)
if err != nil {
return err
}
// Watcher output
configChannel, errorChannel := config.WatchConfig(cmd.Context(), args[0])
var dest string
if len(args) == 2 {
dest = args[1]
}
waitFor := time.Millisecond * 100
timer := time.NewTimer(waitFor)
<-timer.C
var cachedConfig *domain.Config = nil
for {
select {
case <-cmd.Context().Done():
return nil
case err := <-errorChannel:
logrus.WithError(err).Errorln("Received from config watcher")
case <-timer.C:
writeConfig(cachedConfig, dest)
case config := <-configChannel:
cachedConfig = config
timer.Reset(waitFor)
}
}
}
func writeConfig(config *domain.Config, dest string) error {
switch {
case len(dest) <= 0:
_, err := fmt.Fprintf(os.Stdout, "%s", config.API.Token)
if err != nil {
return err
}
case len(dest) > 0:
dirname := filepath.Dir(dest)
err := os.MkdirAll(dirname, 0755)
if err != nil {
return err
}
f, err := os.Create(dest)
if err != nil {
return err
}
defer func() { _ = f.Close() }()
f.WriteString(config.API.Token)
}
return nil
}