Compare commits
10 Commits
054097421d
...
c77704d26f
Author | SHA1 | Date |
---|---|---|
|
c77704d26f | |
|
5f0815568d | |
|
da659e0f9e | |
|
9ea167e676 | |
|
e4046d5ff9 | |
|
2ecac5b7b6 | |
|
2be0e97682 | |
|
35be204775 | |
|
a2c6c477f1 | |
|
59073c434c |
|
@ -39,7 +39,7 @@ jobs:
|
|||
- name: Set up Go
|
||||
uses: actions/setup-go@v3
|
||||
with:
|
||||
go-version: 1.18
|
||||
go-version: "1.20"
|
||||
|
||||
- name: Build binary file
|
||||
env:
|
||||
|
|
|
@ -26,7 +26,7 @@ jobs:
|
|||
name: Set up Go
|
||||
uses: actions/setup-go@v3
|
||||
with:
|
||||
go-version: 1.18
|
||||
go-version: "1.20"
|
||||
-
|
||||
name: Cache Go modules
|
||||
uses: actions/cache@v3
|
||||
|
|
|
@ -17,7 +17,7 @@ jobs:
|
|||
- name: Set up Go
|
||||
uses: actions/setup-go@v2
|
||||
with:
|
||||
go-version: '1.18'
|
||||
go-version: '1.20'
|
||||
|
||||
- name: Run GoReleaser
|
||||
uses: goreleaser/goreleaser-action@v2
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
/data/
|
||||
/data/**
|
||||
/.idea/
|
||||
/static/
|
||||
*.exe
|
||||
*.log
|
||||
|
||||
/dist/
|
||||
/data/
|
||||
/ql/
|
||||
|
|
|
@ -15,7 +15,7 @@ ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/local/go/bin:/usr/sbin:/usr/bin:/sb
|
|||
|
||||
WORKDIR ${QL_DIR}
|
||||
|
||||
COPY --from=golang:1.18-alpine /usr/local/go/ /usr/local/go/
|
||||
COPY --from=golang:1.20-alpine /usr/local/go/ /usr/local/go/
|
||||
|
||||
RUN set -x \
|
||||
&& sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
|
||||
|
@ -41,12 +41,12 @@ RUN set -x \
|
|||
&& git config --global user.email "qinglong@@users.noreply.github.com" \
|
||||
&& git config --global user.name "qinglong" \
|
||||
&& git config --global http.postBuffer 524288000 \
|
||||
&& npm install -g yarn \
|
||||
&& npm install -g pnpm \
|
||||
&& rm -rf /root/.cache \
|
||||
&& rm -rf /root/.npm \
|
||||
&& mkdir -p ${QL_DIR}/data \
|
||||
&& cd ${QL_DIR} \
|
||||
&& wget https://github.com/huoxue1/qinglong/releases/download/v1.0.0/static.tar.gz \
|
||||
&& wget https://github.com/huoxue1/qinglong/releases/download/v1.0.1/static.tar.gz \
|
||||
&& tar -xzvf static.tar.gz
|
||||
|
||||
COPY ./dist/docker_linux_$TARGETARCH*/qinglong-go ${QL_DIR}/ql
|
||||
|
|
|
@ -10,6 +10,7 @@ import (
|
|||
"github.com/huoxue1/qinglong-go/api/open"
|
||||
"github.com/huoxue1/qinglong-go/api/public"
|
||||
"github.com/huoxue1/qinglong-go/api/scripts"
|
||||
"github.com/huoxue1/qinglong-go/api/server"
|
||||
"github.com/huoxue1/qinglong-go/api/subscription"
|
||||
"github.com/huoxue1/qinglong-go/api/system"
|
||||
"github.com/huoxue1/qinglong-go/api/user"
|
||||
|
@ -29,4 +30,5 @@ func Api(group *gin.RouterGroup) {
|
|||
dependencies.Api(group.Group("/dependencies"))
|
||||
ws.Api(group.Group("/ws"))
|
||||
public.Api(group.Group("/public"))
|
||||
server.Api(group.Group("/server"))
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@ package config
|
|||
|
||||
import (
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/huoxue1/qinglong-go/utils/res"
|
||||
"github.com/huoxue1/qinglong-go/internal/res"
|
||||
"os"
|
||||
)
|
||||
|
||||
|
|
|
@ -2,9 +2,9 @@ package cron
|
|||
|
||||
import (
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/huoxue1/qinglong-go/internal/res"
|
||||
"github.com/huoxue1/qinglong-go/models"
|
||||
"github.com/huoxue1/qinglong-go/service/cron"
|
||||
"github.com/huoxue1/qinglong-go/utils/res"
|
||||
"os"
|
||||
"strconv"
|
||||
"time"
|
||||
|
|
|
@ -2,9 +2,9 @@ package dependencies
|
|||
|
||||
import (
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/huoxue1/qinglong-go/internal/res"
|
||||
"github.com/huoxue1/qinglong-go/models"
|
||||
"github.com/huoxue1/qinglong-go/service/dependencies"
|
||||
"github.com/huoxue1/qinglong-go/utils/res"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
|
@ -12,6 +12,8 @@ func Api(group *gin.RouterGroup) {
|
|||
group.POST("", post())
|
||||
group.GET("", get())
|
||||
group.GET("/:id", getDep())
|
||||
|
||||
group.DELETE("", del())
|
||||
}
|
||||
|
||||
var (
|
||||
|
@ -34,6 +36,20 @@ func get() gin.HandlerFunc {
|
|||
}
|
||||
}
|
||||
|
||||
func del() gin.HandlerFunc {
|
||||
|
||||
return func(ctx *gin.Context) {
|
||||
var ids []int
|
||||
err := ctx.ShouldBindJSON(&ids)
|
||||
if err != nil {
|
||||
ctx.JSON(503, res.Err(502, err))
|
||||
return
|
||||
}
|
||||
dependencies.DelDep(ids)
|
||||
ctx.JSON(200, res.Ok(true))
|
||||
}
|
||||
}
|
||||
|
||||
func post() gin.HandlerFunc {
|
||||
return func(ctx *gin.Context) {
|
||||
var deps []*models.Dependences
|
||||
|
|
|
@ -3,10 +3,11 @@ package env
|
|||
import (
|
||||
"encoding/json"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/huoxue1/qinglong-go/internal/res"
|
||||
"github.com/huoxue1/qinglong-go/models"
|
||||
"github.com/huoxue1/qinglong-go/service/env"
|
||||
"github.com/huoxue1/qinglong-go/utils/res"
|
||||
"io"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
|
||||
|
@ -18,6 +19,29 @@ func Api(group *gin.RouterGroup) {
|
|||
group.PUT("/enable", enable())
|
||||
group.PUT("/disable", disable())
|
||||
group.POST("/upload", upload())
|
||||
group.PUT("/:id/move", move())
|
||||
}
|
||||
|
||||
func move() gin.HandlerFunc {
|
||||
return func(ctx *gin.Context) {
|
||||
id, _ := strconv.Atoi(ctx.Param("id"))
|
||||
type req struct {
|
||||
FromIndex int64 `json:"fromIndex"`
|
||||
ToIndex int64 `json:"toIndex"`
|
||||
}
|
||||
r := new(req)
|
||||
err := ctx.ShouldBindJSON(r)
|
||||
if err != nil {
|
||||
ctx.JSON(503, res.Err(503, err))
|
||||
return
|
||||
}
|
||||
err = env.MoveEnv(id, r.FromIndex, r.ToIndex)
|
||||
if err != nil {
|
||||
ctx.JSON(503, res.Err(503, err))
|
||||
return
|
||||
}
|
||||
ctx.JSON(200, res.Ok(true))
|
||||
}
|
||||
}
|
||||
|
||||
func get() gin.HandlerFunc {
|
||||
|
@ -25,6 +49,7 @@ func get() gin.HandlerFunc {
|
|||
envs, err := env.QueryEnv(ctx.Query("searchValue"))
|
||||
if err != nil {
|
||||
ctx.JSON(503, res.Err(503, err))
|
||||
return
|
||||
}
|
||||
ctx.JSON(200, res.Ok(envs))
|
||||
}
|
||||
|
|
|
@ -3,8 +3,8 @@ package logs
|
|||
import (
|
||||
"fmt"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/huoxue1/qinglong-go/internal/res"
|
||||
"github.com/huoxue1/qinglong-go/service/scripts"
|
||||
"github.com/huoxue1/qinglong-go/utils/res"
|
||||
"os"
|
||||
"path"
|
||||
)
|
||||
|
|
|
@ -1,17 +1,16 @@
|
|||
package api
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/huoxue1/qinglong-go/models"
|
||||
"github.com/huoxue1/qinglong-go/utils"
|
||||
"github.com/huoxue1/qinglong-go/utils/res"
|
||||
"os"
|
||||
"path"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/huoxue1/qinglong-go/internal/auth"
|
||||
"github.com/huoxue1/qinglong-go/internal/res"
|
||||
"github.com/huoxue1/qinglong-go/models"
|
||||
"github.com/huoxue1/qinglong-go/utils"
|
||||
)
|
||||
|
||||
var (
|
||||
|
@ -20,6 +19,9 @@ var (
|
|||
"/api/user/login",
|
||||
"/api/user/init",
|
||||
"api/public/panel/log",
|
||||
"/api/user/notification/init",
|
||||
"/api/user/two-factor/login",
|
||||
"/api/server",
|
||||
}
|
||||
)
|
||||
|
||||
|
@ -36,14 +38,14 @@ func OpenJwt() gin.HandlerFunc {
|
|||
return
|
||||
}
|
||||
authToken := strings.Split(tokenHeader, " ")[1]
|
||||
claims, _ := utils.ParseToken(authToken)
|
||||
if claims.ExpiresAt < time.Now().Unix() {
|
||||
userId, exp, _ := utils.ParseToken(authToken)
|
||||
if exp < time.Now().Unix() {
|
||||
ctx.JSON(401, res.Err(401, errors.New("the authorization token is expired")))
|
||||
ctx.Abort()
|
||||
return
|
||||
}
|
||||
userId, _ := strconv.Atoi(claims.UserID)
|
||||
app, err := models.GetApp(userId)
|
||||
id, _ := strconv.Atoi(userId)
|
||||
app, err := models.GetApp(id)
|
||||
if err != nil {
|
||||
ctx.JSON(401, res.Err(401, errors.New("the authorization token is invalid")))
|
||||
ctx.Abort()
|
||||
|
@ -68,13 +70,12 @@ func Jwt() gin.HandlerFunc {
|
|||
}
|
||||
}
|
||||
|
||||
data, err := os.ReadFile(path.Join("data", "config", "auth.json"))
|
||||
authFile, err := auth.GetAuthInfo()
|
||||
if err != nil {
|
||||
ctx.JSON(401, res.Err(401, errors.New("the authorization fail")))
|
||||
ctx.Abort()
|
||||
return
|
||||
}
|
||||
auth := new(models.AuthFile)
|
||||
_ = json.Unmarshal(data, auth)
|
||||
tokenHeader := ctx.GetHeader("Authorization")
|
||||
if tokenHeader == "" {
|
||||
queryToken, b := ctx.GetQuery("token")
|
||||
|
@ -90,19 +91,19 @@ func Jwt() gin.HandlerFunc {
|
|||
authToken := strings.Split(tokenHeader, " ")[1]
|
||||
|
||||
mobile := utils.IsMobile(ctx.GetHeader("User-Agent"))
|
||||
claims, err := utils.ParseToken(authToken)
|
||||
_, exp, err := utils.ParseToken(authToken)
|
||||
if err != nil {
|
||||
ctx.JSON(401, res.Err(401, errors.New("the authorization fail")))
|
||||
ctx.Abort()
|
||||
return
|
||||
}
|
||||
if claims.ExpiresAt < time.Now().Unix() {
|
||||
if exp < time.Now().Unix() {
|
||||
ctx.JSON(401, res.Err(401, errors.New("the authorization token is expired")))
|
||||
ctx.Abort()
|
||||
return
|
||||
}
|
||||
if mobile {
|
||||
if authToken != auth.Tokens.Mobile && authToken != auth.Token {
|
||||
if authToken != authFile.Tokens.Mobile && authToken != authFile.Token {
|
||||
ctx.JSON(401, res.Err(401, errors.New("the authorization token is error")))
|
||||
ctx.Abort()
|
||||
return
|
||||
|
@ -111,7 +112,7 @@ func Jwt() gin.HandlerFunc {
|
|||
return
|
||||
}
|
||||
} else {
|
||||
if authToken != auth.Tokens.Desktop && authToken != auth.Token {
|
||||
if authToken != authFile.Tokens.Desktop && authToken != authFile.Token {
|
||||
ctx.JSON(401, res.Err(401, errors.New("the authorization token is error")))
|
||||
ctx.Abort()
|
||||
return
|
||||
|
|
|
@ -9,6 +9,7 @@ import (
|
|||
"github.com/huoxue1/qinglong-go/api/logs"
|
||||
"github.com/huoxue1/qinglong-go/api/open"
|
||||
"github.com/huoxue1/qinglong-go/api/scripts"
|
||||
"github.com/huoxue1/qinglong-go/api/server"
|
||||
"github.com/huoxue1/qinglong-go/api/subscription"
|
||||
"github.com/huoxue1/qinglong-go/api/system"
|
||||
)
|
||||
|
@ -24,4 +25,5 @@ func Open(group *gin.RouterGroup) {
|
|||
subscription.Api(group.Group("/subscriptions"))
|
||||
logs.APi(group.Group("/logs"))
|
||||
dependencies.Api(group.Group("/dependencies"))
|
||||
server.Api(group.Group("/server"))
|
||||
}
|
||||
|
|
|
@ -3,9 +3,9 @@ package open
|
|||
import (
|
||||
"errors"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/huoxue1/qinglong-go/internal/res"
|
||||
"github.com/huoxue1/qinglong-go/models"
|
||||
"github.com/huoxue1/qinglong-go/utils"
|
||||
"github.com/huoxue1/qinglong-go/utils/res"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
|
|
|
@ -2,9 +2,9 @@ package open
|
|||
|
||||
import (
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/huoxue1/qinglong-go/internal/res"
|
||||
"github.com/huoxue1/qinglong-go/models"
|
||||
"github.com/huoxue1/qinglong-go/service/open"
|
||||
"github.com/huoxue1/qinglong-go/utils/res"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
|
|
|
@ -3,8 +3,8 @@ package scripts
|
|||
import (
|
||||
"fmt"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/huoxue1/qinglong-go/internal/res"
|
||||
"github.com/huoxue1/qinglong-go/service/scripts"
|
||||
"github.com/huoxue1/qinglong-go/utils/res"
|
||||
"os"
|
||||
path2 "path"
|
||||
)
|
||||
|
@ -60,7 +60,7 @@ func run() gin.HandlerFunc {
|
|||
ctx.JSON(503, res.Err(503, err))
|
||||
return
|
||||
}
|
||||
id, err := scripts.Run(path2.Join(r.Path, "_"+r.FileName), r.Content)
|
||||
id, err := scripts.Run(path2.Join(r.Path, "temp_"+r.FileName), r.Content)
|
||||
if err != nil {
|
||||
ctx.JSON(503, res.Err(503, err))
|
||||
return
|
||||
|
@ -132,11 +132,13 @@ func post() gin.HandlerFunc {
|
|||
}
|
||||
|
||||
} else {
|
||||
_, err := os.Create(path2.Join("data", "scripts", r.Path, r.FileName))
|
||||
f, err := os.Create(path2.Join("data", "scripts", r.Path, r.FileName))
|
||||
if err != nil {
|
||||
ctx.JSON(503, res.Err(503, err))
|
||||
return
|
||||
}
|
||||
_, _ = f.WriteString(r.Content)
|
||||
_ = f.Close()
|
||||
}
|
||||
ctx.JSON(200, res.Ok(true))
|
||||
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
package server
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/huoxue1/qinglong-go/service/server"
|
||||
)
|
||||
|
||||
func Api(group *gin.RouterGroup) {
|
||||
group.Match([]string{
|
||||
http.MethodGet,
|
||||
http.MethodPost,
|
||||
http.MethodDelete,
|
||||
http.MethodPut,
|
||||
http.MethodOptions,
|
||||
}, "/:path", handle())
|
||||
}
|
||||
|
||||
func handle() gin.HandlerFunc {
|
||||
return func(ctx *gin.Context) {
|
||||
path := ctx.Param("path")
|
||||
query := make(map[string]string)
|
||||
ctx.ShouldBindQuery(&query)
|
||||
headers := make(map[string]string)
|
||||
ctx.ShouldBindHeader(&headers)
|
||||
|
||||
body := make(map[string]any)
|
||||
ctx.ShouldBind(&body)
|
||||
data := server.Run(ctx, path, query, body, headers, false)
|
||||
ctx.Writer.WriteHeader(200)
|
||||
ctx.Writer.Header().Add("Content-Type", "application/json")
|
||||
_, _ = ctx.Writer.WriteString(data)
|
||||
}
|
||||
}
|
|
@ -2,9 +2,9 @@ package subscription
|
|||
|
||||
import (
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/huoxue1/qinglong-go/internal/res"
|
||||
"github.com/huoxue1/qinglong-go/models"
|
||||
"github.com/huoxue1/qinglong-go/service/subscription"
|
||||
"github.com/huoxue1/qinglong-go/utils/res"
|
||||
"os"
|
||||
"strconv"
|
||||
)
|
||||
|
|
|
@ -2,11 +2,10 @@ package system
|
|||
|
||||
import (
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/huoxue1/qinglong-go/internal/auth"
|
||||
"github.com/huoxue1/qinglong-go/internal/res"
|
||||
"github.com/huoxue1/qinglong-go/service/config"
|
||||
"github.com/huoxue1/qinglong-go/service/system"
|
||||
"github.com/huoxue1/qinglong-go/utils/res"
|
||||
"os"
|
||||
"path"
|
||||
)
|
||||
|
||||
func Api(group *gin.RouterGroup) {
|
||||
|
@ -15,10 +14,9 @@ func Api(group *gin.RouterGroup) {
|
|||
|
||||
func get() gin.HandlerFunc {
|
||||
return func(ctx *gin.Context) {
|
||||
_, err := os.Stat(path.Join("data", "config", "auth.json"))
|
||||
exist := os.IsNotExist(err)
|
||||
|
||||
ctx.JSON(200, res.Ok(system.System{
|
||||
IsInitialized: !exist,
|
||||
IsInitialized: auth.IsInit(),
|
||||
Version: config.GetVersion(),
|
||||
LastCommitTime: "",
|
||||
LastCommitId: "",
|
||||
|
|
|
@ -3,8 +3,8 @@ package user
|
|||
import (
|
||||
"encoding/json"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/huoxue1/qinglong-go/internal/res"
|
||||
"github.com/huoxue1/qinglong-go/service/notification"
|
||||
"github.com/huoxue1/qinglong-go/utils/res"
|
||||
"os"
|
||||
"path"
|
||||
)
|
||||
|
@ -29,6 +29,7 @@ func putNotification() gin.HandlerFunc {
|
|||
ctx.JSON(403, res.Err(403, err))
|
||||
return
|
||||
}
|
||||
_ = os.MkdirAll(path.Join("data", "config"), 0666)
|
||||
err = notification.HandlePush(string(data))
|
||||
if err != nil {
|
||||
ctx.JSON(503, res.Err(503, err))
|
||||
|
|
225
api/user/user.go
225
api/user/user.go
|
@ -2,22 +2,19 @@ package user
|
|||
|
||||
import (
|
||||
_ "embed"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/huoxue1/qinglong-go/models"
|
||||
"github.com/huoxue1/qinglong-go/internal/auth"
|
||||
"github.com/huoxue1/qinglong-go/internal/res"
|
||||
"github.com/huoxue1/qinglong-go/service/notification"
|
||||
"github.com/huoxue1/qinglong-go/service/user"
|
||||
"github.com/huoxue1/qinglong-go/utils"
|
||||
"github.com/huoxue1/qinglong-go/utils/res"
|
||||
"os"
|
||||
"path"
|
||||
"time"
|
||||
)
|
||||
|
||||
//go:embed config_sample.sh
|
||||
var sample []byte
|
||||
|
||||
//go:embed package_sample.json
|
||||
var pack []byte
|
||||
|
||||
|
@ -29,6 +26,162 @@ func Api(group *gin.RouterGroup) {
|
|||
group.PUT("/notification/init", putNotification())
|
||||
group.PUT("/notification", putNotification())
|
||||
group.GET("/notification", getNotification())
|
||||
group.GET("/two-factor/init", twoFactorInit())
|
||||
group.PUT("/two-factor/active", twoFactorActive())
|
||||
group.PUT("/two-factor/login", twoFactorLogin())
|
||||
group.PUT("/two-factor/deactive", twoFactorDeactive())
|
||||
}
|
||||
|
||||
func twoFactorDeactive() gin.HandlerFunc {
|
||||
return func(ctx *gin.Context) {
|
||||
info, err := auth.GetAuthInfo()
|
||||
if err != nil {
|
||||
ctx.JSON(401, res.Err(401, err))
|
||||
return
|
||||
}
|
||||
info.TwoFactorSecret = ""
|
||||
info.IsTwoFactorChecking = false
|
||||
err = auth.UpdateAuthInfo(info)
|
||||
if err != nil {
|
||||
ctx.JSON(500, res.Err(500, err))
|
||||
return
|
||||
}
|
||||
ctx.JSON(200, res.Ok(nil))
|
||||
}
|
||||
}
|
||||
|
||||
func twoFactorLogin() gin.HandlerFunc {
|
||||
return func(ctx *gin.Context) {
|
||||
info, err := auth.GetAuthInfo()
|
||||
if err != nil {
|
||||
ctx.JSON(401, res.Err(401, err))
|
||||
return
|
||||
}
|
||||
if info.TwoFactorSecret == "" {
|
||||
ctx.JSON(400, res.Err(400, errors.New("the two factor is not initialized")))
|
||||
return
|
||||
}
|
||||
type req struct {
|
||||
UserName string `json:"username"`
|
||||
Password string `json:"password"`
|
||||
Code string `json:"code"`
|
||||
}
|
||||
var r req
|
||||
err = ctx.ShouldBindJSON(&r)
|
||||
if err != nil {
|
||||
ctx.JSON(400, res.Err(400, err))
|
||||
return
|
||||
}
|
||||
|
||||
if info.Username != r.UserName || info.Password != r.Password {
|
||||
ctx.JSON(400, res.Err(400, errors.New("the username or password is invalid")))
|
||||
return
|
||||
}
|
||||
|
||||
if !auth.VerifyTOTP(info.TwoFactorSecret, r.Code) {
|
||||
ctx.JSON(400, res.Err(400, errors.New("the two factor code is invalid")))
|
||||
return
|
||||
}
|
||||
token, err := utils.GenerateToken(r.UserName, 48)
|
||||
if err != nil {
|
||||
ctx.JSON(503, res.Err(503, err))
|
||||
return
|
||||
}
|
||||
ip, err := user.GetNetIp(ctx.RemoteIP())
|
||||
if err != nil {
|
||||
ip = new(user.Ip)
|
||||
err = nil
|
||||
}
|
||||
mobile := utils.IsMobile(ctx.GetHeader("User-Agent"))
|
||||
if mobile {
|
||||
info.Tokens.Mobile = token
|
||||
info.Token = token
|
||||
err := auth.UpdateAuthInfo(info)
|
||||
if err != nil {
|
||||
ctx.JSON(503, res.Err(503, err))
|
||||
return
|
||||
}
|
||||
notification.Push.Send("登录通知", fmt.Sprintf("你于%s登录mobile端登录成功,ip地址 %s", time.Now().Format("2006-01-02 15:04:05"), ctx.ClientIP()))
|
||||
ctx.JSON(200, res.Ok(gin.H{
|
||||
"token": token,
|
||||
"platform": "mobile",
|
||||
"retries": 0,
|
||||
"lastip": ctx.RemoteIP(),
|
||||
"lastaddr": ip.Addr,
|
||||
"lastlogon": time.Now().UnixNano(),
|
||||
}))
|
||||
} else {
|
||||
info.Tokens.Desktop = token
|
||||
info.Token = token
|
||||
err := auth.UpdateAuthInfo(info)
|
||||
if err != nil {
|
||||
ctx.JSON(503, res.Err(503, err))
|
||||
return
|
||||
}
|
||||
notification.Push.Send("登录通知", fmt.Sprintf("你于%s登录pc端登录成功,ip地址 %s", time.Now().Format("2006-01-02 15:04:05"), ctx.ClientIP()))
|
||||
ctx.JSON(200, res.Ok(gin.H{
|
||||
"token": token,
|
||||
"platform": "desktop",
|
||||
"retries": 0,
|
||||
"lastip": ctx.RemoteIP(),
|
||||
"lastaddr": ip.Addr,
|
||||
"lastlogon": time.Now().Unix(),
|
||||
}))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func twoFactorActive() gin.HandlerFunc {
|
||||
return func(ctx *gin.Context) {
|
||||
info, err := auth.GetAuthInfo()
|
||||
if err != nil {
|
||||
ctx.JSON(401, res.Err(401, err))
|
||||
return
|
||||
}
|
||||
if info.TwoFactorSecret == "" {
|
||||
ctx.JSON(400, res.Err(400, errors.New("the two factor is not initialized")))
|
||||
return
|
||||
}
|
||||
type req struct {
|
||||
Code string `json:"code"`
|
||||
}
|
||||
var r req
|
||||
err = ctx.ShouldBindJSON(&r)
|
||||
if err != nil {
|
||||
ctx.JSON(400, res.Err(400, err))
|
||||
return
|
||||
}
|
||||
if !auth.VerifyTOTP(info.TwoFactorSecret, r.Code) {
|
||||
ctx.JSON(400, res.Err(400, errors.New("the two factor code is invalid")))
|
||||
return
|
||||
}
|
||||
info.IsTwoFactorChecking = true
|
||||
_ = auth.UpdateAuthInfo(info)
|
||||
ctx.JSON(200, res.Ok(true))
|
||||
}
|
||||
}
|
||||
|
||||
func twoFactorInit() gin.HandlerFunc {
|
||||
return func(ctx *gin.Context) {
|
||||
info, err := auth.GetAuthInfo()
|
||||
if err != nil {
|
||||
ctx.JSON(401, res.Err(401, err))
|
||||
return
|
||||
}
|
||||
//if info.TwoFactorSecret != "" {
|
||||
// ctx.JSON(400, res.Err(400, errors.New("the two factor is initialized")))
|
||||
// return
|
||||
//}
|
||||
secret, qrcode, err := auth.GenerateTOTP(info.Username, "qinglong-go")
|
||||
if err != nil {
|
||||
ctx.JSON(500, res.Err(500, err))
|
||||
return
|
||||
}
|
||||
info.TwoFactorSecret = secret
|
||||
_ = auth.UpdateAuthInfo(info)
|
||||
ctx.JSON(200, res.Ok(gin.H{"secret": secret, "url": qrcode}))
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
func logout() gin.HandlerFunc {
|
||||
|
@ -39,50 +192,46 @@ func logout() gin.HandlerFunc {
|
|||
|
||||
func get() gin.HandlerFunc {
|
||||
return func(ctx *gin.Context) {
|
||||
info, err := user.GetUserInfo()
|
||||
info, err := auth.GetAuthInfo()
|
||||
if err != nil {
|
||||
|
||||
ctx.JSON(401, res.Err(401, err))
|
||||
return
|
||||
}
|
||||
ctx.JSON(200, res.Ok(gin.H{"username": info.Username}))
|
||||
ctx.JSON(200, res.Ok(gin.H{"username": info.Username, "twoFactorActivated": info.IsTwoFactorChecking}))
|
||||
}
|
||||
}
|
||||
|
||||
func appInit() gin.HandlerFunc {
|
||||
return func(ctx *gin.Context) {
|
||||
_, err := os.Stat(path.Join("data", "config", "auth.json"))
|
||||
exist := os.IsExist(err)
|
||||
if exist {
|
||||
ctx.JSON(400, res.Err(400, err))
|
||||
isInit := auth.IsInit()
|
||||
if isInit {
|
||||
ctx.JSON(400, res.Err(400, errors.New("the app is initialized")))
|
||||
return
|
||||
}
|
||||
_ = os.MkdirAll(path.Join("data", "config"), 0666)
|
||||
_ = os.MkdirAll(path.Join("data", "deps"), 0666)
|
||||
_ = os.Link(path.Join("data", "deps"), path.Join("data", "scripts", "deps"))
|
||||
_ = os.MkdirAll(path.Join("data", "log"), 0666)
|
||||
_ = os.MkdirAll(path.Join("data", "repo"), 0666)
|
||||
_ = os.MkdirAll(path.Join("data", "scripts"), 0666)
|
||||
_ = os.MkdirAll(path.Join("data", "deps"), 0666)
|
||||
_ = os.MkdirAll(path.Join("data", "raw"), 0666)
|
||||
_ = os.WriteFile(path.Join("data", "config", "config.sh"), sample, 0666)
|
||||
_ = os.WriteFile(path.Join("data", "scripts", "package.json"), pack, 0666)
|
||||
_ = os.WriteFile(path.Join("data", "config", "config.sample.sh"), sample, 0666)
|
||||
|
||||
type Req struct {
|
||||
UserName string `json:"username"`
|
||||
Password string `json:"password"`
|
||||
}
|
||||
r := new(Req)
|
||||
err = ctx.ShouldBindJSON(r)
|
||||
err := ctx.ShouldBindJSON(r)
|
||||
if err != nil {
|
||||
ctx.JSON(503, res.ErrMessage(503, err.Error()))
|
||||
return
|
||||
}
|
||||
m := new(models.AuthFile)
|
||||
m.Username = r.UserName
|
||||
m.Password = r.Password
|
||||
m.Tokens.Mobile = ""
|
||||
m.Tokens.Desktop = ""
|
||||
data, _ := json.Marshal(m)
|
||||
_ = os.WriteFile(path.Join("data", "config", "auth.json"), data, 0666)
|
||||
err = auth.InitAuthInfo(r.UserName, r.Password)
|
||||
if err != nil {
|
||||
ctx.JSON(503, res.Err(503, err))
|
||||
return
|
||||
}
|
||||
ctx.JSON(200, res.Ok(true))
|
||||
}
|
||||
}
|
||||
|
@ -99,14 +248,18 @@ func login() gin.HandlerFunc {
|
|||
ctx.JSON(503, res.Err(503, err))
|
||||
return
|
||||
}
|
||||
data, err := os.ReadFile(path.Join("data", "config", "auth.json"))
|
||||
authInfo, err := auth.GetAuthInfo()
|
||||
if err != nil {
|
||||
ctx.Abort()
|
||||
ctx.JSON(503, res.Err(503, err))
|
||||
return
|
||||
}
|
||||
auth := new(models.AuthFile)
|
||||
_ = json.Unmarshal(data, auth)
|
||||
if auth.Username == r.UserName && auth.Password == r.Password {
|
||||
|
||||
if authInfo.IsTwoFactorChecking {
|
||||
ctx.JSON(200, res.Err(420, errors.New("")))
|
||||
return
|
||||
}
|
||||
|
||||
if authInfo.Username == r.UserName && authInfo.Password == r.Password {
|
||||
token, err := utils.GenerateToken(r.UserName, 48)
|
||||
if err != nil {
|
||||
ctx.JSON(503, res.Err(503, err))
|
||||
|
@ -119,10 +272,9 @@ func login() gin.HandlerFunc {
|
|||
}
|
||||
mobile := utils.IsMobile(ctx.GetHeader("User-Agent"))
|
||||
if mobile {
|
||||
auth.Tokens.Mobile = token
|
||||
auth.Token = token
|
||||
file, _ := json.Marshal(auth)
|
||||
err := os.WriteFile(path.Join("data", "config", "auth.json"), file, 0666)
|
||||
authInfo.Tokens.Mobile = token
|
||||
authInfo.Token = token
|
||||
err := auth.UpdateAuthInfo(authInfo)
|
||||
if err != nil {
|
||||
ctx.JSON(503, res.Err(503, err))
|
||||
return
|
||||
|
@ -137,10 +289,9 @@ func login() gin.HandlerFunc {
|
|||
"lastlogon": time.Now().UnixNano(),
|
||||
}))
|
||||
} else {
|
||||
auth.Tokens.Desktop = token
|
||||
auth.Token = token
|
||||
file, _ := json.Marshal(auth)
|
||||
err := os.WriteFile(path.Join("data", "config", "auth.json"), file, 0666)
|
||||
authInfo.Tokens.Desktop = token
|
||||
authInfo.Token = token
|
||||
err := auth.UpdateAuthInfo(authInfo)
|
||||
if err != nil {
|
||||
ctx.JSON(503, res.Err(503, err))
|
||||
return
|
||||
|
|
|
@ -3,8 +3,8 @@ package ws
|
|||
import (
|
||||
"context"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/huoxue1/qinglong-go/internal/res"
|
||||
"github.com/huoxue1/qinglong-go/service/client"
|
||||
"github.com/huoxue1/qinglong-go/utils/res"
|
||||
"nhooyr.io/websocket"
|
||||
"nhooyr.io/websocket/wsjson"
|
||||
"time"
|
||||
|
|
|
@ -0,0 +1,41 @@
|
|||
package cmd
|
||||
|
||||
import (
|
||||
"github.com/huoxue1/qinglong-go/controller"
|
||||
"github.com/huoxue1/qinglong-go/models"
|
||||
"github.com/huoxue1/qinglong-go/service"
|
||||
env_check "github.com/huoxue1/qinglong-go/utils/env-check"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
var (
|
||||
address string
|
||||
|
||||
rootCMd = &cobra.Command{
|
||||
Use: "qinglong",
|
||||
Aliases: []string{"ql"},
|
||||
PreRun: func(cmd *cobra.Command, args []string) {
|
||||
models.InitModels()
|
||||
initCron()
|
||||
env_check.CheckStatic()
|
||||
service.AppInit()
|
||||
},
|
||||
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
|
||||
engine := controller.Router()
|
||||
_ = engine.Run(address)
|
||||
},
|
||||
PostRun: func(cmd *cobra.Command, args []string) {
|
||||
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
func Run() {
|
||||
rootCMd.PersistentFlags().StringVarP(&address, "address", "a", "0.0.0.0:5700", "the ql listen address!")
|
||||
InitLog()
|
||||
if err := rootCMd.Execute(); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
package cmd
|
||||
|
||||
import (
|
||||
"github.com/huoxue1/go-utils/base/log"
|
||||
"github.com/huoxue1/go-utils/base/log/hook/file"
|
||||
"github.com/huoxue1/go-utils/base/log/hook/std"
|
||||
fileInit "github.com/huoxue1/qinglong-go/internal/init"
|
||||
"github.com/huoxue1/qinglong-go/models"
|
||||
"github.com/huoxue1/qinglong-go/service/config"
|
||||
"github.com/huoxue1/qinglong-go/service/cron"
|
||||
"github.com/huoxue1/qinglong-go/service/subscription"
|
||||
"github.com/huoxue1/qinglong-go/utils"
|
||||
"path"
|
||||
)
|
||||
|
||||
func InitLog() {
|
||||
if !utils.FileExist(path.Join("data", "config", "config.sh")) {
|
||||
fileInit.InitConfig()
|
||||
}
|
||||
level := config.GetKey("logLevel", "info")
|
||||
fileHook, _ := file.NewFileHook(file.WithLevel(level), file.WithDir(path.Join("data", "log")))
|
||||
log.AddHook(std.NewStdHook(std.WithLevel(level)))
|
||||
log.AddHook(fileHook)
|
||||
}
|
||||
|
||||
func initCron() {
|
||||
cron.InitTask()
|
||||
subscription.InitSub()
|
||||
models.SetAllCornStop()
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
package cmd
|
|
@ -0,0 +1 @@
|
|||
package cmd
|
|
@ -13,7 +13,7 @@ func Router() *gin.Engine {
|
|||
engine := gin.New()
|
||||
engine.Use(gin.Logger())
|
||||
engine.Use(gin.Recovery())
|
||||
engine.Use(gzip.Gzip(gzip.DefaultCompression))
|
||||
engine.Use(gzip.Gzip(gzip.BestSpeed))
|
||||
engine.Use(static.Serve("/", static.LocalFile("static/dist/", false)))
|
||||
engine.NoRoute(func(ctx *gin.Context) {
|
||||
accept := ctx.Request.Header.Get("Accept")
|
||||
|
|
107
go.mod
107
go.mod
|
@ -1,73 +1,107 @@
|
|||
module github.com/huoxue1/qinglong-go
|
||||
|
||||
go 1.18
|
||||
go 1.20
|
||||
|
||||
require (
|
||||
github.com/Lyrics-you/sail-logrus-formatter v1.3.1
|
||||
github.com/dablelv/go-huge-util v0.0.31
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible
|
||||
github.com/gin-contrib/gzip v0.0.6
|
||||
github.com/gin-contrib/static v0.0.1
|
||||
github.com/gin-gonic/gin v1.8.1
|
||||
github.com/gobwas/ws v1.1.0
|
||||
github.com/gin-gonic/gin v1.9.0
|
||||
github.com/go-git/go-git/v5 v5.6.2-0.20230511070211-dc2b346ed149
|
||||
github.com/go-sql-driver/mysql v1.6.0
|
||||
github.com/golang-jwt/jwt/v5 v5.0.0
|
||||
github.com/google/uuid v1.3.0
|
||||
github.com/imroc/req/v3 v3.26.5
|
||||
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible
|
||||
github.com/huoxue1/go-utils v0.0.0-20230406033646-db359518379e
|
||||
github.com/imroc/req/v3 v3.41.10
|
||||
github.com/nutsdb/nutsdb v0.12.1-0.20230420040606-9fe96e4d325b
|
||||
github.com/panjf2000/ants/v2 v2.7.1
|
||||
github.com/pquerna/otp v1.4.0
|
||||
github.com/robfig/cron/v3 v3.0.1
|
||||
github.com/sirupsen/logrus v1.9.0
|
||||
github.com/spf13/cobra v1.7.0
|
||||
github.com/tidwall/gjson v1.14.4
|
||||
modernc.org/sqlite v1.15.2
|
||||
nhooyr.io/websocket v1.8.7
|
||||
xorm.io/builder v0.3.11-0.20220531020008-1bd24a7dc978
|
||||
xorm.io/xorm v1.3.2
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/cheekybits/genny v1.0.0 // indirect
|
||||
github.com/Lyrics-you/sail-logrus-formatter v1.3.1 // indirect
|
||||
github.com/Microsoft/go-winio v0.5.2 // indirect
|
||||
github.com/ProtonMail/go-crypto v0.0.0-20230417170513-8ee5748c52b5 // indirect
|
||||
github.com/acomagu/bufpipe v1.0.4 // indirect
|
||||
github.com/andybalholm/brotli v1.0.5 // indirect
|
||||
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc // indirect
|
||||
github.com/bwmarrin/snowflake v0.3.0 // indirect
|
||||
github.com/bytedance/sonic v1.8.0 // indirect
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
|
||||
github.com/cloudflare/circl v1.1.0 // indirect
|
||||
github.com/emirpasic/gods v1.18.1 // indirect
|
||||
github.com/fsnotify/fsnotify v1.6.0 // indirect
|
||||
github.com/gaukas/godicttls v0.0.4 // indirect
|
||||
github.com/gin-contrib/sse v0.1.0 // indirect
|
||||
github.com/go-playground/locales v0.14.0 // indirect
|
||||
github.com/go-playground/universal-translator v0.18.0 // indirect
|
||||
github.com/go-playground/validator/v10 v10.10.0 // indirect
|
||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect
|
||||
github.com/gobwas/httphead v0.1.0 // indirect
|
||||
github.com/gobwas/pool v0.2.1 // indirect
|
||||
github.com/goccy/go-json v0.9.7 // indirect
|
||||
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
|
||||
github.com/go-git/go-billy/v5 v5.4.1 // indirect
|
||||
github.com/go-playground/locales v0.14.1 // indirect
|
||||
github.com/go-playground/universal-translator v0.18.1 // indirect
|
||||
github.com/go-playground/validator/v10 v10.11.2 // indirect
|
||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
|
||||
github.com/gobwas/ws v1.1.0 // indirect
|
||||
github.com/goccy/go-json v0.10.0 // indirect
|
||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
||||
github.com/golang/mock v1.6.0 // indirect
|
||||
github.com/golang/snappy v0.0.4 // indirect
|
||||
github.com/google/pprof v0.0.0-20230811205829-9131a7e9cc17 // indirect
|
||||
github.com/hashicorp/errwrap v1.1.0 // indirect
|
||||
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
||||
github.com/imdario/mergo v0.3.15 // indirect
|
||||
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
|
||||
github.com/json-iterator/go v1.1.12 // indirect
|
||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
|
||||
github.com/klauspost/compress v1.10.3 // indirect
|
||||
github.com/kevinburke/ssh_config v1.2.0 // indirect
|
||||
github.com/klauspost/compress v1.16.7 // indirect
|
||||
github.com/klauspost/cpuid/v2 v2.0.9 // indirect
|
||||
github.com/leodido/go-urn v1.2.1 // indirect
|
||||
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible // indirect
|
||||
github.com/lestrrat-go/strftime v1.0.6 // indirect
|
||||
github.com/lucas-clemente/quic-go v0.28.1 // indirect
|
||||
github.com/marten-seemann/qpack v0.2.1 // indirect
|
||||
github.com/marten-seemann/qtls-go1-16 v0.1.5 // indirect
|
||||
github.com/marten-seemann/qtls-go1-17 v0.1.2 // indirect
|
||||
github.com/marten-seemann/qtls-go1-18 v0.1.2 // indirect
|
||||
github.com/marten-seemann/qtls-go1-19 v0.1.0-beta.1 // indirect
|
||||
github.com/mattn/go-isatty v0.0.16 // indirect
|
||||
github.com/mattn/go-isatty v0.0.17 // indirect
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||
github.com/nxadm/tail v1.4.8 // indirect
|
||||
github.com/onsi/ginkgo v1.16.5 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.0.5 // indirect
|
||||
github.com/onsi/ginkgo/v2 v2.11.0 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.0.6 // indirect
|
||||
github.com/pjbgf/sha1cd v0.3.0 // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/quic-go/qpack v0.4.0 // indirect
|
||||
github.com/quic-go/qtls-go1-19 v0.3.0 // indirect
|
||||
github.com/quic-go/qtls-go1-20 v0.3.3 // indirect
|
||||
github.com/quic-go/quic-go v0.38.1 // indirect
|
||||
github.com/refraction-networking/utls v1.4.3 // indirect
|
||||
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect
|
||||
github.com/sergi/go-diff v1.1.0 // indirect
|
||||
github.com/sirupsen/logrus v1.9.0 // indirect
|
||||
github.com/skeema/knownhosts v1.1.0 // indirect
|
||||
github.com/spf13/pflag v1.0.5 // indirect
|
||||
github.com/syndtr/goleveldb v1.0.0 // indirect
|
||||
github.com/tidwall/match v1.1.1 // indirect
|
||||
github.com/tidwall/pretty v1.2.0 // indirect
|
||||
github.com/ugorji/go/codec v1.2.7 // indirect
|
||||
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect
|
||||
golang.org/x/net v0.0.0-20221014081412-f15817d10f9b // indirect
|
||||
golang.org/x/sys v0.0.0-20220908164124-27713097b956 // indirect
|
||||
golang.org/x/text v0.4.0 // indirect
|
||||
golang.org/x/tools v0.1.12 // indirect
|
||||
google.golang.org/protobuf v1.28.1 // indirect
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
|
||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
|
||||
github.com/ugorji/go/codec v1.2.9 // indirect
|
||||
github.com/xanzy/ssh-agent v0.3.3 // indirect
|
||||
github.com/xujiajun/mmap-go v1.0.1 // indirect
|
||||
github.com/xujiajun/utils v0.0.0-20220904132955-5f7c5b914235 // indirect
|
||||
golang.org/x/arch v0.1.0 // indirect
|
||||
golang.org/x/crypto v0.12.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb // indirect
|
||||
golang.org/x/mod v0.12.0 // indirect
|
||||
golang.org/x/net v0.14.0 // indirect
|
||||
golang.org/x/sys v0.11.0 // indirect
|
||||
golang.org/x/text v0.12.0 // indirect
|
||||
golang.org/x/tools v0.12.0 // indirect
|
||||
google.golang.org/protobuf v1.29.0 // indirect
|
||||
gopkg.in/warnings.v0 v0.1.2 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
lukechampine.com/uint128 v1.2.0 // indirect
|
||||
modernc.org/cc/v3 v3.40.0 // indirect
|
||||
modernc.org/ccgo/v3 v3.16.13 // indirect
|
||||
|
@ -77,5 +111,4 @@ require (
|
|||
modernc.org/opt v0.1.3 // indirect
|
||||
modernc.org/strutil v1.1.3 // indirect
|
||||
modernc.org/token v1.0.1 // indirect
|
||||
nhooyr.io/websocket v1.8.7 // indirect
|
||||
)
|
||||
|
|
387
go.sum
387
go.sum
|
@ -1,12 +1,5 @@
|
|||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo=
|
||||
dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU=
|
||||
dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU=
|
||||
dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4=
|
||||
dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU=
|
||||
git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
|
||||
gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s=
|
||||
gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU=
|
||||
gitee.com/travelliu/dm v1.8.11192/go.mod h1:DHTzyhCrM843x9VdKVbZ+GKXGRbKM2sJ4LxihRxShkE=
|
||||
|
@ -15,20 +8,31 @@ github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go
|
|||
github.com/Lyrics-you/sail-logrus-formatter v1.3.1 h1:y/9QraPbDwfccHa4QFZ9g2zNiPoSoQnE5MYizWLiYwY=
|
||||
github.com/Lyrics-you/sail-logrus-formatter v1.3.1/go.mod h1:e9FX8+3MxwQGGkK+8ne3kRpu0gaBc9QTE7jtP+zP070=
|
||||
github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
|
||||
github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA=
|
||||
github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
|
||||
github.com/ProtonMail/go-crypto v0.0.0-20230417170513-8ee5748c52b5 h1:QXMwHM/lB4ZQhdEF7JUTNgYOJR/gWoFbgQ/2Aj1h3Dk=
|
||||
github.com/ProtonMail/go-crypto v0.0.0-20230417170513-8ee5748c52b5/go.mod h1:8TI4H3IbrackdNgv+92dI+rhpCaLqM0IfpgCgenFvRE=
|
||||
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
|
||||
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
|
||||
github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
|
||||
github.com/acomagu/bufpipe v1.0.4 h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ=
|
||||
github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4=
|
||||
github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
|
||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
|
||||
github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs=
|
||||
github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
|
||||
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=
|
||||
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
|
||||
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
|
||||
github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
|
||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
|
||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
|
||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
|
||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
|
||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
|
||||
github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A=
|
||||
github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
|
||||
github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
||||
|
@ -37,26 +41,36 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24
|
|||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
||||
github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g=
|
||||
github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
|
||||
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc h1:biVzkmvwrH8WK8raXaxBx6fRVTlJILwEwQGL1I/ByEI=
|
||||
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
|
||||
github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
|
||||
github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0=
|
||||
github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE=
|
||||
github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
|
||||
github.com/bytedance/sonic v1.8.0 h1:ea0Xadu+sHlu7x5O3gKhRpQ1IKiMrSiHttPF0ybECuA=
|
||||
github.com/bytedance/sonic v1.8.0/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=
|
||||
github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
|
||||
github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
|
||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE=
|
||||
github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ=
|
||||
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams=
|
||||
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
|
||||
github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE=
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/cloudflare/circl v1.1.0 h1:bZgT/A+cikZnKIwn7xL2OBj012Bmvho/o6RpRvv3GKY=
|
||||
github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I=
|
||||
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
|
||||
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
|
||||
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
|
||||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||
github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||
github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||
github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
|
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/dablelv/go-huge-util v0.0.31 h1:V6OFWmGwjdl1s+dGImF/S6crESVzm8x9+PaUF7KrYBk=
|
||||
|
@ -65,7 +79,6 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
|
|||
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=
|
||||
github.com/denisenkom/go-mssqldb v0.10.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
|
||||
|
@ -74,19 +87,23 @@ github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5m
|
|||
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
|
||||
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
|
||||
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
|
||||
github.com/elazarl/goproxy v0.0.0-20221015165544-a0805db90819 h1:RIB4cRk+lBqKK3Oy0r2gRX4ui7tuhiZq2SuTtTCi0/0=
|
||||
github.com/elazarl/goproxy v0.0.0-20221015165544-a0805db90819/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM=
|
||||
github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8=
|
||||
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
|
||||
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
|
||||
github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
|
||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
|
||||
github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY=
|
||||
github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
|
||||
github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
||||
github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
|
||||
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
|
||||
github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
|
||||
github.com/gaukas/godicttls v0.0.4 h1:NlRaXb3J6hAnTmWdsEKb9bcSBD6BvcIjdGdeb0zfXbk=
|
||||
github.com/gaukas/godicttls v0.0.4/go.mod h1:l6EenT4TLWgTdwslVb4sEMOCf7Bv0JAK67deKr9/NCI=
|
||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4=
|
||||
github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk=
|
||||
|
@ -95,33 +112,48 @@ github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm
|
|||
github.com/gin-contrib/static v0.0.1 h1:JVxuvHPuUfkoul12N7dtQw7KRn/pSMq7Ue1Va9Swm1U=
|
||||
github.com/gin-contrib/static v0.0.1/go.mod h1:CSxeF+wep05e0kCOsqWdAWbSszmc31zTIbD8TvWl7Hs=
|
||||
github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
|
||||
github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8=
|
||||
github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk=
|
||||
github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
|
||||
github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
|
||||
github.com/gin-gonic/gin v1.9.0 h1:OjyFBKICoexlu99ctXNR2gg+c5pKrKMuyjgARg9qeY8=
|
||||
github.com/gin-gonic/gin v1.9.0/go.mod h1:W1Me9+hsUSyj3CePGrd1/QrKJMSJ1Tu/0hFEH89961k=
|
||||
github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY=
|
||||
github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4=
|
||||
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=
|
||||
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic=
|
||||
github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
|
||||
github.com/go-git/go-billy/v5 v5.4.1 h1:Uwp5tDRkPr+l/TnbHOQzp+tmJfLceOlbVucgpTz8ix4=
|
||||
github.com/go-git/go-billy/v5 v5.4.1/go.mod h1:vjbugF6Fz7JIflbVpl1hJsGjSHNltrSw45YK/ukIvQg=
|
||||
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20230305113008-0c11038e723f h1:Pz0DHeFij3XFhoBRGUDPzSJ+w2UcK5/0JvF8DRI58r8=
|
||||
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20230305113008-0c11038e723f/go.mod h1:8LHG1a3SRW71ettAD/jW13h8c6AqjVSeL11RAdgaqpo=
|
||||
github.com/go-git/go-git/v5 v5.6.2-0.20230511070211-dc2b346ed149 h1:CqIxCvqQExP0R43sF2X3nv5xN594+GQ4tn//AcJ38/M=
|
||||
github.com/go-git/go-git/v5 v5.6.2-0.20230511070211-dc2b346ed149/go.mod h1:LztmJ8tEl/CJsC/N8M9awHbDIe5GczrNIaYmo0dRvs8=
|
||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||
github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o=
|
||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
||||
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
|
||||
github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
|
||||
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
|
||||
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
||||
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
|
||||
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
|
||||
github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU=
|
||||
github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs=
|
||||
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
|
||||
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
|
||||
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
|
||||
github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho=
|
||||
github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA=
|
||||
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
|
||||
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
|
||||
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
|
||||
github.com/go-playground/validator/v10 v10.10.0 h1:I7mrTYv78z8k8VXa/qJlOlEXn/nBh+BF8dHX5nt/dr0=
|
||||
github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos=
|
||||
github.com/go-playground/validator/v10 v10.11.2 h1:q3SHpufmypg+erIExEKUmsgmhDTyhcJ38oeKGACXohU=
|
||||
github.com/go-playground/validator/v10 v10.11.2/go.mod h1:NieE624vt4SCTJtD87arVLvdmjPAeV8BQlHtMnw9D7s=
|
||||
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
||||
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
|
||||
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I=
|
||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
|
||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
|
||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
|
||||
github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo=
|
||||
github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU=
|
||||
github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM=
|
||||
|
@ -132,22 +164,24 @@ github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/E
|
|||
github.com/gobwas/ws v1.1.0 h1:7RFti/xnNkMJnrK7D1yQ/iCIB5OrrY/54/H930kIbHA=
|
||||
github.com/gobwas/ws v1.1.0/go.mod h1:nzvNcVha5eUziGrbxFCo6qFIojQHjJV5cLYIbezhfL0=
|
||||
github.com/goccy/go-json v0.8.1/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
||||
github.com/goccy/go-json v0.9.7 h1:IcB+Aqpx/iMHu5Yooh7jEzJk1JZ7Pjtmys2ukPr7EeM=
|
||||
github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
||||
github.com/goccy/go-json v0.10.0 h1:mXKd9Qw4NuzShiRlOXKews24ufknHO7gx30lsDyokKA=
|
||||
github.com/goccy/go-json v0.10.0/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
||||
github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
||||
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
||||
github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
|
||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
||||
github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE=
|
||||
github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
|
||||
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E=
|
||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
|
||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
|
||||
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
|
||||
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
|
@ -162,8 +196,7 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W
|
|||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
|
||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
|
||||
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
|
||||
|
@ -177,27 +210,25 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
|
|||
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
||||
github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
|
||||
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
|
||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||
github.com/google/pprof v0.0.0-20230323073829-e72429f035bd h1:r8yyd+DJDmsUhGrRBxH5Pj7KeFK5l+Y3FsgT8keqKtk=
|
||||
github.com/google/pprof v0.0.0-20230323073829-e72429f035bd/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk=
|
||||
github.com/google/pprof v0.0.0-20230811205829-9131a7e9cc17 h1:0h35ESZ02+hN/MFZb7XZOXg+Rl9+Rk8fBIf5YLws9gA=
|
||||
github.com/google/pprof v0.0.0-20230811205829-9131a7e9cc17/go.mod h1:Jh3hGz2jkYak8qXPD19ryItVnUgpgeqzdkY/D0EaeuA=
|
||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
||||
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=
|
||||
github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
||||
github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||
github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||
github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||
github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
|
||||
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
|
||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||
github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
|
||||
github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
|
||||
|
@ -225,9 +256,17 @@ github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2p
|
|||
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
|
||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||
github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg=
|
||||
github.com/imroc/req/v3 v3.26.5 h1:BmW+GRVyo+YJkfgA7+U/mHVm7+kCgoLXupTssQKTH+8=
|
||||
github.com/imroc/req/v3 v3.26.5/go.mod h1:AQ5kNHHkid1ibNfsYz3QvpMHJsagqNxbe3RYX7+8T1U=
|
||||
github.com/huoxue1/go-utils v0.0.0-20230406033646-db359518379e h1:clQ/DsLQf9Ye97a65mDtF9Tl9HCHlRfesD1u/Lan3Aw=
|
||||
github.com/huoxue1/go-utils v0.0.0-20230406033646-db359518379e/go.mod h1:39wbuJr0Z2wbgxAEAx3gXR0iJg2cwj8wrbsSc3QpztE=
|
||||
github.com/imdario/mergo v0.3.15 h1:M8XP7IuFNsqUx6VPK2P9OSmsYsI/YFaGil0uD21V3dM=
|
||||
github.com/imdario/mergo v0.3.15/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY=
|
||||
github.com/imroc/req/v3 v3.33.2 h1:mqphLIo++p+IPYdjgP/Wd5rqXUjKvuEIst2U+EsLIwQ=
|
||||
github.com/imroc/req/v3 v3.33.2/go.mod h1:cZ+7C3L/AYOr4tLGG16hZF90F1WzAdAdzt1xFSlizXY=
|
||||
github.com/imroc/req/v3 v3.41.10 h1:McOPzd9KJ52KA+beKbCwB3Z8GqggVodY+jTD/B6KNKc=
|
||||
github.com/imroc/req/v3 v3.41.10/go.mod h1:JxpRRITYTOcuqQJxHSPVvEKhAL9ayo7BpUXHbL2T5IE=
|
||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
|
||||
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
||||
github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
|
||||
github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo=
|
||||
github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
|
||||
|
@ -276,25 +315,33 @@ github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0f
|
|||
github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
|
||||
github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
|
||||
github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
|
||||
github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU=
|
||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
|
||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
|
||||
github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
|
||||
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
||||
github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo=
|
||||
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
|
||||
github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4=
|
||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||
github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
|
||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
||||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
|
||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
|
||||
github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4=
|
||||
github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
|
||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/klauspost/compress v1.10.3 h1:OP96hzwJVBIHYU52pVTI6CczrxPvrGfgqF9N5eTO0Q8=
|
||||
github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
||||
github.com/klauspost/compress v1.16.0 h1:iULayQNOReoYUe+1qtKOqw9CwJv3aNQu8ivo7lw1HU4=
|
||||
github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
|
||||
github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I=
|
||||
github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
|
||||
github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4=
|
||||
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
||||
|
@ -303,7 +350,6 @@ github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfn
|
|||
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
|
||||
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
|
@ -324,21 +370,9 @@ github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
|||
github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
|
||||
github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
|
||||
github.com/lucas-clemente/quic-go v0.28.1 h1:Uo0lvVxWg5la9gflIF9lwa39ONq85Xq2D91YNEIslzU=
|
||||
github.com/lucas-clemente/quic-go v0.28.1/go.mod h1:oGz5DKK41cJt5+773+BSO9BXDsREY4HLf7+0odGAPO0=
|
||||
github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
|
||||
github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
|
||||
github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||
github.com/marten-seemann/qpack v0.2.1 h1:jvTsT/HpCn2UZJdP+UUB53FfUUgeOyG5K1ns0OJOGVs=
|
||||
github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc=
|
||||
github.com/marten-seemann/qtls-go1-16 v0.1.5 h1:o9JrYPPco/Nukd/HpOHMHZoBDXQqoNtUCmny98/1uqQ=
|
||||
github.com/marten-seemann/qtls-go1-16 v0.1.5/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk=
|
||||
github.com/marten-seemann/qtls-go1-17 v0.1.2 h1:JADBlm0LYiVbuSySCHeY863dNkcpMmDR7s0bLKJeYlQ=
|
||||
github.com/marten-seemann/qtls-go1-17 v0.1.2/go.mod h1:C2ekUKcDdz9SDWxec1N/MvcXBpaX9l3Nx67XaR84L5s=
|
||||
github.com/marten-seemann/qtls-go1-18 v0.1.2 h1:JH6jmzbduz0ITVQ7ShevK10Av5+jBEKAHMntXmIV7kM=
|
||||
github.com/marten-seemann/qtls-go1-18 v0.1.2/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4=
|
||||
github.com/marten-seemann/qtls-go1-19 v0.1.0-beta.1 h1:7m/WlWcSROrcK5NxuXaxYD32BZqe/LEEnBrWcH/cOqQ=
|
||||
github.com/marten-seemann/qtls-go1-19 v0.1.0-beta.1/go.mod h1:5HTDWtVudo/WFsHKRNuOhWlbdjrfs5JHrYb0wIJqGpI=
|
||||
github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A=
|
||||
github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA=
|
||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
||||
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
|
||||
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||
|
@ -351,14 +385,13 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd
|
|||
github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
|
||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
|
||||
github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ=
|
||||
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||
github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
|
||||
github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||
github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
|
||||
github.com/mattn/go-sqlite3 v1.14.10 h1:MLn+5bFRlWMGoSRmJour3CL1w/qL96mvipqpwQW/Sfk=
|
||||
github.com/mattn/go-sqlite3 v1.14.10/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
|
||||
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
||||
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
|
||||
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||
|
@ -367,6 +400,7 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4
|
|||
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
|
||||
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||
github.com/mmcloughlin/avo v0.5.0/go.mod h1:ChHFdoV7ql95Wi7vuq2YT1bwCJqiWdZrQ1im3VujLYM=
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
|
@ -382,8 +416,9 @@ github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzE
|
|||
github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
|
||||
github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
|
||||
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
|
||||
github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo=
|
||||
github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
|
||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||
github.com/nutsdb/nutsdb v0.12.1-0.20230420040606-9fe96e4d325b h1:yoSixulbSxTFEarx6XNyvKT1Fh28Y+doP/OtdB+LIvY=
|
||||
github.com/nutsdb/nutsdb v0.12.1-0.20230420040606-9fe96e4d325b/go.mod h1:FSztXVhUSK5YmedmZQ6m37cU/KpVbGaezUEmUBP8DEo=
|
||||
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
||||
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
|
||||
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
|
||||
|
@ -393,23 +428,26 @@ github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:v
|
|||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
||||
github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
|
||||
github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E=
|
||||
github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
|
||||
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
|
||||
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
|
||||
github.com/onsi/ginkgo/v2 v2.9.2 h1:BA2GMJOtfGAfagzYtrAlufIP0lq6QERkFmHLMLPwFSU=
|
||||
github.com/onsi/ginkgo/v2 v2.9.2/go.mod h1:WHcJJG2dIlcCqVfBAwUCrJxSPFb6v4azBwgxeMeDuts=
|
||||
github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q=
|
||||
github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k=
|
||||
github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU=
|
||||
github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM=
|
||||
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||
github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak=
|
||||
github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY=
|
||||
github.com/onsi/gomega v1.27.4 h1:Z2AnStgsdSayCMDiCU42qIz+HLqEPcgiOCXjAU/w+8E=
|
||||
github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE=
|
||||
github.com/onsi/gomega v1.27.8 h1:gegWiwZjBsf2DgiSbf5hpokZ98JVDMcWkUiigk6/KXc=
|
||||
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
|
||||
github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
|
||||
github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
|
||||
github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
||||
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
||||
github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA=
|
||||
github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
|
||||
github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
|
||||
github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
|
||||
github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
|
||||
|
@ -419,11 +457,13 @@ github.com/panjf2000/ants/v2 v2.7.1/go.mod h1:KIBmYG9QQX5U2qzFP/yQJaq/nSb6rahS9i
|
|||
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
||||
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
|
||||
github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
|
||||
github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg=
|
||||
github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas=
|
||||
github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU=
|
||||
github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek=
|
||||
github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
|
||||
github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
|
||||
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
||||
github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4=
|
||||
github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI=
|
||||
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
|
||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
|
@ -433,7 +473,8 @@ github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6J
|
|||
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/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
||||
github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||
github.com/pquerna/otp v1.4.0 h1:wZvl1TIVxKRThZIBiwOOHOGP/1+nZyWBil9Y2XNEDzg=
|
||||
github.com/pquerna/otp v1.4.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg=
|
||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||
github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
|
||||
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
|
||||
|
@ -443,21 +484,34 @@ github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:
|
|||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
||||
github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||
github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
|
||||
github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||
github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||
github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
|
||||
github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
|
||||
github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A=
|
||||
github.com/quic-go/qtls-go1-19 v0.3.0 h1:aUBoQdpHzUWtPw5tQZbsD2GnrWCNu7/RIX1PtqGeLYY=
|
||||
github.com/quic-go/qtls-go1-19 v0.3.0/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI=
|
||||
github.com/quic-go/qtls-go1-20 v0.2.0 h1:jUHn+obJ6WI5JudqBO0Iy1ra5Vh5vsitQ1gXQvkmN+E=
|
||||
github.com/quic-go/qtls-go1-20 v0.2.0/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM=
|
||||
github.com/quic-go/qtls-go1-20 v0.3.3 h1:17/glZSLI9P9fDAeyCHBFSWSqJcwx1byhLwP5eUIDCM=
|
||||
github.com/quic-go/qtls-go1-20 v0.3.3/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k=
|
||||
github.com/quic-go/quic-go v0.33.0 h1:ItNoTDN/Fm/zBlq769lLJc8ECe9gYaW40veHCCco7y0=
|
||||
github.com/quic-go/quic-go v0.33.0/go.mod h1:YMuhaAV9/jIu0XclDXwZPAsP/2Kgr5yMYhe9oxhhOFA=
|
||||
github.com/quic-go/quic-go v0.38.1 h1:M36YWA5dEhEeT+slOu/SwMEucbYd0YFidxG3KlGPZaE=
|
||||
github.com/quic-go/quic-go v0.38.1/go.mod h1:ijnZM7JsFIkp4cRyjxJNIzdSfCLmUMg9wdyhGmg+SN4=
|
||||
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
||||
github.com/refraction-networking/utls v1.4.3 h1:BdWS3BSzCwWCFfMIXP3mjLAyQkdmog7diaD/OqFbAzM=
|
||||
github.com/refraction-networking/utls v1.4.3/go.mod h1:4u9V/awOSBrRw6+federGmVJQfPtemEqLBXkML1b0bo=
|
||||
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk=
|
||||
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
|
||||
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
|
||||
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
|
||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
||||
github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc=
|
||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
|
||||
github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
|
||||
|
@ -465,52 +519,36 @@ github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6po
|
|||
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
|
||||
github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
|
||||
github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
|
||||
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
|
||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
|
||||
github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
|
||||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
|
||||
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
|
||||
github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
|
||||
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
|
||||
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
|
||||
github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
|
||||
github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
|
||||
github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY=
|
||||
github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM=
|
||||
github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0=
|
||||
github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
|
||||
github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ=
|
||||
github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw=
|
||||
github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI=
|
||||
github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU=
|
||||
github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag=
|
||||
github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg=
|
||||
github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw=
|
||||
github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y=
|
||||
github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
|
||||
github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q=
|
||||
github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ=
|
||||
github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I=
|
||||
github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0=
|
||||
github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ=
|
||||
github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk=
|
||||
github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
||||
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
||||
github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4=
|
||||
github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw=
|
||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
|
||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
|
||||
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||
github.com/skeema/knownhosts v1.1.0 h1:Wvr9V0MxhjRbl3f9nMnKnFfiWTJmtECJ9Njkea3ysW0=
|
||||
github.com/skeema/knownhosts v1.1.0/go.mod h1:sKFq3RD6/TKZkSWn8boUbDC7Qkgcv+8XXijpFO6roag=
|
||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
||||
github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
|
||||
github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE=
|
||||
github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA=
|
||||
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||
github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I=
|
||||
github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0=
|
||||
github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
|
||||
github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
|
||||
github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI=
|
||||
|
@ -531,7 +569,6 @@ github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKs
|
|||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||
github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
|
||||
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
|
||||
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
|
||||
github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=
|
||||
github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
|
||||
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
|
||||
|
@ -539,16 +576,24 @@ github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JT
|
|||
github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
|
||||
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
|
||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
|
||||
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
|
||||
github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M=
|
||||
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
|
||||
github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0=
|
||||
github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY=
|
||||
github.com/ugorji/go/codec v1.2.9 h1:rmenucSohSTiyL09Y+l2OCk+FrMxGMzho2+tjr5ticU=
|
||||
github.com/ugorji/go/codec v1.2.9/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
|
||||
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
|
||||
github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU=
|
||||
github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM=
|
||||
github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM=
|
||||
github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
|
||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
||||
github.com/xujiajun/gorouter v1.2.0/go.mod h1:yJrIta+bTNpBM/2UT8hLOaEAFckO+m/qmR3luMIQygM=
|
||||
github.com/xujiajun/mmap-go v1.0.1 h1:7Se7ss1fLPPRW+ePgqGpCkfGIZzJV6JPq9Wq9iv/WHc=
|
||||
github.com/xujiajun/mmap-go v1.0.1/go.mod h1:CNN6Sw4SL69Sui00p0zEzcZKbt+5HtEnYUsc6BKKRMg=
|
||||
github.com/xujiajun/utils v0.0.0-20220904132955-5f7c5b914235 h1:w0si+uee0iAaCJO9q86T6yrhdadgcsoNuh47LrUykzg=
|
||||
github.com/xujiajun/utils v0.0.0-20220904132955-5f7c5b914235/go.mod h1:MR4+0R6A9NS5IABnIM3384FfOq8QFVnm7WDrBOhIaMU=
|
||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||
|
@ -556,7 +601,6 @@ github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxt
|
|||
github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
|
||||
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||
go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
|
||||
go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
|
||||
go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
|
||||
go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
|
||||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
|
@ -571,13 +615,12 @@ go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9E
|
|||
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||
go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
|
||||
go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=
|
||||
golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw=
|
||||
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
|
||||
golang.org/x/arch v0.1.0 h1:oMxhUYsO9VsR1dcoVUjJjIGhx1LXol3989T/yZ59Xsw=
|
||||
golang.org/x/arch v0.1.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
|
||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
|
||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
|
@ -585,7 +628,6 @@ golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8U
|
|||
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||
|
@ -593,10 +635,20 @@ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm
|
|||
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c=
|
||||
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.0.0-20220826181053-bd7e27e6170d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
|
||||
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
|
||||
golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ=
|
||||
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
|
||||
golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk=
|
||||
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug=
|
||||
golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
|
||||
golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb h1:mIKbk8weKhSeLH2GmUTrvx8CjkyJmnU1wFmg59CUjFA=
|
||||
golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
|
@ -606,14 +658,19 @@ golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKG
|
|||
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||
golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI=
|
||||
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs=
|
||||
golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk=
|
||||
golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc=
|
||||
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
|
@ -621,29 +678,29 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r
|
|||
golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||
golang.org/x/net v0.0.0-20220802222814-0bcc04d9c69b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
|
||||
golang.org/x/net v0.0.0-20221014081412-f15817d10f9b h1:tvrvnPFcdzp294diPnrdZZZ8XUt2Tyj7svb7X52iDuU=
|
||||
golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
|
||||
golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
|
||||
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
|
||||
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
|
||||
golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
|
||||
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
||||
golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
|
||||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||
golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14=
|
||||
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
|
@ -660,13 +717,12 @@ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5h
|
|||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181221143128-b4a75ba826a6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
|
@ -681,13 +737,15 @@ golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||
golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201207223542-d4d67f95c62d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
|
@ -696,40 +754,56 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc
|
|||
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210902050250-f475640dd07b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220405210540-1e041c57c461/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220731174439-a90be440212d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220908164124-27713097b956 h1:XeJjHH1KiLpKGb6lvMiksZ9l0fVUh+AmGcm0nOMEBOY=
|
||||
golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
|
||||
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
|
||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
|
||||
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
|
||||
golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ=
|
||||
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||
golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg=
|
||||
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
|
||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=
|
||||
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||
|
@ -741,34 +815,30 @@ golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapK
|
|||
golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU=
|
||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||
golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA=
|
||||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||
golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4=
|
||||
golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s=
|
||||
golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo=
|
||||
golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc=
|
||||
golang.org/x/tools v0.12.0 h1:YW6HUoUmYBpwSgyaGaZq1fHjrBjX1rlpZ54T6mu2kss=
|
||||
golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM=
|
||||
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
|
||||
google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
|
||||
google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
|
||||
google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y=
|
||||
google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
|
||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||
google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg=
|
||||
google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
|
||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||
google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
||||
google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
|
||||
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
|
||||
|
@ -785,13 +855,14 @@ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miE
|
|||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
||||
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
|
||||
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||
google.golang.org/protobuf v1.29.0 h1:44S3JjaKmLEE4YIkjzexaP+NzZsudE3Zin5Njn/pYX0=
|
||||
google.golang.org/protobuf v1.29.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||
gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
|
||||
|
@ -799,10 +870,10 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
|||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||
gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
|
||||
gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s=
|
||||
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
|
||||
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||
gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
|
||||
gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
|
||||
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
|
||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
|
@ -810,16 +881,13 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o=
|
||||
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
||||
lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
|
||||
|
@ -978,10 +1046,9 @@ modernc.org/z v1.3.2 h1:4GWBVMa48UDC7KQ9tnaggN/yTlXg+CdCX9bhgHPQ9AM=
|
|||
modernc.org/z v1.3.2/go.mod h1:PEU2oK2OEA1CfzDTd+8E908qEXhC9s0MfyKp5LZsd+k=
|
||||
nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g=
|
||||
nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0=
|
||||
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
|
||||
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
|
||||
sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU=
|
||||
sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck=
|
||||
sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0=
|
||||
xorm.io/builder v0.3.11-0.20220531020008-1bd24a7dc978 h1:bvLlAPW1ZMTWA32LuZMBEGHAUOcATZjzHcotf3SWweM=
|
||||
xorm.io/builder v0.3.11-0.20220531020008-1bd24a7dc978/go.mod h1:aUW0S9eb9VCaPohFCH3j7czOx1PMW3i1HrSzbLYGBSE=
|
||||
xorm.io/xorm v1.3.2 h1:uTRRKF2jYzbZ5nsofXVUx6ncMaek+SHjWYtCXyZo1oM=
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
package auth
|
||||
|
||||
import (
|
||||
"github.com/pquerna/otp/totp"
|
||||
)
|
||||
|
||||
// GenerateTOTP 生成 TOTP 密钥和二维码
|
||||
func GenerateTOTP(user string, issuer string) (string, string, error) {
|
||||
// 生成 TOTP 密钥
|
||||
key, err := totp.Generate(totp.GenerateOpts{
|
||||
Issuer: issuer,
|
||||
AccountName: user,
|
||||
})
|
||||
if err != nil {
|
||||
return "", "", err
|
||||
}
|
||||
|
||||
return key.Secret(), key.URL(), nil
|
||||
}
|
||||
|
||||
// VerifyTOTP 验证 TOTP 密码
|
||||
func VerifyTOTP(secret string, code string) bool {
|
||||
return totp.Validate(code, secret)
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
package auth
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"github.com/huoxue1/qinglong-go/internal/cache"
|
||||
"github.com/huoxue1/qinglong-go/models"
|
||||
)
|
||||
|
||||
const (
|
||||
CacheAuthKey = "auth_info"
|
||||
)
|
||||
|
||||
func InitAuthInfo(username, password string) error {
|
||||
m := new(models.AuthFile)
|
||||
m.Username = username
|
||||
m.Password = password
|
||||
m.IsTwoFactorChecking = false
|
||||
m.Tokens.Mobile = ""
|
||||
m.Tokens.Desktop = ""
|
||||
data, _ := json.Marshal(m)
|
||||
return cache.SetBytes(CacheAuthKey, data)
|
||||
}
|
||||
|
||||
func GetAuthInfo() (*models.AuthFile, error) {
|
||||
m := new(models.AuthFile)
|
||||
data, err := cache.GetBytes(CacheAuthKey)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = json.Unmarshal(data, m)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return m, nil
|
||||
}
|
||||
|
||||
func UpdateAuthInfo(file *models.AuthFile) error {
|
||||
data, _ := json.Marshal(file)
|
||||
return cache.SetBytes(CacheAuthKey, data)
|
||||
}
|
||||
|
||||
func IsInit() bool {
|
||||
return cache.Exists(CacheAuthKey)
|
||||
}
|
|
@ -0,0 +1,81 @@
|
|||
package cache
|
||||
|
||||
import (
|
||||
log "github.com/huoxue1/go-utils/base/log"
|
||||
"github.com/nutsdb/nutsdb"
|
||||
"sync"
|
||||
)
|
||||
|
||||
var (
|
||||
db *nutsdb.DB
|
||||
once = sync.Once{}
|
||||
)
|
||||
|
||||
func initCache() {
|
||||
once.Do(func() {
|
||||
log.Infoln("start init cache")
|
||||
var err error
|
||||
db, err = nutsdb.Open(nutsdb.DefaultOptions, nutsdb.WithDir("./data/cache"))
|
||||
if err != nil {
|
||||
log.Errorf("open the cache error: %s", err.Error())
|
||||
return
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func Exists(key string) bool {
|
||||
initCache()
|
||||
var exists bool
|
||||
_ = db.View(func(tx *nutsdb.Tx) error {
|
||||
_, err := tx.Get("default", []byte(key))
|
||||
if err != nil {
|
||||
exists = false
|
||||
} else {
|
||||
exists = true
|
||||
}
|
||||
return nil
|
||||
})
|
||||
return exists
|
||||
}
|
||||
|
||||
func Get(key string) (string, error) {
|
||||
initCache()
|
||||
var val string
|
||||
err := db.View(func(tx *nutsdb.Tx) error {
|
||||
entry, err := tx.Get("default", []byte(key))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
val = string(entry.Value)
|
||||
return nil
|
||||
})
|
||||
return val, err
|
||||
}
|
||||
|
||||
func GetBytes(key string) ([]byte, error) {
|
||||
initCache()
|
||||
var val []byte
|
||||
err := db.View(func(tx *nutsdb.Tx) error {
|
||||
entry, err := tx.Get("default", []byte(key))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
val = entry.Value
|
||||
return nil
|
||||
})
|
||||
return val, err
|
||||
}
|
||||
|
||||
func Set(key string, value string) error {
|
||||
initCache()
|
||||
return db.Update(func(tx *nutsdb.Tx) error {
|
||||
return tx.Put("default", []byte(key), []byte(value), 0)
|
||||
})
|
||||
}
|
||||
|
||||
func SetBytes(key string, value []byte) error {
|
||||
initCache()
|
||||
return db.Update(func(tx *nutsdb.Tx) error {
|
||||
return tx.Put("default", []byte(key), value, 0)
|
||||
})
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
package cron_manager
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"github.com/robfig/cron/v3"
|
||||
"sync"
|
||||
)
|
||||
|
||||
var (
|
||||
manager sync.Map
|
||||
SixCron *cron.Cron
|
||||
)
|
||||
|
||||
type mapValue struct {
|
||||
en cron.EntryID
|
||||
c *cron.Cron
|
||||
}
|
||||
|
||||
func init() {
|
||||
SixCron = cron.New(cron.WithChain(cron.Recover(cron.DefaultLogger)), cron.WithParser(
|
||||
cron.NewParser(cron.SecondOptional|cron.Minute|cron.Hour|cron.Dom|cron.Month|cron.Dow|cron.Descriptor)))
|
||||
SixCron.Start()
|
||||
}
|
||||
|
||||
func AddCron(id string, value string, task func()) error {
|
||||
if value == "7 7 7 7 7" {
|
||||
value = "7 7 7 7 6"
|
||||
}
|
||||
|
||||
en, err := SixCron.AddFunc(value, task)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
manager.Store(id, &mapValue{en, SixCron})
|
||||
return nil
|
||||
}
|
||||
|
||||
func DeleteCron(id string) error {
|
||||
value, loaded := manager.LoadAndDelete(id)
|
||||
if !loaded {
|
||||
return errors.New("the cron " + id + " not found!")
|
||||
}
|
||||
v := value.(*mapValue)
|
||||
v.c.Remove(v.en)
|
||||
return nil
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
package git
|
||||
|
||||
import (
|
||||
"github.com/go-git/go-git/v5"
|
||||
"github.com/go-git/go-git/v5/plumbing/transport"
|
||||
"os"
|
||||
)
|
||||
|
||||
func Download() {
|
||||
|
||||
git.PlainClone("./data/faker2", false, &git.CloneOptions{URL: "https://github.com/shufflewzc/faker2.git", ProxyOptions: transport.ProxyOptions{
|
||||
URL: "socks5://124.70.38.162:12785",
|
||||
Username: "admin",
|
||||
Password: "qqqq",
|
||||
}, Progress: os.Stdout})
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
package git
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestDownload(t *testing.T) {
|
||||
Download()
|
||||
|
||||
}
|
|
@ -72,6 +72,9 @@ ShCmd="bash"
|
|||
# 运行以python依赖的命令
|
||||
PipCmd="pip"
|
||||
|
||||
|
||||
LogLevel="info"
|
||||
|
||||
## 通知环境变量
|
||||
## 1. Server酱
|
||||
## https://sct.ftqq.com
|
|
@ -0,0 +1,16 @@
|
|||
package fileInit
|
||||
|
||||
import (
|
||||
_ "embed"
|
||||
"os"
|
||||
"path"
|
||||
)
|
||||
|
||||
//go:embed config_sample.sh
|
||||
var sample []byte
|
||||
|
||||
func InitConfig() {
|
||||
_ = os.MkdirAll(path.Join("data", "config"), 0666)
|
||||
_ = os.WriteFile(path.Join("data", "config", "config.sample.sh"), sample, 0666)
|
||||
_ = os.WriteFile(path.Join("data", "config", "config.sh"), sample, 0666)
|
||||
}
|
66
main.go
66
main.go
|
@ -2,20 +2,8 @@ package main
|
|||
|
||||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
nested "github.com/Lyrics-you/sail-logrus-formatter/sailor"
|
||||
"github.com/dablelv/go-huge-util/zip"
|
||||
"github.com/huoxue1/qinglong-go/controller"
|
||||
"github.com/huoxue1/qinglong-go/service"
|
||||
"github.com/huoxue1/qinglong-go/cmd"
|
||||
"github.com/huoxue1/qinglong-go/service/config"
|
||||
"github.com/huoxue1/qinglong-go/utils"
|
||||
rotates "github.com/lestrrat-go/file-rotatelogs"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"io"
|
||||
"os"
|
||||
"path"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
var (
|
||||
|
@ -23,61 +11,11 @@ var (
|
|||
)
|
||||
|
||||
func init() {
|
||||
w, err := rotates.New(path.Join("data", "log", "qinglong-go", "%Y-%m-%d.log"), rotates.WithRotationTime(time.Hour*24))
|
||||
if err != nil {
|
||||
log.Errorf("rotates init err: %v", err)
|
||||
panic(err)
|
||||
}
|
||||
log.SetOutput(io.MultiWriter(w, os.Stdout))
|
||||
log.SetFormatter(&nested.Formatter{
|
||||
FieldsOrder: nil,
|
||||
TimeStampFormat: "2006-01-02 15:04:05",
|
||||
CharStampFormat: "",
|
||||
HideKeys: false,
|
||||
Position: true,
|
||||
Colors: true,
|
||||
FieldsColors: true,
|
||||
FieldsSpace: true,
|
||||
ShowFullLevel: false,
|
||||
LowerCaseLevel: true,
|
||||
TrimMessages: true,
|
||||
CallerFirst: false,
|
||||
CustomCallerFormatter: nil,
|
||||
})
|
||||
flag.StringVar(&address, "add", "0.0.0.0:5700", "the ql listen address!")
|
||||
flag.Parse()
|
||||
config.SetAddress(address)
|
||||
}
|
||||
|
||||
func main() {
|
||||
checkStatic()
|
||||
service.AppInit()
|
||||
engine := controller.Router()
|
||||
_ = engine.Run(address)
|
||||
}
|
||||
|
||||
func checkStatic() {
|
||||
if !utils.FileExist("./static/") {
|
||||
version := config.GetVersion()
|
||||
if !strings.HasPrefix(version, "v") {
|
||||
version = "v1.0.0"
|
||||
}
|
||||
log.Warningln("检测到静态文件资源不存在,即将自动下载文件!")
|
||||
log.Infoln("downloading file from ", fmt.Sprintf("https://github.com/huoxue1/qinglong/releases/download/%s/static.zip", version))
|
||||
response, err := utils.GetClient().R().Get(fmt.Sprintf("https://github.com/huoxue1/qinglong/releases/download/%s/static.zip", version))
|
||||
if err != nil {
|
||||
log.Errorln("下载静态资源文件失败 " + err.Error())
|
||||
return
|
||||
}
|
||||
err = os.WriteFile("static.zip", response.Bytes(), 0666)
|
||||
if err != nil {
|
||||
log.Errorln("写入压缩文件错误 " + err.Error())
|
||||
return
|
||||
}
|
||||
err = zip.Unzip("static.zip", ".")
|
||||
if err != nil {
|
||||
log.Errorln(err.Error())
|
||||
return
|
||||
}
|
||||
}
|
||||
cmd.Run()
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package models
|
||||
|
||||
type Apps struct {
|
||||
Id int `xorm:"pk autoincr INTEGER" json:"id,omitempty"`
|
||||
Id int `xorm:"pk autoincr int" json:"id,omitempty"`
|
||||
Name string `xorm:"TEXT unique" json:"name,omitempty"`
|
||||
Scopes []string `xorm:"JSON" json:"scopes,omitempty"`
|
||||
ClientId string `xorm:"TEXT" json:"client_id,omitempty"`
|
||||
|
|
|
@ -14,4 +14,5 @@ type AuthFile struct {
|
|||
Lastaddr string `json:"lastaddr"`
|
||||
Platform string `json:"platform"`
|
||||
IsTwoFactorChecking bool `json:"isTwoFactorChecking"`
|
||||
TwoFactorSecret string `json:"twoFactorSecret"`
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@ import (
|
|||
)
|
||||
|
||||
type Auths struct {
|
||||
Id int `xorm:"pk autoincr INTEGER"`
|
||||
Id int `xorm:"pk autoincr int"`
|
||||
Ip string `xorm:"VARCHAR(255)"`
|
||||
Type string `xorm:"VARCHAR(255)"`
|
||||
Info string `xorm:"JSON"`
|
||||
|
|
|
@ -6,7 +6,7 @@ import (
|
|||
)
|
||||
|
||||
type Crontabs struct {
|
||||
Id int `xorm:"pk autoincr INTEGER" json:"id"`
|
||||
Id int `xorm:"pk autoincr int" json:"id"`
|
||||
Name string `xorm:"VARCHAR(255)" json:"name"`
|
||||
Command string `xorm:"VARCHAR(255)" json:"command"`
|
||||
Schedule string `xorm:"VARCHAR(255)" json:"schedule"`
|
||||
|
@ -19,21 +19,22 @@ type Crontabs struct {
|
|||
Ispinned int `xorm:"TINYINT(1)" json:"isPinned"`
|
||||
LogPath string `xorm:"VARCHAR(255)" json:"log_path"`
|
||||
Labels []string `xorm:"JSON" json:"labels"`
|
||||
LastRunningTime int64 `xorm:"NUMBER" json:"last_running_time"`
|
||||
LastExecutionTime int64 `xorm:"NUMBER" json:"last_execution_time"`
|
||||
Createdat string `xorm:"not null TEXT created" json:"createdAt"`
|
||||
Updatedat string `xorm:"not null TEXT updated" json:"updatedAt"`
|
||||
LastRunningTime int64 `xorm:"int" json:"last_running_time"`
|
||||
LastExecutionTime int64 `xorm:"int" json:"last_execution_time"`
|
||||
Createdat string `xorm:"not null varchar(25) created" json:"createdAt"`
|
||||
Updatedat string `xorm:"not null varchar(25) updated" json:"updatedAt"`
|
||||
}
|
||||
|
||||
func QueryCron(page int, size int, searchValue string, orderField string, orderType string) ([]*Crontabs, error) {
|
||||
crontabs := make([]*Crontabs, 0)
|
||||
session := engine.Table(new(Crontabs)).Limit(size, (page-1)*size).Where(builder.Like{"name", "%" + searchValue + "%"}.Or(builder.Like{"command", "%" + searchValue + "%"}))
|
||||
if orderType == "DESC" {
|
||||
session.Desc(orderField)
|
||||
} else if orderType == "ASC" {
|
||||
session.Asc(orderField)
|
||||
}
|
||||
err := session.Find(&crontabs)
|
||||
//if orderType == "DESC" {
|
||||
// session.Desc(orderField)
|
||||
//} else if orderType == "ASC" {
|
||||
// session.Asc(orderField)
|
||||
//}
|
||||
|
||||
err := session.Asc("status").Find(&crontabs)
|
||||
return crontabs, err
|
||||
}
|
||||
|
||||
|
|
|
@ -12,13 +12,13 @@ const (
|
|||
)
|
||||
|
||||
type Dependences struct {
|
||||
Id int `xorm:"pk autoincr INTEGER" json:"id,omitempty"`
|
||||
Name string `xorm:"TEXT" json:"name,omitempty"`
|
||||
Type int `xorm:"INTEGER" json:"type,omitempty"`
|
||||
Timestamp string `xorm:"TEXT" json:"timestamp,omitempty"`
|
||||
Status int `xorm:"INTEGER" json:"status,omitempty"`
|
||||
Log []string `xorm:"JSON" json:"log,omitempty"`
|
||||
Remark string `xorm:"TEXT" json:"remark,omitempty"`
|
||||
Id int `xorm:"pk autoincr INTEGER" json:"id"`
|
||||
Name string `json:"name"`
|
||||
Type int `xorm:"INTEGER" json:"type"`
|
||||
Timestamp string `json:"timestamp"`
|
||||
Status int `xorm:"INTEGER" json:"status"`
|
||||
Log []string `xorm:"JSON" json:"log"`
|
||||
Remark string `json:"remark"`
|
||||
Createdat time.Time `xorm:"not null DATETIME created" json:"createdAt"`
|
||||
Updatedat time.Time `xorm:"not null DATETIME updated" json:"updatedAt"`
|
||||
}
|
||||
|
|
|
@ -6,15 +6,16 @@ import (
|
|||
)
|
||||
|
||||
type Envs struct {
|
||||
Id int `xorm:"pk autoincr INTEGER" json:"id,omitempty"`
|
||||
Value string `xorm:"TEXT" json:"value,omitempty"`
|
||||
Timestamp string `xorm:"TEXT" json:"timestamp,omitempty"`
|
||||
Status int `xorm:"TINYINT(1)" json:"status,omitempty"`
|
||||
Position string `xorm:"TINYINT(1)" json:"position,omitempty"`
|
||||
Name string `xorm:"TEXT" json:"name,omitempty"`
|
||||
Remarks string `xorm:"TEXT" json:"remarks,omitempty"`
|
||||
Createdat time.Time `xorm:"not null DATETIME created" json:"createdAt"`
|
||||
Updatedat time.Time `xorm:"not null DATETIME updated" json:"updatedAt"`
|
||||
Id int `xorm:"pk autoincr INTEGER" json:"id"`
|
||||
Value string `json:"value"`
|
||||
Timestamp string `json:"timestamp"`
|
||||
Status int `xorm:"TINYINT(1)" json:"status"`
|
||||
Position string `xorm:"TINYINT(1)" json:"position"`
|
||||
Name string `json:"name"`
|
||||
Remarks string `json:"remarks"`
|
||||
Createdat time.Time `xorm:"not null DATETIME created" json:"createdAt"`
|
||||
Updatedat time.Time `xorm:"not null DATETIME updated" json:"updatedAt"`
|
||||
SerialIndex int64 `xorm:"serial_index INTEGER" json:"serialIndex"`
|
||||
}
|
||||
|
||||
func QueryEnv(searchValue string) ([]*Envs, error) {
|
||||
|
@ -23,7 +24,7 @@ func QueryEnv(searchValue string) ([]*Envs, error) {
|
|||
Where(
|
||||
builder.Like{"name", "%" + searchValue + "%"}.
|
||||
Or(builder.Like{"value", "%" + searchValue + "%"}).
|
||||
Or(builder.Like{"remarks", "%" + searchValue + "%"}))
|
||||
Or(builder.Like{"remarks", "%" + searchValue + "%"})).Asc("serial_index")
|
||||
err := session.Find(&envs)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -32,7 +33,19 @@ func QueryEnv(searchValue string) ([]*Envs, error) {
|
|||
|
||||
}
|
||||
|
||||
func QueryEnvByIndex(from, to int64) ([]*Envs, error) {
|
||||
envs := make([]*Envs, 0)
|
||||
err := engine.Table(new(Envs)).Where(builder.Between{
|
||||
Col: "serial_index",
|
||||
LessVal: from,
|
||||
MoreVal: to,
|
||||
}).Find(&envs)
|
||||
return envs, err
|
||||
}
|
||||
|
||||
func AddEnv(envs *Envs) (int, error) {
|
||||
count, _ := engine.Table(envs).Count()
|
||||
envs.SerialIndex = count
|
||||
_, err := engine.Table(envs).Insert(envs)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
|
|
|
@ -2,33 +2,67 @@ package models
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"xorm.io/builder"
|
||||
)
|
||||
|
||||
type Subscriptions struct {
|
||||
Id int `xorm:"pk autoincr INTEGER" json:"id,omitempty"`
|
||||
Name string `xorm:"TEXT" json:"name,omitempty"`
|
||||
Url string `xorm:"TEXT" json:"url,omitempty"`
|
||||
Schedule string `xorm:"TEXT" json:"schedule,omitempty"`
|
||||
IntervalSchedule map[string]any `xorm:"JSON" json:"interval_schedule,omitempty"`
|
||||
Type string `xorm:"TEXT" json:"type,omitempty"`
|
||||
Whitelist string `xorm:"TEXT" json:"whitelist,omitempty"`
|
||||
Blacklist string `xorm:"TEXT" json:"blacklist,omitempty"`
|
||||
Status int `xorm:"INTEGER default(1)" json:"status,omitempty"`
|
||||
Dependences string `xorm:"TEXT" json:"dependences,omitempty"`
|
||||
Extensions string `xorm:"TEXT" json:"extensions,omitempty"`
|
||||
SubBefore string `xorm:"TEXT" json:"sub_before,omitempty"`
|
||||
SubAfter string `xorm:"TEXT" json:"sub_after,omitempty"`
|
||||
Branch string `xorm:"TEXT" json:"branch,omitempty"`
|
||||
PullType string `xorm:"TEXT" json:"pull_type,omitempty"`
|
||||
PullOption string `xorm:"JSON" json:"pull_option,omitempty"`
|
||||
Pid int `xorm:"INTEGER" json:"pid,omitempty"`
|
||||
IsDisabled int `xorm:"INTEGER" json:"is_disabled,omitempty"`
|
||||
LogPath string `xorm:"TEXT" json:"log_path,omitempty"`
|
||||
ScheduleType string `xorm:"TEXT" json:"schedule_type,omitempty"`
|
||||
Alias string `xorm:"TEXT unique" json:"alias,omitempty"`
|
||||
Createdat string `xorm:"not null DATETIME created" json:"createdat,omitempty"`
|
||||
Updatedat string `xorm:"not null DATETIME updated" json:"updatedat,omitempty"`
|
||||
Id int `xorm:"pk autoincr INTEGER" json:"id"`
|
||||
Name string `json:"name"`
|
||||
Url string `json:"url"`
|
||||
Schedule string `json:"schedule"`
|
||||
IntervalSchedule map[string]any `xorm:"JSON" json:"interval_schedule"`
|
||||
Type string `json:"type"`
|
||||
Whitelist string `json:"whitelist"`
|
||||
Blacklist string `json:"blacklist"`
|
||||
Status int `xorm:"INTEGER default(1)" json:"status"`
|
||||
Dependences string `json:"dependences"`
|
||||
Extensions string `json:"extensions"`
|
||||
SubBefore string `json:"sub_before"`
|
||||
SubAfter string `json:"sub_after"`
|
||||
Branch string `json:"branch"`
|
||||
PullType string `json:"pull_type"`
|
||||
PullOption string `xorm:"JSON" json:"pull_option"`
|
||||
Pid int `xorm:"INTEGER" json:"pid"`
|
||||
IsDisabled int `xorm:"INTEGER" json:"is_disabled"`
|
||||
LogPath string `json:"log_path"`
|
||||
ScheduleType string `json:"schedule_type"`
|
||||
Alias string `xorm:"varchar(255) unique" json:"alias"`
|
||||
Createdat string `xorm:"not null DATETIME created" json:"createdat"`
|
||||
Updatedat string `xorm:"not null DATETIME updated" json:"updatedat"`
|
||||
|
||||
File io.WriteCloser `json:"-" xorm:"-"`
|
||||
}
|
||||
|
||||
func (s *Subscriptions) Close() error {
|
||||
return s.File.Close()
|
||||
}
|
||||
|
||||
func (s *Subscriptions) Write(p []byte) (n int, err error) {
|
||||
if s.File == nil {
|
||||
s.LogPath = "data/log/" + time.Now().Format("2006-01-02") + "/" + s.Alias + "_" + uuid.New().String() + ".log"
|
||||
s.Status = 1
|
||||
_ = UpdateSubscription(s)
|
||||
_ = os.MkdirAll(filepath.Dir(s.LogPath), 0666)
|
||||
s.File, _ = os.OpenFile(s.LogPath, os.O_CREATE|os.O_RDWR, 0666)
|
||||
}
|
||||
return s.File.Write(p)
|
||||
}
|
||||
func (s *Subscriptions) WriteString(data string) (n int, err error) {
|
||||
p := []byte(data)
|
||||
if s.File == nil {
|
||||
s.LogPath = "data/log/" + time.Now().Format("2006-01-02") + "/" + s.Alias + "_" + uuid.New().String() + ".log"
|
||||
s.Status = 1
|
||||
_ = UpdateSubscription(s)
|
||||
_ = os.MkdirAll(filepath.Dir(s.LogPath), 0666)
|
||||
s.File, _ = os.OpenFile(s.LogPath, os.O_CREATE|os.O_RDWR, 0666)
|
||||
}
|
||||
return s.File.Write(p)
|
||||
}
|
||||
|
||||
func QuerySubscription(searchValue string) ([]*Subscriptions, error) {
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
package models
|
||||
|
||||
import (
|
||||
log2 "github.com/huoxue1/qinglong-go/utils/log"
|
||||
log "github.com/sirupsen/logrus"
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
"github.com/huoxue1/go-utils/base/log"
|
||||
xLog "github.com/huoxue1/go-utils/base/log/xorm"
|
||||
_ "modernc.org/sqlite"
|
||||
"os"
|
||||
"xorm.io/xorm"
|
||||
|
@ -12,15 +13,20 @@ var (
|
|||
engine *xorm.Engine
|
||||
)
|
||||
|
||||
func init() {
|
||||
func InitModels() {
|
||||
_ = os.MkdirAll("data/db", 0666)
|
||||
en, err := xorm.NewEngine("sqlite", "data/db/database.sqlite")
|
||||
//en, err := xorm.NewEngine("mysql", "root:123@tcp(127.0.0.1:3306)/ql?charset=utf8")
|
||||
|
||||
if err != nil {
|
||||
log.Errorln("[sql] " + err.Error())
|
||||
return
|
||||
}
|
||||
_ = en.Sync2(new(Apps), new(Auths), new(Crontabs), new(Crontabviews), new(Dependences), new(Envs), new(Subscriptions))
|
||||
en.ShowSQL(true)
|
||||
en.SetLogger(new(log2.MyLog))
|
||||
err = en.Sync2(new(Apps), new(Auths), new(Crontabs), new(Crontabviews), new(Dependences), new(Envs), new(Subscriptions))
|
||||
if err != nil {
|
||||
log.Errorln("[sql] " + err.Error())
|
||||
return
|
||||
}
|
||||
en.SetLogger(xLog.GetXormLogger(log.StandardLogger(), "info", false))
|
||||
engine = en
|
||||
}
|
||||
|
|
|
@ -2,8 +2,8 @@ package service
|
|||
|
||||
import (
|
||||
"context"
|
||||
log "github.com/huoxue1/go-utils/base/log"
|
||||
"github.com/huoxue1/qinglong-go/utils"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"os"
|
||||
"path"
|
||||
)
|
||||
|
@ -21,9 +21,9 @@ func runYarn() {
|
|||
return
|
||||
}
|
||||
ch := make(chan int, 1)
|
||||
utils.RunTask(context.WithValue(context.Background(), "cancel", ch), "yarn install", map[string]string{}, func(ctx context.Context) {
|
||||
log.Infoln("开始执行yarn初始化!")
|
||||
utils.RunTask(context.WithValue(context.Background(), "cancel", ch), "pnpm install", map[string]string{}, func(ctx context.Context) {
|
||||
log.Infoln("开始执行pnpm初始化!")
|
||||
}, func(ctx context.Context) {
|
||||
log.Infoln("yarn初始化执行完成!")
|
||||
log.Infoln("pnpm初始化执行完成!")
|
||||
}, os.Stdout)
|
||||
}
|
||||
|
|
|
@ -24,7 +24,7 @@ func GetKey(key, defaultValue string) string {
|
|||
}
|
||||
|
||||
func GetVersion() string {
|
||||
return VERSION
|
||||
return strings.TrimPrefix(VERSION, "v")
|
||||
}
|
||||
|
||||
var address string
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
package config
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestGetKey(t *testing.T) {
|
||||
println(GetKey("AutoDelCron"))
|
||||
}
|
|
@ -4,12 +4,12 @@ import (
|
|||
"context"
|
||||
"fmt"
|
||||
"github.com/google/uuid"
|
||||
log "github.com/huoxue1/go-utils/base/log"
|
||||
"github.com/huoxue1/qinglong-go/internal/cron-manager"
|
||||
"github.com/huoxue1/qinglong-go/models"
|
||||
"github.com/huoxue1/qinglong-go/service/config"
|
||||
"github.com/huoxue1/qinglong-go/service/env"
|
||||
"github.com/huoxue1/qinglong-go/utils"
|
||||
cron_manager "github.com/huoxue1/qinglong-go/utils/cron-manager"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"io"
|
||||
"os"
|
||||
"os/exec"
|
||||
|
@ -25,11 +25,6 @@ var (
|
|||
execManager sync.Map
|
||||
)
|
||||
|
||||
func init() {
|
||||
initTask()
|
||||
models.SetAllCornStop()
|
||||
}
|
||||
|
||||
type task struct {
|
||||
cmd string
|
||||
isNow bool
|
||||
|
@ -38,7 +33,7 @@ type task struct {
|
|||
dir string
|
||||
}
|
||||
|
||||
func initTask() {
|
||||
func InitTask() {
|
||||
enableCrons := models.FindAllEnableCron()
|
||||
for _, c := range enableCrons {
|
||||
AddTask(c)
|
||||
|
|
|
@ -4,8 +4,8 @@ import (
|
|||
"github.com/huoxue1/qinglong-go/utils"
|
||||
"os"
|
||||
|
||||
log "github.com/huoxue1/go-utils/base/log"
|
||||
"github.com/panjf2000/ants/v2"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
func init() {
|
||||
|
|
|
@ -8,6 +8,7 @@ import (
|
|||
"github.com/huoxue1/qinglong-go/service/config"
|
||||
"github.com/huoxue1/qinglong-go/utils"
|
||||
"io"
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
@ -22,12 +23,45 @@ func AddDep(dep *models.Dependences) {
|
|||
}
|
||||
}
|
||||
|
||||
func DelDep(ids []int) {
|
||||
for _, id := range ids {
|
||||
dep, err := models.GetDependences(id)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
if dep.Type == models.NODE {
|
||||
unInstallDep("pnpm remove "+dep.Name, dep)
|
||||
} else if dep.Type == models.PYTHON {
|
||||
pip := config.GetKey("PipCmd", "pip")
|
||||
unInstallDep(fmt.Sprintf("%s uninstall %s", pip, dep.Name), dep)
|
||||
} else {
|
||||
unInstallDep("apk uninstall "+dep.Name, dep)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
func unInstallDep(command string, dep *models.Dependences) {
|
||||
ctx := context.WithValue(context.Background(), "cancel", make(chan int, 1))
|
||||
now := time.Now()
|
||||
go utils.RunTask(ctx, command, map[string]string{}, func(ctx context.Context) {
|
||||
writer := ctx.Value("log").(io.Writer)
|
||||
_, _ = writer.Write([]byte(fmt.Sprintf("##开始执行.. %s\n\n", now.Format("2006-01-02 15:04:05"))))
|
||||
}, func(ctx context.Context) {
|
||||
writer := ctx.Value("log").(io.Writer)
|
||||
_, _ = writer.Write([]byte(fmt.Sprintf("\n##执行结束.. %s,耗时%.1f秒\n\n", time.Now().Format("2006-01-02 15:04:05"), time.Now().Sub(now).Seconds())))
|
||||
_ = models.DeleteDependences(dep.Id)
|
||||
}, os.Stdout)
|
||||
}
|
||||
|
||||
func addNodeDep(dep *models.Dependences) {
|
||||
log := ""
|
||||
buffer := bytes.NewBufferString(log)
|
||||
ctx := context.WithValue(context.Background(), "cancel", make(chan int, 1))
|
||||
now := time.Now()
|
||||
utils.RunTask(ctx, fmt.Sprintf("yarn add %s", dep.Name), map[string]string{}, func(ctx context.Context) {
|
||||
go utils.RunTask(ctx, fmt.Sprintf("pnpm add %s", dep.Name), map[string]string{}, func(ctx context.Context) {
|
||||
dep.Status = 0
|
||||
_, _ = models.AddDependences(dep)
|
||||
writer := ctx.Value("log").(io.Writer)
|
||||
writer.Write([]byte(fmt.Sprintf("##开始执行.. %s\n\n", now.Format("2006-01-02 15:04:05"))))
|
||||
}, func(ctx context.Context) {
|
||||
|
@ -39,7 +73,7 @@ func addNodeDep(dep *models.Dependences) {
|
|||
logs = append(logs, i2+"\n\n")
|
||||
}
|
||||
dep.Log = logs
|
||||
models.AddDependences(dep)
|
||||
_ = models.UpdateDependences(dep)
|
||||
}, buffer)
|
||||
}
|
||||
|
||||
|
@ -49,7 +83,9 @@ func addPythonDep(dep *models.Dependences) {
|
|||
ctx := context.WithValue(context.Background(), "cancel", make(chan int, 1))
|
||||
now := time.Now()
|
||||
pip := config.GetKey("PipCmd", "pip")
|
||||
utils.RunTask(ctx, fmt.Sprintf(pip+" install %s", dep.Name), map[string]string{}, func(ctx context.Context) {
|
||||
go utils.RunTask(ctx, fmt.Sprintf(pip+" install %s", dep.Name), map[string]string{}, func(ctx context.Context) {
|
||||
dep.Status = 0
|
||||
_, _ = models.AddDependences(dep)
|
||||
writer := ctx.Value("log").(io.Writer)
|
||||
writer.Write([]byte(fmt.Sprintf("##开始执行.. %s\n\n", now.Format("2006-01-02 15:04:05"))))
|
||||
}, func(ctx context.Context) {
|
||||
|
@ -61,7 +97,7 @@ func addPythonDep(dep *models.Dependences) {
|
|||
logs = append(logs, i2+"\n\n")
|
||||
}
|
||||
dep.Log = logs
|
||||
models.AddDependences(dep)
|
||||
models.UpdateDependences(dep)
|
||||
}, buffer)
|
||||
}
|
||||
|
||||
|
@ -70,7 +106,9 @@ func addLinuxDep(dep *models.Dependences) {
|
|||
buffer := bytes.NewBufferString(log)
|
||||
ctx := context.WithValue(context.Background(), "cancel", make(chan int, 1))
|
||||
now := time.Now()
|
||||
utils.RunTask(ctx, fmt.Sprintf("apk add %s", dep.Name), map[string]string{}, func(ctx context.Context) {
|
||||
go utils.RunTask(ctx, fmt.Sprintf("apk add %s", dep.Name), map[string]string{}, func(ctx context.Context) {
|
||||
dep.Status = 0
|
||||
_, _ = models.AddDependences(dep)
|
||||
writer := ctx.Value("log").(io.Writer)
|
||||
writer.Write([]byte(fmt.Sprintf("##开始执行.. %s\n\n", now.Format("2006-01-02 15:04:05"))))
|
||||
}, func(ctx context.Context) {
|
||||
|
@ -82,6 +120,6 @@ func addLinuxDep(dep *models.Dependences) {
|
|||
logs = append(logs, i2+"\n\n")
|
||||
}
|
||||
dep.Log = logs
|
||||
models.AddDependences(dep)
|
||||
models.UpdateDependences(dep)
|
||||
}, buffer)
|
||||
}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
package env
|
||||
|
||||
import (
|
||||
log "github.com/huoxue1/go-utils/base/log"
|
||||
"github.com/huoxue1/qinglong-go/models"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"os"
|
||||
"regexp"
|
||||
"time"
|
||||
|
@ -13,6 +13,36 @@ var (
|
|||
ENABLESTATUS = 0
|
||||
)
|
||||
|
||||
func MoveEnv(id int, fromIndex, toIndex int64) error {
|
||||
if fromIndex < toIndex {
|
||||
envs, err := models.QueryEnvByIndex(fromIndex, toIndex)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, env := range envs {
|
||||
env.SerialIndex = env.SerialIndex - 1
|
||||
_ = models.UpdateEnv(env)
|
||||
}
|
||||
|
||||
} else {
|
||||
envs, err := models.QueryEnvByIndex(toIndex, fromIndex)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, env := range envs {
|
||||
env.SerialIndex = env.SerialIndex + 1
|
||||
_ = models.UpdateEnv(env)
|
||||
}
|
||||
}
|
||||
env, err := models.GetEnv(id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
env.SerialIndex = toIndex
|
||||
_ = models.UpdateEnv(env)
|
||||
return nil
|
||||
}
|
||||
|
||||
func AddEnv(env *models.Envs) (int, error) {
|
||||
return models.AddEnv(env)
|
||||
}
|
||||
|
|
|
@ -4,9 +4,9 @@ import (
|
|||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
log "github.com/huoxue1/go-utils/base/log"
|
||||
"github.com/huoxue1/qinglong-go/utils"
|
||||
"github.com/imroc/req/v3"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"github.com/tidwall/gjson"
|
||||
"os"
|
||||
"path"
|
||||
|
|
|
@ -3,7 +3,7 @@ package notification
|
|||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
log "github.com/sirupsen/logrus"
|
||||
log "github.com/huoxue1/go-utils/base/log"
|
||||
"github.com/tidwall/gjson"
|
||||
"net/http"
|
||||
"net/url"
|
||||
|
|
|
@ -71,25 +71,34 @@ func Run(filePath, content string) (string, error) {
|
|||
}
|
||||
id := uuid.New().String()
|
||||
logPath := "data/log/" + time.Now().Format("2006-01-02") + "/" + filepath.Base(filePath) + "_" + id + ".log"
|
||||
cmd := getCmd(filePath)
|
||||
os.Mkdir(filepath.Dir(logPath), 0666)
|
||||
dir, cmd := getCmd(filePath)
|
||||
cancelChan := make(chan int, 1)
|
||||
ctx := context.WithValue(context.Background(), "cancel", cancelChan)
|
||||
now := time.Now()
|
||||
file, _ := os.OpenFile(logPath, os.O_RDWR|os.O_CREATE, 0666)
|
||||
go utils.RunTask(ctx, cmd, env.GetALlEnv(), func(ctx context.Context) {
|
||||
writer := ctx.Value("log").(io.Writer)
|
||||
_, _ = writer.Write([]byte(fmt.Sprintf("##开始执行.. %s\n\n", now.Format("2006-01-02 15:04:05"))))
|
||||
}, func(ctx context.Context) {
|
||||
writer := ctx.Value("log").(io.Writer)
|
||||
_, _ = writer.Write([]byte(fmt.Sprintf("\n##执行结束.. %s,耗时%.1f秒\n\n", time.Now().Format("2006-01-02 15:04:05"), time.Now().Sub(now).Seconds())))
|
||||
_ = os.Remove(filePath)
|
||||
// 等待结束三分钟后再删除
|
||||
go func() {
|
||||
time.Sleep(time.Minute * 3)
|
||||
scriptRunPidMap.LoadAndDelete(id)
|
||||
}()
|
||||
go utils.RunWithOption(ctx, &utils.RunOption{
|
||||
Ctx: ctx,
|
||||
Command: cmd,
|
||||
Env: env.GetALlEnv(),
|
||||
OnStart: func(ctx context.Context) {
|
||||
writer := ctx.Value("log").(io.Writer)
|
||||
_, _ = writer.Write([]byte(fmt.Sprintf("##开始执行.. %s\n\n", now.Format("2006-01-02 15:04:05"))))
|
||||
},
|
||||
OnEnd: func(ctx context.Context) {
|
||||
writer := ctx.Value("log").(io.Writer)
|
||||
_, _ = writer.Write([]byte(fmt.Sprintf("\n##执行结束.. %s,耗时%.1f秒\n\n", time.Now().Format("2006-01-02 15:04:05"), time.Now().Sub(now).Seconds())))
|
||||
_ = os.Remove(filePath)
|
||||
// 等待结束三分钟后再删除
|
||||
go func() {
|
||||
time.Sleep(time.Minute * 3)
|
||||
scriptRunPidMap.LoadAndDelete(id)
|
||||
}()
|
||||
|
||||
}, file)
|
||||
},
|
||||
LogFile: file,
|
||||
CmdDir: dir,
|
||||
})
|
||||
scriptRunPidMap.Store(id, &task{
|
||||
id: id,
|
||||
c: cancelChan,
|
||||
|
@ -98,17 +107,17 @@ func Run(filePath, content string) (string, error) {
|
|||
return id, nil
|
||||
}
|
||||
|
||||
func getCmd(filePath string) string {
|
||||
func getCmd(filePath string) (dir string, cmd string) {
|
||||
ext := filepath.Ext(filePath)
|
||||
switch ext {
|
||||
case ".js":
|
||||
return fmt.Sprintf("%s %s", "node", filePath)
|
||||
return "./data/scripts/", fmt.Sprintf("%s %s", "node", filePath)
|
||||
case ".py":
|
||||
return fmt.Sprintf("%s %s", "python", filePath)
|
||||
return "./data/scripts/", fmt.Sprintf("%s %s", "python", filePath)
|
||||
case ".go":
|
||||
return fmt.Sprintf("go run %s", filePath)
|
||||
return path.Join("./data/scripts/", filepath.Dir(filePath)), fmt.Sprintf("go run %s", filepath.Base(filePath))
|
||||
}
|
||||
return ""
|
||||
return "./data/scripts/", ""
|
||||
}
|
||||
|
||||
func GetFiles(base, p string) []*File {
|
||||
|
|
|
@ -0,0 +1,71 @@
|
|||
package server
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"github.com/huoxue1/qinglong-go/service/config"
|
||||
"github.com/huoxue1/qinglong-go/utils"
|
||||
)
|
||||
|
||||
func Run(ctx context.Context, path string, query map[string]string, body map[string]any, header map[string]string, isLog bool) string {
|
||||
cmd := getCommand(path)
|
||||
buffer := bytes.NewBuffer([]byte(""))
|
||||
option := &utils.RunOption{
|
||||
Ctx: ctx,
|
||||
Command: cmd,
|
||||
Env: getEnv(query, body, header),
|
||||
OnStart: func(ctx context.Context) {
|
||||
|
||||
},
|
||||
OnEnd: func(ctx context.Context) {
|
||||
|
||||
},
|
||||
LogFile: buffer,
|
||||
CmdDir: "./data/scripts/",
|
||||
}
|
||||
utils.RunWithOption(ctx, option)
|
||||
if isLog {
|
||||
return string(buffer.Bytes())
|
||||
}
|
||||
return getData(buffer.Bytes())
|
||||
}
|
||||
|
||||
func getCommand(path string) (cmd string) {
|
||||
|
||||
pythonCmd := config.GetKey("PythonCmd", "python")
|
||||
JsCmd := config.GetKey("JsCmd", "node")
|
||||
ShCmd := config.GetKey("ShCmd", "bash")
|
||||
|
||||
if strings.HasSuffix(path, ".py") {
|
||||
cmd = pythonCmd + " " + path
|
||||
} else if strings.HasSuffix(path, ".js") {
|
||||
cmd = JsCmd + " " + path
|
||||
} else if strings.HasSuffix(path, ".sh") {
|
||||
cmd = ShCmd + " " + path
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func getData(data []byte) (result string) {
|
||||
resultReg := `>>>(.*?)<<<`
|
||||
compile := regexp.MustCompile(resultReg)
|
||||
if compile.Match(data) {
|
||||
result = string(compile.FindAllSubmatch(data, -1)[0][1])
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func getEnv(query map[string]string, body map[string]any, header map[string]string) map[string]string {
|
||||
queryData, _ := json.Marshal(query)
|
||||
bodyData, _ := json.Marshal(body)
|
||||
headerData, _ := json.Marshal(header)
|
||||
return map[string]string{
|
||||
"QL_HEADERS": string(headerData),
|
||||
"QL_BODY": string(bodyData),
|
||||
"QL_QUERY": string(queryData),
|
||||
}
|
||||
}
|
|
@ -4,29 +4,30 @@ import (
|
|||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/google/uuid"
|
||||
"github.com/huoxue1/qinglong-go/models"
|
||||
"github.com/huoxue1/qinglong-go/service/config"
|
||||
"github.com/huoxue1/qinglong-go/service/cron"
|
||||
"github.com/huoxue1/qinglong-go/utils"
|
||||
cron_manager "github.com/huoxue1/qinglong-go/utils/cron-manager"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"io"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/go-git/go-git/v5"
|
||||
"github.com/go-git/go-git/v5/plumbing"
|
||||
"github.com/go-git/go-git/v5/plumbing/transport"
|
||||
"github.com/huoxue1/go-utils/base/log"
|
||||
"github.com/huoxue1/qinglong-go/internal/cron-manager"
|
||||
"github.com/huoxue1/qinglong-go/models"
|
||||
"github.com/huoxue1/qinglong-go/service/config"
|
||||
"github.com/huoxue1/qinglong-go/service/cron"
|
||||
"github.com/huoxue1/qinglong-go/utils"
|
||||
)
|
||||
|
||||
var (
|
||||
manager sync.Map
|
||||
)
|
||||
|
||||
func init() {
|
||||
func InitSub() {
|
||||
log.Infoln("开始初始化订阅任务定时!")
|
||||
subscriptions, err := models.QuerySubscription("")
|
||||
if err != nil {
|
||||
|
@ -95,10 +96,6 @@ func downloadFiles(subscriptions *models.Subscriptions) {
|
|||
}
|
||||
|
||||
func addRawFiles(subscriptions *models.Subscriptions) {
|
||||
subscriptions.LogPath = "data/log/" + time.Now().Format("2006-01-02") + "/" + subscriptions.Alias + "_" + uuid.New().String() + ".log"
|
||||
subscriptions.Status = 0
|
||||
file, _ := os.OpenFile(subscriptions.LogPath, os.O_CREATE|os.O_RDWR, 0666)
|
||||
defer file.Close()
|
||||
_ = models.UpdateSubscription(subscriptions)
|
||||
defer func() {
|
||||
subscriptions.Status = 1
|
||||
|
@ -106,19 +103,19 @@ func addRawFiles(subscriptions *models.Subscriptions) {
|
|||
}()
|
||||
err := utils.DownloadFile(subscriptions.Url, path.Join("data", "raw", subscriptions.Alias))
|
||||
if err != nil {
|
||||
_, _ = file.WriteString(err.Error() + "\n")
|
||||
_, _ = subscriptions.WriteString(err.Error() + "\n")
|
||||
return
|
||||
}
|
||||
name, c, err := getSubCron(path.Join("data", "raw", subscriptions.Alias))
|
||||
if err != nil {
|
||||
_, _ = file.WriteString(err.Error() + "\n")
|
||||
_, _ = subscriptions.WriteString(err.Error() + "\n")
|
||||
return
|
||||
}
|
||||
utils.Copy(path.Join("data", "raw", subscriptions.Alias), path.Join("data", "scripts", subscriptions.Alias))
|
||||
if c != "" {
|
||||
command, err := models.GetCronByCommand(fmt.Sprintf("task %s", subscriptions.Alias))
|
||||
if err != nil {
|
||||
file.WriteString("已添加新的定时任务 " + name + "\n")
|
||||
subscriptions.WriteString("已添加新的定时任务 " + name + "\n")
|
||||
_, _ = cron.AddCron(&models.Crontabs{
|
||||
Name: name,
|
||||
Command: fmt.Sprintf("task %s", subscriptions.Alias),
|
||||
|
@ -136,40 +133,26 @@ func addRawFiles(subscriptions *models.Subscriptions) {
|
|||
}
|
||||
|
||||
func downloadPublicRepo(subscriptions *models.Subscriptions) error {
|
||||
subscriptions.LogPath = "data/log/" + time.Now().Format("2006-01-02") + "/" + subscriptions.Alias + "_" + uuid.New().String() + ".log"
|
||||
_ = os.MkdirAll(filepath.Dir(subscriptions.LogPath), 0666)
|
||||
cmd := fmt.Sprintf("clone -b %s --single-branch %s %s", subscriptions.Branch, subscriptions.Url, path.Join("data", "repo", subscriptions.Alias))
|
||||
command := exec.Command("git", strings.Split(cmd, " ")...)
|
||||
pipe, err := command.StdoutPipe()
|
||||
stderrPipe, _ := command.StderrPipe()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
subscriptions.Status = 0
|
||||
err = models.UpdateSubscription(subscriptions)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
file, _ := os.OpenFile(subscriptions.LogPath, os.O_CREATE|os.O_RDWR, 0666)
|
||||
file.Write([]byte(fmt.Sprintf("##开始执行.. %s\n\n", time.Now().Format("2006-01-02 15:04:05"))))
|
||||
err = command.Start()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
manager.Store(subscriptions.Id, func() {
|
||||
command.Process.Kill()
|
||||
})
|
||||
|
||||
go io.Copy(io.MultiWriter(file, os.Stdout), pipe)
|
||||
go io.Copy(file, stderrPipe)
|
||||
command.Wait()
|
||||
_, _ = subscriptions.Write([]byte(fmt.Sprintf("##开始执行.. %s\n\n", time.Now().Format("2006-01-02 15:04:05"))))
|
||||
|
||||
_, err := git.PlainClone(path.Join("data", "repo", subscriptions.Alias), false, &git.CloneOptions{
|
||||
URL: subscriptions.Url,
|
||||
SingleBranch: true,
|
||||
ReferenceName: plumbing.ReferenceName(fmt.Sprintf("refs/heads/%s", subscriptions.Branch)),
|
||||
Progress: subscriptions,
|
||||
ProxyOptions: transport.ProxyOptions{URL: config.GetKey("ProxyUrl", "")},
|
||||
})
|
||||
if err != nil {
|
||||
_, _ = subscriptions.Write([]byte(fmt.Sprintf("err: %s", err.Error())))
|
||||
return err
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func addScripts(subscriptions *models.Subscriptions) {
|
||||
depFiles := getDepFiles()
|
||||
file, _ := os.OpenFile(subscriptions.LogPath, os.O_RDWR|os.O_APPEND, 0666)
|
||||
defer file.Close()
|
||||
var extensions []string
|
||||
if subscriptions.Extensions != "" {
|
||||
extensions = strings.Split(subscriptions.Extensions, " ")
|
||||
|
@ -216,10 +199,10 @@ func addScripts(subscriptions *models.Subscriptions) {
|
|||
Labels: []string{},
|
||||
})
|
||||
if err1 != nil {
|
||||
file.WriteString("定时任务添加失败: " + name + " " + err1.Error())
|
||||
err1 = nil
|
||||
_, _ = subscriptions.WriteString("定时任务添加失败: " + name + " " + err1.Error())
|
||||
|
||||
} else {
|
||||
file.WriteString("已添加新的定时任务 " + name + "\n")
|
||||
_, _ = subscriptions.WriteString("已添加新的定时任务 " + name + "\n")
|
||||
}
|
||||
} else {
|
||||
command.Name = name
|
||||
|
@ -237,18 +220,18 @@ func addScripts(subscriptions *models.Subscriptions) {
|
|||
}
|
||||
}
|
||||
if utils.In(entry.Name(), depFiles) {
|
||||
file.WriteString("已替换依赖文件: " + entry.Name() + "\n")
|
||||
subscriptions.WriteString("已替换依赖文件: " + entry.Name() + "\n")
|
||||
utils.Copy(path.Join("data", "deps", entry.Name()), path.Join("data", "scripts", subscriptions.Alias, entry.Name()))
|
||||
}
|
||||
}
|
||||
if config.GetKey("AutoDelCron", "true") == "true" {
|
||||
for _, m := range cronMap {
|
||||
file.WriteString("已删除失效的任务 " + m.Name + "\n")
|
||||
subscriptions.WriteString("已删除失效的任务 " + m.Name + "\n")
|
||||
models.DeleteCron(m.Id)
|
||||
}
|
||||
}
|
||||
if isGoMod {
|
||||
file.WriteString("检测到go模块,开始自动下载golang依赖!!")
|
||||
subscriptions.WriteString("检测到go模块,开始自动下载golang依赖!!")
|
||||
cancelChan := make(chan int, 1)
|
||||
ctx := context.WithValue(context.Background(), "cancel", cancelChan)
|
||||
utils.RunWithOption(ctx, &utils.RunOption{
|
||||
|
@ -260,7 +243,7 @@ func addScripts(subscriptions *models.Subscriptions) {
|
|||
OnEnd: func(ctx context.Context) {
|
||||
|
||||
},
|
||||
LogFile: file,
|
||||
LogFile: subscriptions,
|
||||
CmdDir: path.Join("data", "scripts", subscriptions.Alias),
|
||||
})
|
||||
}
|
||||
|
@ -277,17 +260,19 @@ func getSubCron(filePath string) (name string, cron string, err error) {
|
|||
}
|
||||
cronReg := regexp.MustCompile(`([0-9\-*/,]{1,} ){4,5}([0-9\-*/,]){1,}`)
|
||||
nameEnv := regexp.MustCompile(`new\sEnv\(['|"](.*?)['|"]\)`)
|
||||
if cronReg.Match(data) {
|
||||
cron = string(cronReg.FindAll(data, 1)[0])
|
||||
cron = strings.TrimPrefix(cron, "//")
|
||||
if nameEnv.Match(data) {
|
||||
name = string(nameEnv.FindAllSubmatch(data, 1)[0][1])
|
||||
if nameEnv.Match(data) {
|
||||
if cronReg.Match(data) {
|
||||
cron = strings.TrimPrefix(strings.TrimPrefix(string(cronReg.FindAll(data, 1)[0]), "//"), " ")
|
||||
} else {
|
||||
name = path.Base(filePath)
|
||||
key := config.GetKey("DefaultCronRule", "0 9 * * *")
|
||||
if key == "" {
|
||||
key = "0 9 * * *"
|
||||
}
|
||||
cron = key
|
||||
}
|
||||
name = string(nameEnv.FindAllSubmatch(data, 1)[0][1])
|
||||
return
|
||||
} else {
|
||||
return "", "", errors.New("not found cron")
|
||||
}
|
||||
cron = strings.TrimPrefix(cron, " ")
|
||||
return
|
||||
}
|
||||
|
|
|
@ -1,38 +1,9 @@
|
|||
package user
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"github.com/huoxue1/qinglong-go/utils"
|
||||
"os"
|
||||
)
|
||||
|
||||
type Info struct {
|
||||
Username string `json:"username"`
|
||||
Password string `json:"password"`
|
||||
Token string `json:"token"`
|
||||
Tokens struct {
|
||||
Desktop string `json:"desktop"`
|
||||
Mobile string `json:"mobile"`
|
||||
} `json:"tokens"`
|
||||
Lastlogon int64 `json:"lastlogon"`
|
||||
Retries int `json:"retries"`
|
||||
Lastip string `json:"lastip"`
|
||||
Lastaddr string `json:"lastaddr"`
|
||||
Platform string `json:"platform"`
|
||||
IsTwoFactorChecking bool `json:"isTwoFactorChecking"`
|
||||
}
|
||||
|
||||
func GetUserInfo() (*Info, error) {
|
||||
i := new(Info)
|
||||
file, err := os.ReadFile("./data/config/auth.json")
|
||||
if err != nil {
|
||||
return i, err
|
||||
}
|
||||
err = json.Unmarshal(file, i)
|
||||
return i, err
|
||||
|
||||
}
|
||||
|
||||
type Ip struct {
|
||||
Ip string `json:"ip"`
|
||||
Pro string `json:"pro"`
|
||||
|
|
|
@ -1,55 +0,0 @@
|
|||
package cron_manager
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"github.com/huoxue1/qinglong-go/utils/log"
|
||||
"github.com/robfig/cron/v3"
|
||||
"strings"
|
||||
"sync"
|
||||
)
|
||||
|
||||
var (
|
||||
manager sync.Map
|
||||
defaultCron *cron.Cron
|
||||
SixCron *cron.Cron
|
||||
)
|
||||
|
||||
type mapValue struct {
|
||||
en cron.EntryID
|
||||
c *cron.Cron
|
||||
}
|
||||
|
||||
func init() {
|
||||
defaultCron = cron.New(cron.WithChain(cron.Recover(&log.CronLog{})))
|
||||
SixCron = cron.New(cron.WithChain(cron.Recover(&log.CronLog{})), cron.WithParser(
|
||||
cron.NewParser(cron.Second|cron.Minute|cron.Hour|cron.Dom|cron.Month|cron.Dow|cron.Descriptor)))
|
||||
defaultCron.Start()
|
||||
SixCron.Start()
|
||||
}
|
||||
|
||||
func AddCron(id string, value string, task func()) error {
|
||||
if value == "7 7 7 7 7" {
|
||||
value = "7 7 7 7 6"
|
||||
}
|
||||
crons := strings.Split(value, " ")
|
||||
cronCmd := defaultCron
|
||||
if len(crons) == 6 {
|
||||
cronCmd = SixCron
|
||||
}
|
||||
en, err := cronCmd.AddFunc(value, task)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
manager.Store(id, &mapValue{en, cronCmd})
|
||||
return nil
|
||||
}
|
||||
|
||||
func DeleteCron(id string) error {
|
||||
value, loaded := manager.LoadAndDelete(id)
|
||||
if !loaded {
|
||||
return errors.New("the cron " + id + " not found!")
|
||||
}
|
||||
v := value.(*mapValue)
|
||||
v.c.Remove(v.en)
|
||||
return nil
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
package env_check
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/dablelv/go-huge-util/zip"
|
||||
log "github.com/huoxue1/go-utils/base/log"
|
||||
"github.com/huoxue1/qinglong-go/service/config"
|
||||
"github.com/huoxue1/qinglong-go/utils"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func CheckStatic() {
|
||||
if !utils.FileExist("./static/") {
|
||||
version := config.GetVersion()
|
||||
if !strings.HasPrefix(version, "v") {
|
||||
version = "v1.0.0"
|
||||
}
|
||||
log.Warningln("检测到静态文件资源不存在,即将自动下载文件!")
|
||||
log.Infoln("downloading file from ", fmt.Sprintf("https://github.com/huoxue1/qinglong/releases/download/%s/static.zip", version))
|
||||
response, err := utils.GetClient().R().Get(fmt.Sprintf("https://github.com/huoxue1/qinglong/releases/download/%s/static.zip", version))
|
||||
if err != nil {
|
||||
log.Errorln("下载静态资源文件失败 " + err.Error())
|
||||
return
|
||||
}
|
||||
err = os.WriteFile("static.zip", response.Bytes(), 0666)
|
||||
if err != nil {
|
||||
log.Errorln("写入压缩文件错误 " + err.Error())
|
||||
return
|
||||
}
|
||||
err = zip.Unzip("static.zip", ".")
|
||||
if err != nil {
|
||||
log.Errorln(err.Error())
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
package utils
|
||||
|
||||
import (
|
||||
log "github.com/sirupsen/logrus"
|
||||
log "github.com/huoxue1/go-utils/base/log"
|
||||
"io"
|
||||
"net/http"
|
||||
"os"
|
||||
|
|
42
utils/jwt.go
42
utils/jwt.go
|
@ -3,7 +3,8 @@ package utils
|
|||
// jwt身份验证demo
|
||||
|
||||
import (
|
||||
"github.com/dgrijalva/jwt-go"
|
||||
"fmt"
|
||||
"github.com/golang-jwt/jwt/v5"
|
||||
"math/rand"
|
||||
"strings"
|
||||
"time"
|
||||
|
@ -12,45 +13,44 @@ import (
|
|||
// 设置jwt密钥secret
|
||||
var jwtSecret = []byte("qinglong")
|
||||
|
||||
type Claims struct {
|
||||
UserID string `json:"userid"`
|
||||
jwt.StandardClaims
|
||||
}
|
||||
|
||||
// GenerateToken 生成token的函数
|
||||
func GenerateToken(userid string, hour int) (string, error) {
|
||||
nowTime := time.Now()
|
||||
expireTime := nowTime.Add(time.Duration(hour) * time.Hour)
|
||||
|
||||
claims := Claims{
|
||||
userid, // 自行添加的信息
|
||||
jwt.StandardClaims{
|
||||
ExpiresAt: expireTime.Unix(), // 设置token过期时间
|
||||
Issuer: "gin-blog", // 设置jwt签发者
|
||||
},
|
||||
}
|
||||
// 生成token
|
||||
tokenClaims := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
|
||||
tokenClaims := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
|
||||
"userid": userid,
|
||||
"exp": expireTime.Unix(),
|
||||
"iat": nowTime.Unix(),
|
||||
"issuer": "qinglong-go",
|
||||
})
|
||||
token, err := tokenClaims.SignedString(jwtSecret)
|
||||
|
||||
return token, err
|
||||
}
|
||||
|
||||
// ParseToken 验证token的函数
|
||||
func ParseToken(token string) (*Claims, error) {
|
||||
func ParseToken(token string) (string, int64, error) {
|
||||
// 对token的密钥进行验证
|
||||
tokenClaims, err := jwt.ParseWithClaims(token, &Claims{}, func(token *jwt.Token) (interface{}, error) {
|
||||
tokenClaims, err := jwt.Parse(token, func(token *jwt.Token) (interface{}, error) {
|
||||
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
|
||||
return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
|
||||
}
|
||||
|
||||
// hmacSampleSecret is a []byte containing your secret, e.g. []byte("my_secret_key")
|
||||
return jwtSecret, nil
|
||||
})
|
||||
|
||||
// 判断token是否过期
|
||||
if err != nil {
|
||||
return "", 0, err
|
||||
}
|
||||
if tokenClaims != nil {
|
||||
if claims, ok := tokenClaims.Claims.(*Claims); ok && tokenClaims.Valid {
|
||||
return claims, nil
|
||||
if claims, ok := tokenClaims.Claims.(jwt.MapClaims); ok && tokenClaims.Valid {
|
||||
return claims["userid"].(string), int64(claims["exp"].(float64)), nil
|
||||
}
|
||||
}
|
||||
|
||||
return nil, err
|
||||
return "", 0, err
|
||||
}
|
||||
|
||||
func IsMobile(userAgent string) bool {
|
||||
|
|
|
@ -1,87 +0,0 @@
|
|||
package log
|
||||
|
||||
import (
|
||||
log "github.com/sirupsen/logrus"
|
||||
log2 "xorm.io/xorm/log"
|
||||
)
|
||||
|
||||
type MyLog struct {
|
||||
}
|
||||
|
||||
func (m *MyLog) Debug(v ...interface{}) {
|
||||
log.Debug(v)
|
||||
}
|
||||
|
||||
func (m *MyLog) Error(v ...interface{}) {
|
||||
log.Error(v)
|
||||
}
|
||||
|
||||
func (m *MyLog) Info(v ...interface{}) {
|
||||
log.Info(v)
|
||||
}
|
||||
|
||||
func (m *MyLog) Infof(format string, v ...interface{}) {
|
||||
log.Infof(format, v)
|
||||
}
|
||||
|
||||
func (m *MyLog) Warn(v ...interface{}) {
|
||||
log.Warn(v)
|
||||
}
|
||||
|
||||
func (m *MyLog) Level() log2.LogLevel {
|
||||
switch log.GetLevel() {
|
||||
case log.InfoLevel:
|
||||
return log2.LOG_INFO
|
||||
case log.DebugLevel:
|
||||
return log2.LOG_DEBUG
|
||||
case log.WarnLevel:
|
||||
return log2.LOG_WARNING
|
||||
case log.ErrorLevel:
|
||||
return log2.LOG_ERR
|
||||
default:
|
||||
return log2.LOG_UNKNOWN
|
||||
}
|
||||
}
|
||||
|
||||
func (m *MyLog) SetLevel(l log2.LogLevel) {
|
||||
|
||||
}
|
||||
|
||||
func (m *MyLog) ShowSQL(show ...bool) {
|
||||
|
||||
}
|
||||
|
||||
func (m *MyLog) IsShowSQL() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (m MyLog) Errorf(format string, v ...interface{}) {
|
||||
log.Errorf(format, v)
|
||||
}
|
||||
|
||||
func (m MyLog) Warnf(format string, v ...interface{}) {
|
||||
log.Warnf(format, v)
|
||||
}
|
||||
|
||||
func (m MyLog) Debugf(format string, v ...interface{}) {
|
||||
log.Debugf(format, v)
|
||||
}
|
||||
|
||||
type LogWriter struct {
|
||||
}
|
||||
|
||||
func (l *LogWriter) Write(p []byte) (n int, err error) {
|
||||
log.Debugln(string(p))
|
||||
return len(p), nil
|
||||
}
|
||||
|
||||
type CronLog struct {
|
||||
}
|
||||
|
||||
func (c *CronLog) Info(msg string, keysAndValues ...interface{}) {
|
||||
log.Infoln(msg, " ", keysAndValues)
|
||||
}
|
||||
|
||||
func (c *CronLog) Error(err error, msg string, keysAndValues ...interface{}) {
|
||||
log.Errorln(err)
|
||||
}
|
10
utils/run.go
10
utils/run.go
|
@ -3,12 +3,13 @@ package utils
|
|||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/huoxue1/qinglong-go/service/config"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"io"
|
||||
"os"
|
||||
"os/exec"
|
||||
"strings"
|
||||
|
||||
"github.com/huoxue1/go-utils/base/log"
|
||||
"github.com/huoxue1/qinglong-go/service/config"
|
||||
)
|
||||
|
||||
type Context struct {
|
||||
|
@ -105,7 +106,10 @@ func RunWithOption(ctx context.Context, option *RunOption) {
|
|||
}
|
||||
ch <- 1
|
||||
}()
|
||||
cancel := ctx.Value("cancel").(chan int)
|
||||
cancel, ok := ctx.Value("cancel").(chan int)
|
||||
if ok {
|
||||
cancel = make(chan int)
|
||||
}
|
||||
select {
|
||||
case <-ch:
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue