1// Copyright © 2017-2018 Mikael Berthe <mikael@lilotux.net> 2// 3// Licensed under the MIT license. 4// Please see the LICENSE file is this directory. 5 6package cmd 7 8import ( 9 "os" 10 11 "github.com/pkg/errors" 12 "github.com/spf13/cobra" 13 14 "github.com/McKael/madon/v2" 15) 16 17var domainBlocksOpts struct { 18 show, block, unblock bool 19 20 limit uint // Limit the results 21 sinceID, maxID int64 // Query boundaries 22 all bool // Try to fetch all results 23} 24 25// timelinesCmd represents the timelines command 26var domainBlocksCmd = &cobra.Command{ 27 Use: "domain-blocks --show|--block|--unblock [DOMAINNAME]", 28 Aliases: []string{"domain-block"}, 29 Short: "Display, add or remove user-blocked domains", 30 RunE: domainBlocksRunE, 31 Example: ` madonctl domain-blocks --show 32 madonctl domain-blocks --block example.com 33 madonctl domain-blocks --unblock example.com`, 34} 35 36func init() { 37 RootCmd.AddCommand(domainBlocksCmd) 38 39 domainBlocksCmd.Flags().BoolVar(&domainBlocksOpts.show, "show", false, "List current user-blocked domains") 40 domainBlocksCmd.Flags().BoolVar(&domainBlocksOpts.block, "block", false, "Block domain") 41 domainBlocksCmd.Flags().BoolVar(&domainBlocksOpts.unblock, "unblock", false, "Unblock domain") 42 43 domainBlocksCmd.Flags().UintVarP(&domainBlocksOpts.limit, "limit", "l", 0, "Limit number of results") 44 domainBlocksCmd.Flags().Int64Var(&domainBlocksOpts.sinceID, "since-id", 0, "Request IDs greater than a value") 45 domainBlocksCmd.Flags().Int64Var(&domainBlocksOpts.maxID, "max-id", 0, "Request IDs less (or equal) than a value") 46 domainBlocksCmd.Flags().BoolVar(&domainBlocksOpts.all, "all", false, "Fetch all results") 47} 48 49func domainBlocksRunE(cmd *cobra.Command, args []string) error { 50 opt := domainBlocksOpts 51 var domName madon.DomainName 52 53 // Check flags 54 if opt.block && opt.unblock { 55 return errors.New("cannot use both --block and --unblock") 56 } 57 58 if opt.block || opt.unblock { 59 if opt.show { 60 return errors.New("cannot use both --[un]block and --show") 61 } 62 if len(args) != 1 { 63 return errors.New("missing domain name") 64 } 65 domName = madon.DomainName(args[0]) 66 } 67 68 if !opt.show && !opt.block && !opt.unblock { 69 return errors.New("missing flag: please provide --show, --block or --unblock") 70 } 71 72 // Set up LimitParams 73 var limOpts *madon.LimitParams 74 if opt.all || opt.limit > 0 || opt.sinceID > 0 || opt.maxID > 0 { 75 limOpts = new(madon.LimitParams) 76 limOpts.All = opt.all 77 } 78 if opt.limit > 0 { 79 limOpts.Limit = int(opt.limit) 80 } 81 if opt.maxID > 0 { 82 limOpts.MaxID = opt.maxID 83 } 84 if opt.sinceID > 0 { 85 limOpts.SinceID = opt.sinceID 86 } 87 88 // Log in 89 if err := madonInit(true); err != nil { 90 return err 91 } 92 93 var obj interface{} 94 var err error 95 96 switch { 97 case opt.show: 98 var domainList []madon.DomainName 99 domainList, err = gClient.GetBlockedDomains(limOpts) 100 obj = domainList 101 case opt.block: 102 err = gClient.BlockDomain(domName) 103 case opt.unblock: 104 err = gClient.UnblockDomain(domName) 105 default: 106 return errors.New("domainBlocksCmd: internal error") 107 } 108 109 if err != nil { 110 errPrint("Error: %s", err.Error()) 111 os.Exit(1) 112 } 113 if obj == nil { 114 return nil 115 } 116 117 p, err := getPrinter() 118 if err != nil { 119 errPrint("Error: %v", err) 120 os.Exit(1) 121 } 122 return p.printObj(obj) 123} 124