diff --git a/.github/workflows/goreleaser.yml b/.github/workflows/goreleaser.yml index b8306e9..ac81cde 100644 --- a/.github/workflows/goreleaser.yml +++ b/.github/workflows/goreleaser.yml @@ -22,13 +22,10 @@ jobs: go-version-file: go.mod - name: Run GoReleaser - run: | - docker run --rm \ - -e CGO_ENABLED=1 \ - -e GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }} \ - -v /var/run/docker.sock:/var/run/docker.sock \ - -v `pwd`:/go/src/github.com/vulsio/go-cti \ - -w /go/src/github.com/vulsio/go-cti \ - ghcr.io/goreleaser/goreleaser-cross:v1.20 \ - release --clean - + uses: goreleaser/goreleaser-action@v4 + with: + distribution: goreleaser + version: latest + args: release --clean + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.goreleaser.yml b/.goreleaser.yml index eece4de..914b923 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -4,46 +4,15 @@ release: owner: vulsio name: go-cti env: - - GO111MODULE=on - - CGO_ENABLED=1 + - CGO_ENABLED=0 builds: -- id: linux-amd64 +- id: go-cti goos: - linux - goarch: - - amd64 - env: - - CC=x86_64-linux-gnu-gcc - main: . - ldflags: -s -w -X github.com/vulsio/go-cti/config.Version={{.Version}} -X github.com/vulsio/go-cti/config.Revision={{.Commit}} - binary: go-cti -- id: linux-arm64 - goos: - - linux - goarch: - - arm64 - env: - - CC=aarch64-linux-gnu-gcc - main: . - ldflags: -s -w -X github.com/vulsio/go-cti/config.Version={{.Version}} -X github.com/vulsio/go-cti/config.Revision={{.Commit}} - binary: go-cti -- id: windows-amd64 - goos: - windows goarch: - amd64 - env: - - CC=x86_64-w64-mingw32-gcc - main: . - ldflags: -s -w -X github.com/vulsio/go-cti/config.Version={{.Version}} -X github.com/vulsio/go-cti/config.Revision={{.Commit}} - binary: go-cti -- id: windows-arm64 - goos: - - windows - goarch: - arm64 - env: - - CC=/llvm-mingw/bin/aarch64-w64-mingw32-gcc main: . ldflags: -s -w -X github.com/vulsio/go-cti/config.Version={{.Version}} -X github.com/vulsio/go-cti/config.Revision={{.Commit}} binary: go-cti diff --git a/GNUmakefile b/GNUmakefile index fe12c7d..64c5a36 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -29,7 +29,7 @@ REVISION := $(shell git rev-parse --short HEAD) BUILDTIME := $(shell date "+%Y%m%d_%H%M%S") LDFLAGS := -X 'github.com/vulsio/go-cti/config.Version=$(VERSION)' \ -X 'github.com/vulsio/go-cti/config.Revision=$(REVISION)' -GO := GO111MODULE=on go +GO := CGO_ENABLED=0 go all: build test @@ -40,11 +40,11 @@ install: main.go $(GO) install -ldflags "$(LDFLAGS)" lint: - $(GO) install github.com/mgechev/revive@latest + go install github.com/mgechev/revive@latest revive -config ./.revive.toml -formatter plain $(PKGS) golangci: - $(GO) install github.com/golangci/golangci-lint/cmd/golangci-lint@latest + go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest golangci-lint run vet: diff --git a/commands/fetch-cti.go b/commands/fetch-cti.go index 437abdc..1489619 100644 --- a/commands/fetch-cti.go +++ b/commands/fetch-cti.go @@ -30,10 +30,10 @@ func fetchMitreCti(_ *cobra.Command, _ []string) (err error) { return xerrors.Errorf("Failed to SetLogger. err: %w", err) } - driver, locked, err := db.NewDB(viper.GetString("dbtype"), viper.GetString("dbpath"), viper.GetBool("debug-sql"), db.Option{}) + driver, err := db.NewDB(viper.GetString("dbtype"), viper.GetString("dbpath"), viper.GetBool("debug-sql"), db.Option{}) if err != nil { - if locked { - return xerrors.Errorf("Failed to initialize DB. Close DB connection before fetching. err: %w", err) + if xerrors.Is(err, db.ErrDBLocked) { + return xerrors.Errorf("Failed to open DB. Close DB connection before fetching. err: %w", err) } return xerrors.Errorf("Failed to open DB. err: %w", err) } diff --git a/commands/search.go b/commands/search.go index af8586c..75216a8 100644 --- a/commands/search.go +++ b/commands/search.go @@ -18,7 +18,7 @@ var searchCmd = &cobra.Command{ Use: "search", Short: "Search the data of mitre/cti form DB", Long: `Search the data of mitrc/cti form DB`, - Args: func(cmd *cobra.Command, args []string) error { + Args: func(_ *cobra.Command, args []string) error { if len(args) < 2 { fmt.Println("[usage] $ go-cti search (cti|cve|attacker) $id1(, $id2...)") return xerrors.New("Failed to search. err: argument is missing") @@ -41,15 +41,10 @@ func searchCti(_ *cobra.Command, args []string) error { return xerrors.Errorf("Failed to SetLogger. err: %w", err) } - driver, locked, err := db.NewDB( - viper.GetString("dbtype"), - viper.GetString("dbpath"), - viper.GetBool("debug-sql"), - db.Option{}, - ) + driver, err := db.NewDB(viper.GetString("dbtype"), viper.GetString("dbpath"), viper.GetBool("debug-sql"), db.Option{}) if err != nil { - if locked { - return xerrors.Errorf("Failed to initialize DB. Close DB connection before fetching. err: %w", err) + if xerrors.Is(err, db.ErrDBLocked) { + return xerrors.Errorf("Failed to open DB. Close DB connection before fetching. err: %w", err) } return xerrors.Errorf("Failed to open DB. err: %w", err) } diff --git a/commands/server.go b/commands/server.go index 82dca2b..284d7da 100644 --- a/commands/server.go +++ b/commands/server.go @@ -38,10 +38,10 @@ func executeServer(_ *cobra.Command, _ []string) (err error) { return xerrors.Errorf("Failed to SetLogger. err: %w", err) } - driver, locked, err := db.NewDB(viper.GetString("dbtype"), viper.GetString("dbpath"), viper.GetBool("debug-sql"), db.Option{}) + driver, err := db.NewDB(viper.GetString("dbtype"), viper.GetString("dbpath"), viper.GetBool("debug-sql"), db.Option{}) if err != nil { - if locked { - return xerrors.Errorf("Failed to initialize DB. Close DB connection before fetching. err: %w", err) + if xerrors.Is(err, db.ErrDBLocked) { + return xerrors.Errorf("Failed to open DB. Close DB connection before fetching. err: %w", err) } return xerrors.Errorf("Failed to open DB. err: %w", err) } diff --git a/commands/version.go b/commands/version.go index 58380ce..c934122 100644 --- a/commands/version.go +++ b/commands/version.go @@ -16,7 +16,7 @@ var versionCmd = &cobra.Command{ Use: "version", Short: "Show version", Long: `Show version`, - Run: func(cmd *cobra.Command, args []string) { + Run: func(_ *cobra.Command, _ []string) { fmt.Printf("go-cti %s %s\n", config.Version, config.Revision) }, } diff --git a/db/db.go b/db/db.go index da09860..3ce36f3 100644 --- a/db/db.go +++ b/db/db.go @@ -12,7 +12,7 @@ import ( // DB : type DB interface { Name() string - OpenDB(dbType, dbPath string, debugSQL bool, option Option) (bool, error) + OpenDB(dbType, dbPath string, debugSQL bool, option Option) error MigrateDB() error CloseDB() error @@ -34,30 +34,27 @@ type Option struct { } // NewDB : -func NewDB(dbType string, dbPath string, debugSQL bool, option Option) (driver DB, locked bool, err error) { +func NewDB(dbType string, dbPath string, debugSQL bool, option Option) (driver DB, err error) { if driver, err = newDB(dbType); err != nil { - return driver, false, xerrors.Errorf("Failed to new db. err: %w", err) + return driver, xerrors.Errorf("Failed to new db. err: %w", err) } - if locked, err := driver.OpenDB(dbType, dbPath, debugSQL, option); err != nil { - if locked { - return nil, true, err - } - return nil, false, err + if err := driver.OpenDB(dbType, dbPath, debugSQL, option); err != nil { + return nil, xerrors.Errorf("Failed to open db. err: %w", err) } isV1, err := driver.IsGoCTIModelV1() if err != nil { - return nil, false, xerrors.Errorf("Failed to IsGoCTIModelV1. err: %w", err) + return nil, xerrors.Errorf("Failed to IsGoCTIModelV1. err: %w", err) } if isV1 { - return nil, false, xerrors.New("Failed to NewDB. Since SchemaVersion is incompatible, delete Database and fetch again.") + return nil, xerrors.New("Failed to NewDB. Since SchemaVersion is incompatible, delete Database and fetch again.") } if err := driver.MigrateDB(); err != nil { - return driver, false, xerrors.Errorf("Failed to migrate db. err: %w", err) + return driver, xerrors.Errorf("Failed to migrate db. err: %w", err) } - return driver, false, nil + return driver, nil } func newDB(dbType string) (DB, error) { diff --git a/db/rdb.go b/db/rdb.go index 29d93e8..755f00d 100644 --- a/db/rdb.go +++ b/db/rdb.go @@ -2,19 +2,19 @@ package db import ( "database/sql" + "encoding/json" "errors" "log" "os" "time" "github.com/cheggaaa/pb/v3" + "github.com/glebarez/sqlite" "github.com/inconshreveable/log15" - "github.com/mattn/go-sqlite3" "github.com/spf13/viper" "golang.org/x/xerrors" "gorm.io/driver/mysql" "gorm.io/driver/postgres" - "gorm.io/driver/sqlite" "gorm.io/gorm" "gorm.io/gorm/clause" "gorm.io/gorm/logger" @@ -35,13 +35,29 @@ type RDBDriver struct { conn *gorm.DB } +// https://github.com/mattn/go-sqlite3/blob/edc3bb69551dcfff02651f083b21f3366ea2f5ab/error.go#L18-L66 +type errNo int + +type sqliteError struct { + Code errNo /* The error code returned by SQLite */ +} + +// result codes from http://www.sqlite.org/c3ref/c_abort.html +var ( + errBusy = errNo(5) /* The database file is locked */ + errLocked = errNo(6) /* A table in the database is locked */ +) + +// ErrDBLocked : +var ErrDBLocked = xerrors.New("database is locked") + // Name return db name func (r *RDBDriver) Name() string { return r.name } // OpenDB opens Database -func (r *RDBDriver) OpenDB(dbType, dbPath string, debugSQL bool, _ Option) (locked bool, err error) { +func (r *RDBDriver) OpenDB(dbType, dbPath string, debugSQL bool, _ Option) (err error) { gormConfig := gorm.Config{ DisableForeignKeyConstraintWhenMigrating: true, Logger: logger.New( @@ -66,28 +82,40 @@ func (r *RDBDriver) OpenDB(dbType, dbPath string, debugSQL bool, _ Option) (lock switch r.name { case dialectSqlite3: r.conn, err = gorm.Open(sqlite.Open(dbPath), &gormConfig) - case dialectMysql: - r.conn, err = gorm.Open(mysql.Open(dbPath), &gormConfig) - case dialectPostgreSQL: - r.conn, err = gorm.Open(postgres.Open(dbPath), &gormConfig) - default: - err = xerrors.Errorf("Not Supported DB dialects. r.name: %s", r.name) - } + if err != nil { + parsedErr, marshalErr := json.Marshal(err) + if marshalErr != nil { + return xerrors.Errorf("Failed to marshal err. err: %w", marshalErr) + } - if err != nil { - if r.name == dialectSqlite3 { - switch err.(sqlite3.Error).Code { - case sqlite3.ErrLocked, sqlite3.ErrBusy: - return true, xerrors.Errorf("Failed to open DB. dbtype: %s, dbpath: %s, err: %w", dbType, dbPath, err) + var errMsg sqliteError + if unmarshalErr := json.Unmarshal(parsedErr, &errMsg); unmarshalErr != nil { + return xerrors.Errorf("Failed to unmarshal. err: %w", unmarshalErr) + } + + switch errMsg.Code { + case errBusy, errLocked: + return xerrors.Errorf("Failed to open DB. dbtype: %s, dbpath: %s, err: %w", dbType, dbPath, ErrDBLocked) + default: + return xerrors.Errorf("Failed to open DB. dbtype: %s, dbpath: %s, err: %w", dbType, dbPath, err) } } - return false, xerrors.Errorf("Failed to open DB. dbtype: %s, dbpath: %s, err: %w", dbType, dbPath, err) - } - if r.name == dialectSqlite3 { r.conn.Exec("PRAGMA foreign_keys = ON") + case dialectMysql: + r.conn, err = gorm.Open(mysql.Open(dbPath), &gormConfig) + if err != nil { + return xerrors.Errorf("Failed to open DB. dbtype: %s, dbpath: %s, err: %w", dbType, dbPath, err) + } + case dialectPostgreSQL: + r.conn, err = gorm.Open(postgres.Open(dbPath), &gormConfig) + if err != nil { + return xerrors.Errorf("Failed to open DB. dbtype: %s, dbpath: %s, err: %w", dbType, dbPath, err) + } + default: + return xerrors.Errorf("Not Supported DB dialects. r.name: %s", r.name) } - return false, nil + return nil } // CloseDB close Database @@ -155,7 +183,33 @@ func (r *RDBDriver) MigrateDB() error { &models.SoftwarePlatform{}, &models.GroupUsed{}, ); err != nil { - return xerrors.Errorf("Failed to migrate. err: %w", err) + switch r.name { + case dialectSqlite3: + if r.name == dialectSqlite3 { + parsedErr, marshalErr := json.Marshal(err) + if marshalErr != nil { + return xerrors.Errorf("Failed to marshal err. err: %w", marshalErr) + } + + var errMsg sqliteError + if unmarshalErr := json.Unmarshal(parsedErr, &errMsg); unmarshalErr != nil { + return xerrors.Errorf("Failed to unmarshal. err: %w", unmarshalErr) + } + + switch errMsg.Code { + case errBusy, errLocked: + return xerrors.Errorf("Failed to migrate. err: %w", ErrDBLocked) + default: + return xerrors.Errorf("Failed to migrate. err: %w", err) + } + } + case dialectMysql, dialectPostgreSQL: + if err != nil { + return xerrors.Errorf("Failed to migrate. err: %w", err) + } + default: + return xerrors.Errorf("Not Supported DB dialects. r.name: %s", r.name) + } } return nil diff --git a/db/redis.go b/db/redis.go index fcb3708..adddca0 100644 --- a/db/redis.go +++ b/db/redis.go @@ -76,8 +76,11 @@ func (r *RedisDriver) Name() string { } // OpenDB opens Database -func (r *RedisDriver) OpenDB(_, dbPath string, _ bool, option Option) (bool, error) { - return false, r.connectRedis(dbPath, option) +func (r *RedisDriver) OpenDB(_, dbPath string, _ bool, option Option) error { + if err := r.connectRedis(dbPath, option); err != nil { + return xerrors.Errorf("Failed to open DB. dbtype: %s, dbpath: %s, err: %w", dialectRedis, dbPath, err) + } + return nil } func (r *RedisDriver) connectRedis(dbPath string, option Option) error { diff --git a/go.mod b/go.mod index 473204c..63c3ce0 100644 --- a/go.mod +++ b/go.mod @@ -4,11 +4,11 @@ go 1.20 require ( github.com/cheggaaa/pb/v3 v3.1.2 + github.com/glebarez/sqlite v1.8.1-0.20230417114740-1accfe103bf2 github.com/go-redis/redis/v8 v8.11.5 github.com/google/go-cmp v0.5.9 github.com/inconshreveable/log15 v3.0.0-testing.5+incompatible github.com/labstack/echo/v4 v4.10.2 - github.com/mattn/go-sqlite3 v1.14.16 github.com/mitchellh/go-homedir v1.1.0 github.com/parnurzeal/gorequest v0.2.16 github.com/spf13/cobra v1.7.0 @@ -17,7 +17,6 @@ require ( golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 gorm.io/driver/mysql v1.5.0 gorm.io/driver/postgres v1.5.0 - gorm.io/driver/sqlite v1.5.0 gorm.io/gorm v1.25.0 ) @@ -25,12 +24,15 @@ require ( github.com/VividCortex/ewma v1.2.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/dustin/go-humanize v1.0.1 // indirect github.com/elazarl/goproxy v0.0.0-20221015165544-a0805db90819 // indirect github.com/fatih/color v1.15.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/glebarez/go-sqlite v1.21.1 // indirect github.com/go-sql-driver/mysql v1.7.1 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/golang-jwt/jwt v3.2.2+incompatible // indirect + github.com/google/uuid v1.3.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect @@ -46,6 +48,7 @@ require ( github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/pelletier/go-toml/v2 v2.0.7 // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rivo/uniseg v0.4.4 // indirect github.com/smartystreets/goconvey v1.8.0 // indirect github.com/spf13/afero v1.9.5 // indirect @@ -63,5 +66,9 @@ require ( golang.org/x/time v0.3.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + modernc.org/libc v1.22.5 // indirect + modernc.org/mathutil v1.5.0 // indirect + modernc.org/memory v1.5.0 // indirect + modernc.org/sqlite v1.22.0 // indirect moul.io/http2curl v1.0.0 // indirect ) diff --git a/go.sum b/go.sum index a9d1b27..a35d0c3 100644 --- a/go.sum +++ b/go.sum @@ -59,6 +59,8 @@ 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/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= 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= @@ -73,6 +75,10 @@ github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBD github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/glebarez/go-sqlite v1.21.1 h1:7MZyUPh2XTrHS7xNEHQbrhfMZuPSzhkm2A1qgg0y5NY= +github.com/glebarez/go-sqlite v1.21.1/go.mod h1:ISs8MF6yk5cL4n/43rSOmVMGJJjHYr7L2MbZZ5Q4E2E= +github.com/glebarez/sqlite v1.8.1-0.20230417114740-1accfe103bf2 h1:8eKywNub+ODJFAX09rR1expYi1txo5YuC2CzOO4Ukg8= +github.com/glebarez/sqlite v1.8.1-0.20230417114740-1accfe103bf2/go.mod h1:bi4HJkWd11eriAoPVOutDJcEGV0vk4+pB7+wJ7k3Z4o= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -136,8 +142,11 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/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 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= @@ -192,9 +201,6 @@ github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp9 github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= -github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= @@ -212,6 +218,9 @@ github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qR 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/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= @@ -596,8 +605,6 @@ gorm.io/driver/mysql v1.5.0 h1:6hSAT5QcyIaty0jfnff0z0CLDjyRgZ8mlMHLqSt7uXM= gorm.io/driver/mysql v1.5.0/go.mod h1:FFla/fJuCvyTi7rJQd27qlNX2v3L6deTR1GgTjSOLPo= gorm.io/driver/postgres v1.5.0 h1:u2FXTy14l45qc3UeCJ7QaAXZmZfDDv0YrthvmRq1l0U= gorm.io/driver/postgres v1.5.0/go.mod h1:FUZXzO+5Uqg5zzwzv4KK49R8lvGIyscBOqYrtI1Ce9A= -gorm.io/driver/sqlite v1.5.0 h1:zKYbzRCpBrT1bNijRnxLDJWPjVfImGEn0lSnUY5gZ+c= -gorm.io/driver/sqlite v1.5.0/go.mod h1:kDMDfntV9u/vuMmz8APHtHF0b4nyBB7sfCieC6G8k8I= gorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gorm.io/gorm v1.25.0 h1:+KtYtb2roDz14EQe4bla8CbQlmb9dN3VejSai3lprfU= gorm.io/gorm v1.25.0/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= @@ -608,6 +615,14 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +modernc.org/libc v1.22.5 h1:91BNch/e5B0uPbJFgqbxXuOnxBQjlS//icfQEGmvyjE= +modernc.org/libc v1.22.5/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= +modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= +modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/sqlite v1.22.0 h1:Uo+wEWePCspy4SAu0w2VbzUHEftOs7yoaWX/cYjsq84= +modernc.org/sqlite v1.22.0/go.mod h1:cxbLkB5WS32DnQqeH4h4o1B0eMr8W/y8/RGuxQ3JsC0= moul.io/http2curl v1.0.0 h1:6XwpyZOYsgZJrU8exnG87ncVkU1FVCcTRpwzOkTDUi8= moul.io/http2curl v1.0.0/go.mod h1:f6cULg+e4Md/oW1cYmwW4IWQOVl2lGbmCNGOHvzX2kE= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=