From 88d920cd35334f4a7ef0bf2f7e2c5de04e882aee Mon Sep 17 00:00:00 2001 From: nicksherron Date: Tue, 11 Feb 2020 01:30:34 -0500 Subject: [PATCH] working poc --- cmd/migrate.go | 110 +++++++++++++++++++++++++++++---------------- go.mod | 2 +- go.sum | 12 ++++- internal/server.go | 2 + 4 files changed, 85 insertions(+), 41 deletions(-) diff --git a/cmd/migrate.go b/cmd/migrate.go index c48fb11..afb6343 100644 --- a/cmd/migrate.go +++ b/cmd/migrate.go @@ -25,11 +25,12 @@ import ( "io/ioutil" "log" "net/http" + "os" "os/exec" "strings" "sync" - "github.com/nicksherron/bashhub-server/internal" + "github.com/cheggaaa/pb/v3" "github.com/spf13/cobra" ) @@ -39,39 +40,38 @@ type cList struct { Created int64 `json:"created"` } -type commandRecord struct { - Command string `json:"command"` - Path string `json:"path"` - Created int64 `json:"created"` - UUID string `json:"uuid"` - ExitStatus int `json:"exitStatus"` - Username string `json:"username"` - SystemName string `json:"systemName"` - SessionID string `json:"sessionId"` -} - type commandsList []cList var ( - srcUser string - dstUser string - srcURL string - dstURL string - srcPass string - dstPass string - srcToken string - dstToken string - wg sync.WaitGroup - cmdList commandsList - migrateCmd = &cobra.Command{ + barTemplate = `{{string . "message"}}{{counters . }} {{bar . }} {{percent . }} {{speed . "%s inserts/sec" }}` + bar *pb.ProgressBar + progress bool + srcUser string + dstUser string + srcURL string + dstURL string + srcPass string + dstPass string + srcToken string + dstToken string + sysRegistered bool + wg sync.WaitGroup + cmdList commandsList + migrateCmd = &cobra.Command{ Use: "migrate", Short: "migrate bashhub history ", Run: func(cmd *cobra.Command, args []string) { cmd.Flags().Parse(args) + sysRegistered = false srcToken = getToken(srcURL, srcUser, srcPass) + sysRegistered = false dstToken = getToken(dstURL, dstUser, dstPass) cmdList = getCommandList() counter := 0 + if progress { + bar = pb.ProgressBarTemplate(barTemplate).Start(len(cmdList)).SetMaxWidth(70) + bar.Set("message", "inserting records \t") + } for _, v := range cmdList { wg.Add(1) counter++ @@ -97,6 +97,38 @@ func init() { migrateCmd.PersistentFlags().StringVar(&dstURL, "dst-url", "http://localhost:8080", "destination url") migrateCmd.PersistentFlags().StringVar(&dstUser, "dst-user", "", "destination username") migrateCmd.PersistentFlags().StringVar(&dstPass, "dst-pass", "", "destination password") + migrateCmd.PersistentFlags().BoolVarP(&progress, "progress", "p", true, "show progress bar") +} + +func sysRegister(mac string, site string, user string, pass string) { + + sys := map[string]interface{}{ + "clientVersion": "1.2.0", + "name": "migration", + "hostname": os.Hostname(), + "mac": mac, + } + payloadBytes, err := json.Marshal(sys) + if err != nil { + log.Fatal(err) + } + + body := bytes.NewReader(payloadBytes) + + u := fmt.Sprintf("%v/api/v1/system", srcURL) + req, err := http.NewRequest("POST", u, body) + if err != nil { + log.Fatal(err) + } + req.Header.Set("Content-Type", "application/json") + + resp, err := http.DefaultClient.Do(req) + if err != nil { + log.Fatal(err) + } + defer resp.Body.Close() + sysRegistered = true + getToken(site, user, pass) } @@ -134,7 +166,16 @@ func getToken(site string, user string, pass string) string { } defer resp.Body.Close() + if resp.StatusCode == 409 && !sysRegistered { + // register system + sysRegister(mac, site, user, pass) + } if resp.StatusCode != 200 { + buf, err := ioutil.ReadAll(resp.Body) + if err != nil { + log.Fatal(err) + } + fmt.Println(buf) log.Fatal("login failed for ", site) } buf, err := ioutil.ReadAll(resp.Body) @@ -164,7 +205,7 @@ func getCommandList() commandsList { resp, err := client.Do(req) if err != nil { - log.Println("Error on response.\n[ERRO] -", err) + log.Println("Error on response.\n", err) } defer resp.Body.Close() @@ -194,7 +235,7 @@ func commandLookup(uuid string) { resp, err := client.Do(req) if err != nil { - log.Println("Error on response.\n[ERRO] -", err) + log.Println("Error on response.\n", err) } defer resp.Body.Close() @@ -206,21 +247,14 @@ func commandLookup(uuid string) { log.Fatal(err) } srcSend(body) - var j internal.Query - err = json.Unmarshal(body, &j) - if err != nil { - log.Fatal(err) - } - - j.Username = dstUser - b, err := json.Marshal(j) - if err != nil { - log.Fatal(err) - } - srcSend(b) } func srcSend(data []byte) { + defer func() { + if progress { + bar.Add(1) + } + }() body := bytes.NewReader(data) u := dstURL + "/api/v1/import" @@ -233,7 +267,7 @@ func srcSend(data []byte) { resp, err := client.Do(req) if err != nil { - log.Println("Error on response.\n[ERRO] -", err) + log.Println("Error on response.\n", err) } defer resp.Body.Close() diff --git a/go.mod b/go.mod index b65b354..d71fb1d 100644 --- a/go.mod +++ b/go.mod @@ -2,13 +2,13 @@ module github.com/nicksherron/bashhub-server require ( github.com/appleboy/gin-jwt/v2 v2.6.3 + github.com/cheggaaa/pb/v3 v3.0.4 github.com/fatih/color v1.9.0 github.com/gin-gonic/gin v1.5.0 github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/jinzhu/gorm v1.9.12 github.com/lib/pq v1.3.0 github.com/mattn/go-sqlite3 v2.0.1+incompatible - github.com/olekukonko/tablewriter v0.0.4 github.com/spf13/cobra v0.0.3 github.com/spf13/pflag v1.0.5 // indirect golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd diff --git a/go.sum b/go.sum index 9ffa10a..eaeec50 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,11 @@ +github.com/VividCortex/ewma v1.1.1 h1:MnEK4VOv6n0RSY4vtRe3h11qjxL3+t0B8yOL8iMXdcM= +github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= github.com/appleboy/gin-jwt/v2 v2.6.3 h1:aK4E3DjihWEBUTjEeRnGkA5nUkmwJPL1CPonMa2usRs= github.com/appleboy/gin-jwt/v2 v2.6.3/go.mod h1:MfPYA4ogzvOcVkRwAxT7quHOtQmVKDpTwxyUrC2DNw0= github.com/appleboy/gofight/v2 v2.1.2 h1:VOy3jow4vIK8BRQJoC/I9muxyYlJ2yb9ht2hZoS3rf4= github.com/appleboy/gofight/v2 v2.1.2/go.mod h1:frW+U1QZEdDgixycTj4CygQ48yLTUhplt43+Wczp3rw= +github.com/cheggaaa/pb/v3 v3.0.4 h1:QZEPYOj2ix6d5oEg63fbHmpolrnNiwjUsk+h74Yt4bM= +github.com/cheggaaa/pb/v3 v3.0.4/go.mod h1:7rgWxLrAUcFMkvJuv09+DYi7mMUYi8nO9iOWcvGJPfw= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -11,6 +15,7 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumC github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y= github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= @@ -48,12 +53,14 @@ github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdA github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.3.0 h1:/qkRGz8zljWiDcFvgpwUpwIAPu3r07TDvs3Rws+o/pU= github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9 h1:d5US/mDsogSGW37IV293h//ZFaeajb69h+EHFsv2xGg= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11 h1:FxPOTFNqGkuDUGi3H/qkUbQO4ZiBa2brKq5r0l8TGeM= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54= @@ -68,8 +75,6 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLD github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= -github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/spf13/cobra v0.0.3 h1:ZlrZ4XsMRm04Fr5pSFxBgfND2EBVa1nLpiy1stUsX/8= @@ -103,8 +108,11 @@ golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9 h1:ZBzSG/7F4eNKz2L3GE9o300RX0Az1Bw5HF7PDraD+qU= +golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= diff --git a/internal/server.go b/internal/server.go index 3b1e34d..182c5ea 100644 --- a/internal/server.go +++ b/internal/server.go @@ -325,6 +325,8 @@ func Run() { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } + claims := jwt.ExtractClaims(c) + query.Username = claims["username"].(string) importCommands(query) })