Initial Commit
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing

This commit is contained in:
2024-08-18 20:49:30 +02:00
commit f79b20e8a4
24 changed files with 1921 additions and 0 deletions

20
cmd/autharr/LICENSE Normal file
View File

@ -0,0 +1,20 @@
Copyright (c) 2024 Markus Pesch
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

37
cmd/autharr/Makefile Normal file
View File

@ -0,0 +1,37 @@
VERSION?=$(shell git describe --abbrev=0)+hash.$(shell git rev-parse --short HEAD)
# CONTAINER_RUNTIME
# The CONTAINER_RUNTIME variable will be used to specified the path to a
# container runtime. This is needed to start and run a container image.
CONTAINER_RUNTIME?=$(shell which podman)
# BIN
# ==============================================================================
autharr:
CGO_ENABLED=0 \
go build -ldflags "-X 'main.version=${VERSION}'" -o ${@} main.go
# CLEAN
# ==============================================================================
PHONY+=clean
clean:
rm --force --recursive autharr
# INSTALL
# ==============================================================================
PHONY+=install
install: autharr
# install --directory ${DESTDIR}/etc/bash_completion.d
# ./autharr completion bash > ${DESTDIR}/etc/bash_completion.d/autharr
install --directory ${DESTDIR}${PREFIX}/bin
install --mode 0755 autharr ${DESTDIR}${PREFIX}/bin/autharr
install --directory ${DESTDIR}${PREFIX}/share/licenses/autharr
install --mode 0644 LICENSE ${DESTDIR}${PREFIX}/share/licenses/autharr/LICENSE
# PHONY
# ==============================================================================
# Declare the contents of the PHONY variable as phony. We keep that information
# in a variable so we can use it in if_changed.
.PHONY: ${PHONY}

123
cmd/autharr/main.go Normal file
View File

@ -0,0 +1,123 @@
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
}