183 lines
5.3 KiB
Go
183 lines
5.3 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
"time"
|
||
|
|
||
|
"git.cryptic.systems/volker.raschek/tarr/pkg/config"
|
||
|
"git.cryptic.systems/volker.raschek/tarr/pkg/domain"
|
||
|
"git.cryptic.systems/volker.raschek/tarr/pkg/health"
|
||
|
"github.com/spf13/cobra"
|
||
|
)
|
||
|
|
||
|
var version string
|
||
|
|
||
|
func main() {
|
||
|
bazarrCmd := &cobra.Command{
|
||
|
Args: cobra.ExactArgs(1),
|
||
|
Example: `healarr bazarr https://bazarr.example.com:8443 --config /etc/bazarr/config.yaml
|
||
|
healarr bazarr https://bazarr.example.com:8443 --api-token my-token`,
|
||
|
RunE: runBazarrE,
|
||
|
Short: "Check if a bazarr instance is healthy",
|
||
|
Use: `bazarr`,
|
||
|
}
|
||
|
|
||
|
lidarrCmd := &cobra.Command{
|
||
|
Args: cobra.ExactArgs(1),
|
||
|
Example: `healarr lidarr https://lidarr.example.com:8443 --config /etc/lidarr/config.xml
|
||
|
healarr lidarr https://lidarr.example.com:8443 --api-token my-token`,
|
||
|
RunE: runLidarrE,
|
||
|
Short: "Check if a lidarr instance is healthy",
|
||
|
Use: `lidarr`,
|
||
|
}
|
||
|
|
||
|
prowlarrCmd := &cobra.Command{
|
||
|
Args: cobra.ExactArgs(1),
|
||
|
Example: `healarr prowlarr https://prowlarr.example.com:8443 --config /etc/prowlarr/config.xml
|
||
|
healarr prowlarr https://prowlarr.example.com:8443 --api-token my-token`,
|
||
|
RunE: runProwlarrE,
|
||
|
Short: "Check if a prowlarr instance is healthy",
|
||
|
Use: `prowlarr`,
|
||
|
}
|
||
|
|
||
|
radarrCmd := &cobra.Command{
|
||
|
Args: cobra.ExactArgs(1),
|
||
|
Example: `healarr radarr https://radarr.example.com:8443 --config /etc/radarr/config.xml
|
||
|
healarr radarr https://radarr.example.com:8443 --api-token my-token`,
|
||
|
RunE: runRadarrE,
|
||
|
Short: "Check if a radarr instance is healthy",
|
||
|
Use: `radarr`,
|
||
|
}
|
||
|
|
||
|
readarrCmd := &cobra.Command{
|
||
|
Args: cobra.ExactArgs(1),
|
||
|
Example: `healarr readarr https://readarr.example.com:8443 --config /etc/readarr/config.xml
|
||
|
healarr readarr https://readarr.example.com:8443 --api-token my-token`,
|
||
|
RunE: runReadarrrE,
|
||
|
Short: "Check if a readarr instance is healthy",
|
||
|
Use: `readarr`,
|
||
|
}
|
||
|
|
||
|
sabnzbdCmd := &cobra.Command{
|
||
|
Args: cobra.ExactArgs(1),
|
||
|
Example: `healarr sabnzbd https://sabnzbd.example.com:8443 --config /etc/sabnzbd/config.xml
|
||
|
healarr sabnzbd https://sabnzbd.example.com:8443 --api-token my-token`,
|
||
|
RunE: runSabNZBdE,
|
||
|
Short: "Check if a sabnzbd instance is healthy",
|
||
|
Use: `sabnzbd`,
|
||
|
}
|
||
|
|
||
|
sonarrCmd := &cobra.Command{
|
||
|
Args: cobra.ExactArgs(1),
|
||
|
Example: `healarr sonarr https://sonarr.example.com:8443 --config /etc/sonarr/config.xml
|
||
|
healarr sonarr https://sonarr.example.com:8443 --api-token my-token`,
|
||
|
RunE: runSonarr,
|
||
|
Short: "Check if a sonarr instance is healthy",
|
||
|
Use: `sonarr`,
|
||
|
}
|
||
|
|
||
|
rootCmd := &cobra.Command{
|
||
|
Args: cobra.ExactArgs(1),
|
||
|
Long: `healarr exits with a non zero exit code, when the *arr application is not healthy`,
|
||
|
Version: version,
|
||
|
Use: "healarr",
|
||
|
}
|
||
|
rootCmd.AddCommand(bazarrCmd)
|
||
|
rootCmd.AddCommand(lidarrCmd)
|
||
|
rootCmd.AddCommand(prowlarrCmd)
|
||
|
rootCmd.AddCommand(radarrCmd)
|
||
|
rootCmd.AddCommand(readarrCmd)
|
||
|
rootCmd.AddCommand(sabnzbdCmd)
|
||
|
rootCmd.AddCommand(sonarrCmd)
|
||
|
rootCmd.PersistentFlags().String("api-token", "", "Token to access the *arr application")
|
||
|
rootCmd.PersistentFlags().String("config", "", "Path to an XML or YAML config file")
|
||
|
rootCmd.PersistentFlags().Bool("insecure", false, "Trust insecure TLS certificates")
|
||
|
rootCmd.PersistentFlags().Duration("timeout", time.Minute, "Timeout")
|
||
|
|
||
|
rootCmd.Execute()
|
||
|
}
|
||
|
|
||
|
func runBazarrE(cmd *cobra.Command, args []string) error {
|
||
|
return runE(cmd, args, domain.BazarrAPIQueryKeyAPIToken)
|
||
|
}
|
||
|
|
||
|
func runLidarrE(cmd *cobra.Command, args []string) error {
|
||
|
return runE(cmd, args, domain.LidarrAPIQueryKeyAPIToken)
|
||
|
}
|
||
|
|
||
|
func runProwlarrE(cmd *cobra.Command, args []string) error {
|
||
|
return runE(cmd, args, domain.ProwlarrAPIQueryKeyAPIToken)
|
||
|
}
|
||
|
|
||
|
func runRadarrE(cmd *cobra.Command, args []string) error {
|
||
|
return runE(cmd, args, domain.RadarrAPIQueryKeyAPIToken)
|
||
|
}
|
||
|
|
||
|
func runReadarrrE(cmd *cobra.Command, args []string) error {
|
||
|
return runE(cmd, args, domain.ReadarrAPIQueryKeyAPIToken)
|
||
|
}
|
||
|
|
||
|
func runSabNZBdE(cmd *cobra.Command, args []string) error {
|
||
|
return runE(cmd, args, domain.SabNZBdAPIQueryKeyAPIToken)
|
||
|
}
|
||
|
|
||
|
func runSonarr(cmd *cobra.Command, args []string) error {
|
||
|
return runE(cmd, args, domain.SonarrAPIQueryKeyAPIToken)
|
||
|
}
|
||
|
|
||
|
func runE(cmd *cobra.Command, args []string, queryKey string) error {
|
||
|
apiToken, err := cmd.Flags().GetString("api-token")
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
configPath, err := cmd.Flags().GetString("config")
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
insecure, err := cmd.Flags().GetBool("insecure")
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
timeout, err := cmd.Flags().GetDuration("timeout")
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
readinessProbeCtx, cancel := context.WithTimeout(cmd.Context(), timeout)
|
||
|
defer func() { cancel() }()
|
||
|
|
||
|
switch {
|
||
|
case len(apiToken) <= 0 && len(configPath) <= 0:
|
||
|
return fmt.Errorf("At least --api-token oder --config must be defined")
|
||
|
case len(apiToken) > 0 && len(configPath) <= 0:
|
||
|
err = health.NewReadinessProbe(args[0]).
|
||
|
QueryAdd(queryKey, apiToken).
|
||
|
Insecure(insecure).
|
||
|
Run(readinessProbeCtx)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
case len(apiToken) <= 0 && len(configPath) > 0:
|
||
|
config, err := config.ReadConfig(configPath)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
err = health.NewReadinessProbe(args[0]).
|
||
|
QueryAdd(queryKey, config.API.Token).
|
||
|
Insecure(insecure).
|
||
|
Run(readinessProbeCtx)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
default:
|
||
|
return fmt.Errorf("Neither --api-token nor --config can be used at the same time.")
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|