This repository has no description
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302package cmd
import ( "context" "fmt"
"github.com/spf13/cobra"
"github.com/shyim/hakobin/internal/config" "github.com/shyim/hakobin/internal/openpgp" "github.com/shyim/hakobin/internal/repository" "github.com/shyim/hakobin/internal/storage")
var ( // deb init flags debOrigin string debLabel string debDescription string debDistributions []string debComponents []string debArchitectures []string debKeyName string debKeyEmail string debKeyExpiration uint32
// deb upload flags debUploadDist string debUploadComp string debUploadForce bool
// deb list flags debListDist string debListComp string debListPack string
// deb remove flags debRemoveVer string debRemoveArch string debRemoveDist string debRemoveComp string debRemoveForce bool)
var debCmd = &cobra.Command{ Use: "deb", Short: "Manage Debian APT repositories",}
var debInitCmd = &cobra.Command{ Use: "init", Short: "Initialize a new APT repository", RunE: func(cmd *cobra.Command, args []string) error { cfg := config.FromEnv() applyPublicURL(cmd, cfg) if err := cfg.RequireS3(); err != nil { return err }
origin, err := valueOrPrompt(debOrigin, "Repository Origin", "My Organization") if err != nil { return err } label, err := valueOrPrompt(debLabel, "Repository Label", "My APT Repository") if err != nil { return err } description, err := valueOrPrompt(debDescription, "Repository Description", "APT repository for my packages") if err != nil { return err } dists, err := listOrPrompt(debDistributions, "Distributions", "stable") if err != nil { return err } comps, err := listOrPrompt(debComponents, "Components", "main") if err != nil { return err } archs, err := listOrPrompt(debArchitectures, "Architectures", "amd64,all") if err != nil { return err } keyName, err := valueOrPrompt(debKeyName, "Key Name", "Repository Signing Key") if err != nil { return err } keyEmail, err := valueOrPrompt(debKeyEmail, "Key Email", "admin@example.com") if err != nil { return err }
ctx := context.Background() store, err := storage.NewS3Store(ctx, cfg) if err != nil { return err }
manager := repository.NewRepositoryManager(cfg, store) req := &repository.InitRequest{ Metadata: repository.RepoMetadata{ Origin: origin, Label: label, Description: description, Distributions: dists, Components: comps, Architectures: archs, }, KeyName: keyName, KeyEmail: keyEmail, KeyExpirationYears: debKeyExpiration, }
return manager.Init(ctx, req) },}
var debUploadCmd = &cobra.Command{ Use: "upload [deb_files...]", Short: "Upload one or more .deb packages", Args: cobra.MinimumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { cfg := config.FromEnv() applyPublicURL(cmd, cfg) if err := cfg.RequireS3(); err != nil { return err }
ctx := context.Background() store, err := storage.NewS3Store(ctx, cfg) if err != nil { return err }
keys, err := openpgp.LoadSigningKeys(signingKeys, trustedKeys) if err != nil { return err } manager := repository.NewRepositoryManager(cfg, store)
req := &repository.UploadRequest{ DebFiles: args, Distribution: debUploadDist, Component: debUploadComp, Force: debUploadForce, SigningKeys: keys, }
return manager.Upload(ctx, req) },}
var debListCmd = &cobra.Command{ Use: "list [package_name]", Short: "List packages in the APT repository", RunE: func(cmd *cobra.Command, args []string) error { cfg := config.FromEnv() applyPublicURL(cmd, cfg) if err := cfg.RequireS3(); err != nil { return err }
ctx := context.Background() store, err := storage.NewS3Store(ctx, cfg) if err != nil { return err }
manager := repository.NewRepositoryManager(cfg, store)
var filterPackage *string if len(args) > 0 { filterPackage = &args[0] } if debListPack != "" { filterPackage = &debListPack }
var filterDist *string if debListDist != "" { filterDist = &debListDist } var filterComp *string if debListComp != "" { filterComp = &debListComp }
return manager.ListPackages(ctx, filterDist, filterComp, filterPackage) },}
var debRemoveCmd = &cobra.Command{ Use: "remove [package]", Short: "Remove a package from the APT repository", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { cfg := config.FromEnv() applyPublicURL(cmd, cfg) if err := cfg.RequireS3(); err != nil { return err }
if debRemoveVer == "" { return fmt.Errorf("required flag(s) \"version\" not set") } if debRemoveArch == "" { return fmt.Errorf("required flag(s) \"architecture\" not set") }
ctx := context.Background() store, err := storage.NewS3Store(ctx, cfg) if err != nil { return err }
keys, err := openpgp.LoadSigningKeys(signingKeys, trustedKeys) if err != nil { return err } manager := repository.NewRepositoryManager(cfg, store)
req := &repository.RemoveRequest{ Package: args[0], Version: debRemoveVer, Architecture: debRemoveArch, Distribution: debRemoveDist, Component: debRemoveComp, Force: debRemoveForce, SigningKeys: keys, }
return manager.Remove(ctx, req) },}
var debRotateKeyCmd = &cobra.Command{ Use: "rotate-key", Short: "Refresh APT signing keys and re-sign repository metadata", RunE: func(cmd *cobra.Command, args []string) error { cfg := config.FromEnv() applyPublicURL(cmd, cfg) if err := cfg.RequireS3(); err != nil { return err }
ctx := context.Background() store, err := storage.NewS3Store(ctx, cfg) if err != nil { return err }
keys, err := openpgp.LoadSigningKeys(signingKeys, trustedKeys) if err != nil { return err } if keys.Active == nil { return fmt.Errorf("rotate-key requires an active private signing key from GPG_PRIVATE_KEY, --signing-key, or ./signing-key.gpg") }
manager := repository.NewRepositoryManager(cfg, store) return manager.RotateKey(ctx, keys) },}
func init() { // init flags debInitCmd.Flags().StringVar(&debOrigin, "origin", "", "Repository Origin") debInitCmd.Flags().StringVar(&debLabel, "label", "", "Repository Label") debInitCmd.Flags().StringVar(&debDescription, "description", "", "Repository Description") debInitCmd.Flags().StringSliceVar(&debDistributions, "distributions", nil, "Comma-separated list of distributions") debInitCmd.Flags().StringSliceVar(&debComponents, "components", nil, "Comma-separated list of components") debInitCmd.Flags().StringSliceVar(&debArchitectures, "architectures", nil, "Comma-separated list of architectures") debInitCmd.Flags().StringVar(&debKeyName, "key-name", "", "Signing key user name") debInitCmd.Flags().StringVar(&debKeyEmail, "key-email", "", "Signing key user email") debInitCmd.Flags().Uint32Var(&debKeyExpiration, "key-expiration-years", 2, "Key expiration period in years")
// upload flags debUploadCmd.Flags().StringVarP(&debUploadDist, "distribution", "d", "stable", "Distribution to upload to") debUploadCmd.Flags().StringVarP(&debUploadComp, "component", "c", "main", "Component to upload to") debUploadCmd.Flags().BoolVarP(&debUploadForce, "force", "f", false, "Force upload even if package exists")
// list flags debListCmd.Flags().StringVarP(&debListDist, "distribution", "d", "", "Filter by distribution") debListCmd.Flags().StringVarP(&debListComp, "component", "c", "", "Filter by component") debListCmd.Flags().StringVarP(&debListPack, "package", "p", "", "Filter by package name")
// remove flags debRemoveCmd.Flags().StringVarP(&debRemoveVer, "version", "v", "", "Package version (required)") debRemoveCmd.Flags().StringVarP(&debRemoveArch, "architecture", "a", "", "Package architecture (required)") debRemoveCmd.Flags().StringVarP(&debRemoveDist, "distribution", "d", "stable", "Distribution of the package") debRemoveCmd.Flags().StringVarP(&debRemoveComp, "component", "c", "main", "Component of the package") debRemoveCmd.Flags().BoolVarP(&debRemoveForce, "force", "f", false, "Skip confirmation prompt")
debCmd.AddCommand(debInitCmd) debCmd.AddCommand(debUploadCmd) debCmd.AddCommand(debListCmd) debCmd.AddCommand(debRemoveCmd) debCmd.AddCommand(debRotateKeyCmd)
rootCmd.AddCommand(debCmd)}