update at 2019-11-15 18:05:28 by ehlxr
This commit is contained in:
commit
44e1b38f0f
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
logs
|
||||
go.sum
|
||||
dist
|
8
Dockerfile
Normal file
8
Dockerfile
Normal file
@ -0,0 +1,8 @@
|
||||
FROM ehlxr/alpine
|
||||
|
||||
LABEL maintainer="ehlxr <ehlxr.me@gmail.com>"
|
||||
|
||||
COPY ./dist/ddgo_linux_amd64 /usr/local/bin/ddgo
|
||||
|
||||
|
||||
ENTRYPOINT ["/usr/local/bin/ddgo"]
|
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright © 2019 ehlxr <ehlxr.me@gmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
75
Makefile
Normal file
75
Makefile
Normal file
@ -0,0 +1,75 @@
|
||||
BUILD_VERSION := $(shell cat version)
|
||||
BUILD_TIME := $(shell date "+%F %T")
|
||||
COMMIT_SHA1 := $(shell git rev-parse HEAD)
|
||||
ROOT_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
|
||||
DIST_DIR := $(ROOT_DIR)/dist/
|
||||
|
||||
#VERSION_PATH := $(shell cat `go env GOMOD` | awk '/^module/{print $$2}')/
|
||||
VERSION_PATH := main
|
||||
LD_APP_NAMW := -X '$(VERSION_PATH).AppName=$(shell basename `pwd`)'
|
||||
LD_GIT_COMMIT := -X '$(VERSION_PATH).GitCommit=$(COMMIT_SHA1)'
|
||||
LD_BUILD_TIME := -X '$(VERSION_PATH).BuildTime=$(BUILD_TIME)'
|
||||
LD_GO_VERSION := -X '$(VERSION_PATH).GoVersion=`go version`'
|
||||
LD_VERSION := -X '$(VERSION_PATH).Version=$(BUILD_VERSION)'
|
||||
LD_FLAGS := "$(LD_APP_NAMW) $(LD_GIT_COMMIT) $(LD_BUILD_TIME) $(LD_GO_VERSION) $(LD_VERSION) -w -s"
|
||||
|
||||
RELEASE_VERSION = $(version)
|
||||
REGISTRY_URL = $(url)
|
||||
|
||||
ifeq ("$(RELEASE_VERSION)","")
|
||||
RELEASE_VERSION := $(shell echo `date "+%Y%m%d_%H%M%S"`)
|
||||
endif
|
||||
|
||||
.PHONY : build release clean install upx docker-push docker
|
||||
|
||||
build:
|
||||
ifneq ($(shell type gox >/dev/null 2>&1;echo $$?), 0)
|
||||
@echo "Can't find gox command, will start installation..."
|
||||
cd ~ && go get -v -u github.com/mitchellh/gox && cd $(ROOT_DIR)
|
||||
endif
|
||||
@# $(if $(findstring 0,$(shell type gox >/dev/null 2>&1;echo $$?)),,echo "Can't find gox command, will start installation...";GO111MODULE=off go get -v -u github.com/mitchellh/gox)
|
||||
gox -ldflags $(LD_FLAGS) -osarch="darwin/amd64 linux/386 linux/amd64 windows/amd64" \
|
||||
-output="$(DIST_DIR){{.Dir}}_{{.OS}}_{{.Arch}}"
|
||||
|
||||
docker: build upx
|
||||
ifneq ("$(REGISTRY_URL)","")
|
||||
@echo ========== current docker tag is: $(RELEASE_VERSION) ==========
|
||||
|
||||
docker build -t $(REGISTRY_URL)/monitor_server:$(RELEASE_VERSION) -f Dockerfile .
|
||||
else
|
||||
@echo "url arg should not be empty"
|
||||
endif
|
||||
|
||||
docker-push: docker
|
||||
docker push $(REGISTRY_URL)/monitor_server:$(RELEASE_VERSION)
|
||||
|
||||
clean:
|
||||
rm -rf $(DIST_DIR)*
|
||||
|
||||
install:
|
||||
go install -ldflags $(LD_FLAGS)
|
||||
|
||||
# 如果一个规则是以 .IGNORE 作为目标的,那么这个规则中所有命令都将会忽略错误
|
||||
.IGNORE:
|
||||
upx
|
||||
|
||||
# 压缩。需要安装 https://github.com/upx/upx
|
||||
upx:
|
||||
@# 在命令前面加上 "-",表示不管该命令出不出错,后面的命令都将继续执行下去
|
||||
@# -upx $(DIST_DIR)**
|
||||
upx $(DIST_DIR)**
|
||||
|
||||
release: build upx
|
||||
ifneq ($(shell type ghr >/dev/null 2>&1;echo $$?), 0)
|
||||
@echo "Can't find ghr command, will start installation..."
|
||||
cd ~ && go get -v -u github.com/tcnksm/ghr && cd $(ROOT_DIR)
|
||||
endif
|
||||
@# $(if $(findstring 0,$(shell type ghr >/dev/null 2>&1;echo $$?)),,echo "Can't find ghr command, will start installation...";GO111MODULE=off go get -v -u github.com/tcnksm/ghr)
|
||||
ghr -u ehlxr -t $(GITHUB_RELEASE_TOKEN) -replace -delete --debug ${BUILD_VERSION} $(DIST_DIR)
|
||||
|
||||
# this tells 'make' to export all variables to child processes by default.
|
||||
.EXPORT_ALL_VARIABLES:
|
||||
|
||||
GO111MODULE = on
|
||||
GOPROXY = https://goproxy.cn,direct
|
||||
GOSUMDB = sum.golang.google.cn
|
132
README.md
Normal file
132
README.md
Normal file
@ -0,0 +1,132 @@
|
||||
# JWT
|
||||
> This is a simple tool to sign, verify and show JSON Web Tokens ([JWT](http://jwt.io/)) from the command line, base [jwt-go](https://github.com/dgrijalva/jwt-go).
|
||||
|
||||
[![jwt](https://asciinema.org/a/P0O3XBCslMNam0UduazwPhB6o.png)](https://asciinema.org/a/P0O3XBCslMNam0UduazwPhB6o?autoplay=1)
|
||||
|
||||
# Install
|
||||
|
||||
build with go get
|
||||
|
||||
```
|
||||
➜ go get -u github.com/ehlxr/jwt
|
||||
```
|
||||
|
||||
build with make
|
||||
|
||||
```
|
||||
➜ git clone https://github.com/ehlxr/jwt.git
|
||||
|
||||
➜ cd jwt && make install
|
||||
```
|
||||
|
||||
or download [releases](https://github.com/ehlxr/jwt/releases) binary package.
|
||||
|
||||
# Usage
|
||||
|
||||
```
|
||||
➜ jwt
|
||||
JWT(Json Web Token) 工具
|
||||
用于生成、验证、查看 JWT
|
||||
|
||||
Usage:
|
||||
jwt [command]
|
||||
|
||||
Available Commands:
|
||||
help Help about any command
|
||||
show JWT Token 查看
|
||||
sign JWT 签名
|
||||
verify JWT token 验证
|
||||
version Print version
|
||||
|
||||
Flags:
|
||||
--config string config file (default is $HOME/.jwt.yaml)
|
||||
-h, --help help for jwt
|
||||
|
||||
Use "jwt [command] --help" for more information about a command.
|
||||
|
||||
```
|
||||
|
||||
## JWT version
|
||||
|
||||
```
|
||||
➜ jwt version
|
||||
|
||||
__ __ __ ______
|
||||
/\ \ /\ \ _ \ \ /\__ _\
|
||||
_\_\ \ \ \ \/ ".\ \ \/_/\ \/
|
||||
/\_____\ \ \__/".~\_\ \ \_\
|
||||
\/_____/ \/_/ \/_/ \/_/
|
||||
|
||||
|
||||
|
||||
Name: jwt
|
||||
Version: v1.0.2
|
||||
BuildTime: 2019-10-02 16:56:20
|
||||
GitCommit: c546aaaee1b6a6b03eabf396f9cab01718e22104
|
||||
GoVersion: go version go1.13.1 darwin/amd64
|
||||
```
|
||||
|
||||
## sign JWT
|
||||
|
||||
```
|
||||
➜ jwt sign -h
|
||||
|
||||
签名 JWT token 并复制到剪切板
|
||||
标记 * 号的 flag 为必须项
|
||||
|
||||
Usage:
|
||||
jwt sign [flags]
|
||||
|
||||
Flags:
|
||||
-c, --claims argList add additional claims. may be used more than once (default {})
|
||||
-d, --data string * path or json to claims object to sign, '-' to read from clipboard, or '+' to use only -claim args
|
||||
-H, --header argList add additional header params. may be used more than once (default {})
|
||||
-h, --help help for sign
|
||||
-k, --key string * path of keyfile or key argument
|
||||
|
||||
Global Flags:
|
||||
--config string config file (default is $HOME/.jwt.yaml)
|
||||
```
|
||||
|
||||
## show JWT
|
||||
|
||||
```
|
||||
➜ jwt show -h
|
||||
|
||||
查看 JWT Token 内容
|
||||
标记 * 号的 flag 为必须项
|
||||
|
||||
Usage:
|
||||
jwt show [flags]
|
||||
|
||||
Flags:
|
||||
-h, --help help for show
|
||||
-t, --token string * path or arg of JWT token to verify, '-' to read from clipboard
|
||||
|
||||
Global Flags:
|
||||
--config string config file (default is $HOME/.jwt.yaml)
|
||||
```
|
||||
|
||||
## verify JWT
|
||||
|
||||
```
|
||||
➜ jwt verify -h
|
||||
|
||||
验证 JWT token 是否有效
|
||||
标记 * 号的 flag 为必须项
|
||||
|
||||
Usage:
|
||||
jwt verify [flags]
|
||||
|
||||
Flags:
|
||||
-h, --help help for verify
|
||||
-k, --key string * path of keyfile or key argument
|
||||
-t, --token string * path or arg of JWT token to verify, '-' to read from clipboard
|
||||
|
||||
Global Flags:
|
||||
--config string config file (default is $HOME/.jwt.yaml)
|
||||
```
|
||||
|
||||
## Thanks to the following organizations for providing open source licenses
|
||||
|
||||
[<img src="https://cdn.ehlxr.top/jetbrains.png" width = "200" height = "217" alt="图片名称" align=center />](https://www.jetbrains.com/?from=jwt)
|
13
go.mod
Normal file
13
go.mod
Normal file
@ -0,0 +1,13 @@
|
||||
module github.com/ehlxr/monitor
|
||||
|
||||
go 1.13
|
||||
|
||||
require (
|
||||
github.com/fsnotify/fsnotify v1.4.7 // indirect
|
||||
github.com/hpcloud/tail v1.0.0
|
||||
github.com/jessevdk/go-flags v1.4.1-0.20181221193153-c0795c8afcf4
|
||||
golang.org/x/sys v0.0.0-20191113165036-4c7a9d0fe056 // indirect
|
||||
gopkg.in/fsnotify.v1 v1.4.7 // indirect
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
|
||||
unknwon.dev/clog/v2 v2.0.0-beta.5
|
||||
)
|
134
main.go
Normal file
134
main.go
Normal file
@ -0,0 +1,134 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/hpcloud/tail"
|
||||
"github.com/jessevdk/go-flags"
|
||||
"io/ioutil"
|
||||
log "unknwon.dev/clog/v2"
|
||||
|
||||
"net/http"
|
||||
"os"
|
||||
"regexp"
|
||||
)
|
||||
|
||||
var (
|
||||
AppName string
|
||||
Version string
|
||||
BuildTime string
|
||||
GitCommit string
|
||||
GoVersion string
|
||||
|
||||
versionTpl = `%s
|
||||
Name: %s
|
||||
Version: %s
|
||||
BuildTime: %s
|
||||
GitCommit: %s
|
||||
GoVersion: %s
|
||||
|
||||
`
|
||||
bannerBase64 = "DQogX19fXyAgX19fXyAgICBfX18gIF9fX19fIA0KKCAgXyBcKCAgXyBcICAvIF9fKSggIF8gICkNCiApKF8pICkpKF8pICkoIChfLS4gKShfKSggDQooX19fXy8oX19fXy8gIFxfX18vKF9fX19fKQ0K"
|
||||
|
||||
opts struct {
|
||||
MonitorFile string `short:"m" long:"monitor-file" env:"MONITOR_FILE" description:"The file to be monitored" required:"true"`
|
||||
KeyWord string `short:"k" long:"key-word" env:"KEY_WORD" description:"Key word to be filter" required:"true"`
|
||||
WebHookUrl string `short:"u" long:"webhook-url" env:"URL" description:"Webhook url of dingtalk" required:"true"`
|
||||
Version bool `short:"v" long:"version" description:"Show version info"`
|
||||
}
|
||||
)
|
||||
|
||||
func init() {
|
||||
initLog()
|
||||
}
|
||||
|
||||
func main() {
|
||||
parseArg()
|
||||
|
||||
tf, err := tail.TailFile(opts.MonitorFile,
|
||||
tail.Config{
|
||||
Follow: true,
|
||||
Location: &tail.SeekInfo{Offset: 0, Whence: 2},
|
||||
})
|
||||
if err != nil {
|
||||
log.Fatal("Tail file %+v", err)
|
||||
}
|
||||
|
||||
for line := range tf.Lines {
|
||||
if ok, _ := regexp.Match(opts.KeyWord, []byte(line.Text)); ok {
|
||||
log.Info("%s", dingToInfo(line.Text))
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
func initLog() {
|
||||
err := log.NewConsole()
|
||||
if err != nil {
|
||||
panic("unable to create new logger: " + err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
func parseArg() {
|
||||
parser := flags.NewParser(&opts, flags.HelpFlag|flags.PassDoubleDash)
|
||||
if AppName != "" {
|
||||
parser.Name = AppName
|
||||
}
|
||||
|
||||
if _, err := parser.Parse(); err != nil {
|
||||
if opts.Version {
|
||||
printVersion()
|
||||
os.Exit(0)
|
||||
}
|
||||
|
||||
if flagsErr, ok := err.(*flags.Error); ok && flagsErr.Type == flags.ErrHelp {
|
||||
_, _ = fmt.Fprintln(os.Stdout, err)
|
||||
os.Exit(0)
|
||||
}
|
||||
|
||||
_, _ = fmt.Fprintln(os.Stderr, err)
|
||||
|
||||
parser.WriteHelp(os.Stderr)
|
||||
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
func dingToInfo(msg string) []byte {
|
||||
content, data := make(map[string]string), make(map[string]interface{})
|
||||
|
||||
content["content"] = msg
|
||||
data["msgtype"] = "text"
|
||||
data["text"] = content
|
||||
b, _ := json.Marshal(data)
|
||||
|
||||
log.Info("send to %s data <%s>",
|
||||
opts.WebHookUrl,
|
||||
b)
|
||||
|
||||
resp, err := http.Post(opts.WebHookUrl,
|
||||
"application/json",
|
||||
bytes.NewBuffer(b))
|
||||
if err != nil {
|
||||
log.Error("send request to %s %+v",
|
||||
opts.WebHookUrl,
|
||||
err)
|
||||
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
body, _ := ioutil.ReadAll(resp.Body)
|
||||
log.Info("send to %s data <%s> result is %s",
|
||||
opts.WebHookUrl,
|
||||
b,
|
||||
body)
|
||||
return body
|
||||
}
|
||||
|
||||
// printVersion Print out version information
|
||||
func printVersion() {
|
||||
banner, _ := base64.StdEncoding.DecodeString(bannerBase64)
|
||||
fmt.Printf(versionTpl, banner, AppName, Version, BuildTime, GitCommit, GoVersion)
|
||||
}
|
Loading…
Reference in New Issue
Block a user