From 3b4e33ece07c0813bd04a1d6f02a168cb293e2a8 Mon Sep 17 00:00:00 2001
From: Naoki Kosaka <n.k@mail.yukimochi.net>
Date: Wed, 7 Nov 2018 23:51:23 +0900
Subject: [PATCH] Add cli tool.

---
 Dockerfile |   5 ++-
 Gopkg.lock |   9 ++++
 cli/cli.go | 127 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 readme.md  |   1 +
 4 files changed, 140 insertions(+), 2 deletions(-)
 create mode 100644 cli/cli.go

diff --git a/Dockerfile b/Dockerfile
index ccfbf76..cd73211 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -8,10 +8,11 @@ RUN  mkdir -p /rootfs/usr/bin && \
      go get -u github.com/golang/dep/cmd/dep && \
      dep ensure && \
      go build -o /rootfs/usr/bin/server . && \
-     go build -o /rootfs/usr/bin/worker ./worker
+     go build -o /rootfs/usr/bin/worker ./worker && \
+     go build -o /rootfs/usr/bin/ar-cli ./cli
 
 FROM alpine
 
 COPY --from=build /rootfs/usr/bin /usr/bin
-RUN  chmod +x /usr/bin/server /usr/bin/worker && \
+RUN  chmod +x /usr/bin/server /usr/bin/worker /usr/bin/ar-cli && \
      apk add -U --no-cache ca-certificates
diff --git a/Gopkg.lock b/Gopkg.lock
index d01e600..feb976b 100644
--- a/Gopkg.lock
+++ b/Gopkg.lock
@@ -227,6 +227,14 @@
   pruneopts = "UT"
   revision = "70e15c650864f4fc47f5d3c82ea117285480895d"
 
+[[projects]]
+  digest = "1:b24d38b282bacf9791408a080f606370efa3d364e4b5fd9ba0f7b87786d3b679"
+  name = "github.com/urfave/cli"
+  packages = ["."]
+  pruneopts = "UT"
+  revision = "cfb38830724cc34fedffe9a2a29fb54fa9169cd1"
+  version = "v1.20.0"
+
 [[projects]]
   digest = "1:bb78bf98bee383e091714423f2363a9a3b31a62e9ebbd887cb4f94e693d4890d"
   name = "github.com/yukimochi/httpsig"
@@ -469,6 +477,7 @@
     "github.com/Songmu/go-httpdate",
     "github.com/go-redis/redis",
     "github.com/satori/go.uuid",
+    "github.com/urfave/cli",
     "github.com/yukimochi/httpsig",
   ]
   solver-name = "gps-cdcl"
diff --git a/cli/cli.go b/cli/cli.go
new file mode 100644
index 0000000..e8f9f6f
--- /dev/null
+++ b/cli/cli.go
@@ -0,0 +1,127 @@
+package main
+
+import (
+	"fmt"
+	"log"
+	"os"
+	"strings"
+
+	"github.com/go-redis/redis"
+	"github.com/urfave/cli"
+)
+
+var redClient *redis.Client
+
+func listDomain(c *cli.Context) error {
+	var err error
+	var domains []string
+	var message string
+	switch c.String("type") {
+	case "limited":
+		message = " - Limited domain :"
+		domains, err = redClient.HKeys("relay:config:limitedDomain").Result()
+		if err != nil {
+			return err
+		}
+	case "blocked":
+		message = " - Blocked domain :"
+		domains, err = redClient.HKeys("relay:config:blockedDomain").Result()
+		if err != nil {
+			return err
+		}
+	default:
+		message = " - Subscribed domain :"
+		temp, err := redClient.Keys("relay:subscription:*").Result()
+		if err != nil {
+			return err
+		}
+		for _, domain := range temp {
+			domains = append(domains, strings.Replace(domain, "relay:subscription:", "", 1))
+		}
+	}
+	fmt.Println(message)
+	for _, domain := range domains {
+		fmt.Println(domain)
+	}
+	fmt.Println(fmt.Sprintf("Total : %d", len(domains)))
+	return nil
+}
+
+func manageDomain(c *cli.Context) error {
+	if c.String("domain") == "" {
+		fmt.Println("No domain given.")
+		return nil
+	}
+	switch c.String("type") {
+	case "limited":
+		if c.Bool("undo") {
+			redClient.HDel("relay:config:limitedDomain", c.String("domain"))
+			fmt.Println("Unregistrate [" + c.String("domain") + "] from Limited domain.")
+		} else {
+			redClient.HSet("relay:config:limitedDomain", c.String("domain"), "1")
+			fmt.Println("Registrate [" + c.String("domain") + "] as Limited domain.")
+		}
+	case "blocked":
+		if c.Bool("undo") {
+			redClient.HDel("relay:config:blockedDomain", c.String("domain"))
+			fmt.Println("Unregistrate [" + c.String("domain") + "] from Blocked domain.")
+		} else {
+			redClient.HSet("relay:config:blockedDomain", c.String("domain"), "1")
+			fmt.Println("Registrate [" + c.String("domain") + "] as Blocked domain.")
+		}
+	default:
+		fmt.Println("No type given.")
+	}
+	return nil
+}
+
+func main() {
+	redClient = redis.NewClient(&redis.Options{
+		Addr: os.Getenv("REDIS_URL"),
+	})
+
+	app := cli.NewApp()
+	app.Name = "Activity Relay Extarnal CLI"
+	app.Usage = "Control Relay configration"
+	app.Version = "0.0.2"
+	app.Commands = []cli.Command{
+		{
+			Name:    "list-domain",
+			Aliases: []string{"ld"},
+			Usage:   "List {subscribed,limited,blocked} domains",
+			Flags: []cli.Flag{
+				cli.StringFlag{
+					Name:  "type, t",
+					Value: "subscribed",
+					Usage: "Registrate type [subscribed,limited,blocked]",
+				},
+			},
+			Action: listDomain,
+		},
+		{
+			Name:    "manage-domain",
+			Aliases: []string{"md"},
+			Usage:   "Manage {limited,blocked} domains",
+			Flags: []cli.Flag{
+				cli.StringFlag{
+					Name:  "type, t",
+					Usage: "Registrate type [limited,blocked]",
+				},
+				cli.StringFlag{
+					Name:  "domain, d",
+					Usage: "Registrate domain",
+				},
+				cli.BoolFlag{
+					Name:  "undo, u",
+					Usage: "Undo registrate",
+				},
+			},
+			Action: manageDomain,
+		},
+	}
+
+	err := app.Run(os.Args)
+	if err != nil {
+		log.Fatal(err)
+	}
+}
diff --git a/readme.md b/readme.md
index 3838b39..26e4c80 100644
--- a/readme.md
+++ b/readme.md
@@ -8,6 +8,7 @@
 
  - `github.com/yukimochi/Activity-Relay`
  - `github.com/yukimochi/Activity-Relay/worker`
+ - `github.com/yukimochi/Activity-Relay/cli`
 
 ## Requirements