124 lines
2.3 KiB
Go
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
|
||
|
}
|