go-torrent-helper/command/main.go
2023-06-23 21:33:24 -05:00

164 lines
3.3 KiB
Go

package command
import (
"errors"
"flag"
"fmt"
"os"
"codeberg.org/hyperreal/go-torrent-helper/almalinux"
"codeberg.org/hyperreal/go-torrent-helper/debian"
"codeberg.org/hyperreal/go-torrent-helper/fedora"
"codeberg.org/hyperreal/go-torrent-helper/nixos"
"codeberg.org/hyperreal/go-torrent-helper/parrot"
"codeberg.org/hyperreal/go-torrent-helper/qubes"
"codeberg.org/hyperreal/go-torrent-helper/rocky"
"github.com/hekmon/transmissionrpc"
)
type Distro interface {
AddNewTorrents(client *transmissionrpc.Client) error
RemoveOldTorrents(client *transmissionrpc.Client) error
}
func NewAddCmd() *AddCmd {
addCmd := &AddCmd{
fs: flag.NewFlagSet("add", flag.ExitOnError),
}
addCmd.fs.StringVar(&addCmd.distro, "distro", "", "Distro to add torrents for")
addCmd.fs.StringVar(&addCmd.relver, "relver", "", "Release version to add")
return addCmd
}
func NewRemoveCmd() *RemoveCmd {
removeCmd := &RemoveCmd{
fs: flag.NewFlagSet("remove", flag.ExitOnError),
}
removeCmd.fs.StringVar(&removeCmd.distro, "distro", "", "Distro to remove torrents for")
removeCmd.fs.StringVar(&removeCmd.relver, "relver", "", "Release version to remove")
return removeCmd
}
type AddCmd struct {
fs *flag.FlagSet
distro string
relver string
}
type RemoveCmd struct {
fs *flag.FlagSet
distro string
relver string
}
func (a *AddCmd) Name() string {
return a.fs.Name()
}
func (r *RemoveCmd) Name() string {
return r.fs.Name()
}
func (a *AddCmd) Init(args []string) error {
return a.fs.Parse(args)
}
func (r *RemoveCmd) Init(args []string) error {
return r.fs.Parse(args)
}
func (a *AddCmd) Run(d Distro) error {
client, err := transmissionrpc.New(os.Getenv("TRANSMISSION_RPC_URL"), "", "", nil)
if err != nil {
return err
}
if err := d.AddNewTorrents(client); err != nil {
return err
}
return nil
}
func (r *RemoveCmd) Run(d Distro) error {
client, err := transmissionrpc.New(os.Getenv("TRANSMISSION_RPC_URL"), "", "", nil)
if err != nil {
return err
}
if err := d.RemoveOldTorrents(client); err != nil {
return err
}
return nil
}
type Runner interface {
Init([]string) error
Run(d Distro) error
Name() string
}
func Root(args []string) error {
if len(args) < 1 {
return errors.New("You must pass a sub-command")
}
cmds := []Runner{
NewAddCmd(),
NewRemoveCmd(),
}
subcmd := os.Args[1]
for _, cmd := range cmds {
if cmd.Name() == subcmd {
cmd.Init(os.Args[2:])
distro := os.Args[3]
relver := os.Args[5]
switch distro {
case "almalinux":
a := &almalinux.AlmaLinux{NameSubstr: "AlmaLinux", Relver: relver}
return cmd.Run(a)
case "debian":
d := &debian.Debian{NameSubstr: "debian", Relver: relver}
return cmd.Run(d)
case "fedora":
f := &fedora.Fedora{NameSubstr: "Fedora", Relver: relver}
return cmd.Run(f)
case "nixos":
n := &nixos.Nixos{NameSubstr: "nixos"}
return cmd.Run(n)
case "parrot":
p := &parrot.Parrot{NameSubstr: "Parrot", Relver: relver}
return cmd.Run(p)
case "qubes":
q := &qubes.Qubes{NameSubstr: "Qubes", Relver: relver}
return cmd.Run(q)
case "rocky":
r := &rocky.Rocky{NameSubstr: "Rocky", Relver: relver}
return cmd.Run(r)
default:
return fmt.Errorf("Unknown distro: %s", distro)
}
}
}
return fmt.Errorf("Unknown subcommand: %s", subcmd)
}