mirror of
https://github.com/Icinga/icingadb.git
synced 2026-02-18 18:18:00 -05:00
cmd/ido2icingadb: compute previous progress
This commit is contained in:
parent
05c736aa8f
commit
2f5d5ea931
7 changed files with 336 additions and 16 deletions
|
|
@ -29,6 +29,8 @@ list_all_deps() {
|
|||
COMPATIBLE_LINE=$(($LINENO + 2))
|
||||
|
||||
COMPATIBLE=(
|
||||
# public domain
|
||||
3cee2c43614ad4572d9d594c81b9348cf45ed5ac # vendor/github.com/vbauerster/mpb/v6/UNLICENSE
|
||||
# MIT
|
||||
66d504eb2f162b9cbf11b07506eeed90c6edabe1 # vendor/github.com/cespare/xxhash/v2/LICENSE.txt
|
||||
1513ff663e946fdcadb630bed670d253b8b22e1e # vendor/github.com/davecgh/go-spew/spew/../LICENSE
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"database/sql"
|
||||
"fmt"
|
||||
|
|
@ -11,9 +12,13 @@ import (
|
|||
"github.com/jessevdk/go-flags"
|
||||
"github.com/jmoiron/sqlx"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/vbauerster/mpb/v6"
|
||||
"github.com/vbauerster/mpb/v6/decor"
|
||||
"go.uber.org/zap"
|
||||
"golang.org/x/sync/errgroup"
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
// Flags defines the CLI flags.
|
||||
|
|
@ -26,6 +31,9 @@ type Flags struct {
|
|||
type Config struct {
|
||||
IDO config.Database `yaml:"ido"`
|
||||
IcingaDB config.Database `yaml:"icingadb"`
|
||||
Icinga2 struct {
|
||||
Env string `yaml:"env"`
|
||||
} `yaml:"icinga2"`
|
||||
}
|
||||
|
||||
func main() {
|
||||
|
|
@ -82,16 +90,6 @@ func run() int {
|
|||
_ = eg.Wait()
|
||||
}
|
||||
|
||||
var types = []struct {
|
||||
name string
|
||||
idoTable string
|
||||
snapshot *sqlx.Tx
|
||||
}{
|
||||
{"acknowledgement", "icinga_acknowledgements", nil}, {"comment", "icinga_commenthistory", nil},
|
||||
{"downtime", "icinga_downtimehistory", nil}, {"flapping", "icinga_flappinghistory", nil},
|
||||
{"notification", "icinga_notifications", nil}, {"state", "icinga_statehistory", nil},
|
||||
}
|
||||
|
||||
{
|
||||
eg, _ := errgroup.WithContext(context.Background())
|
||||
for i := range types {
|
||||
|
|
@ -119,10 +117,8 @@ func run() int {
|
|||
i := i
|
||||
|
||||
eg.Go(func() error {
|
||||
var count uint64
|
||||
|
||||
err := types[i].snapshot.Get(
|
||||
&count,
|
||||
&types[i].total,
|
||||
"SELECT COUNT(*) FROM "+types[i].idoTable+
|
||||
" xh INNER JOIN icinga_objects o ON o.object_id=xh.object_id",
|
||||
)
|
||||
|
|
@ -130,7 +126,7 @@ func run() int {
|
|||
log.Fatalf("%+v", errors.Wrap(err, "can't count query"))
|
||||
}
|
||||
|
||||
log.With("type", types[i].name, "amount", count).Info("Counted total IDO events")
|
||||
log.With("type", types[i].name, "amount", types[i].total).Info("Counted total IDO events")
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
|
@ -138,8 +134,141 @@ func run() int {
|
|||
_ = eg.Wait()
|
||||
}
|
||||
|
||||
// TODO
|
||||
_ = idb
|
||||
log.Sync()
|
||||
|
||||
{
|
||||
progress := mpb.New()
|
||||
for i := range types {
|
||||
typ := &types[i]
|
||||
|
||||
typ.bar = progress.AddBar(
|
||||
typ.total,
|
||||
mpb.BarFillerClearOnComplete(),
|
||||
mpb.PrependDecorators(
|
||||
decor.Name(typ.name, decor.WC{W: len(typ.name) + 1, C: decor.DidentRight}),
|
||||
decor.Percentage(decor.WC{W: 5}),
|
||||
),
|
||||
mpb.AppendDecorators(decor.EwmaETA(decor.ET_STYLE_GO, 6000000, decor.WC{W: 4})),
|
||||
)
|
||||
}
|
||||
|
||||
eg, _ := errgroup.WithContext(context.Background())
|
||||
for i := range types {
|
||||
typ := &types[i]
|
||||
|
||||
if typ.total == 0 {
|
||||
typ.bar.SetTotal(typ.bar.Current(), true)
|
||||
} else {
|
||||
eg.Go(func() error {
|
||||
query := "SELECT xh." +
|
||||
strings.Join(append(append([]string(nil), typ.idoColumns...), typ.idoIdColumn), ", xh.") +
|
||||
" id FROM " + typ.idoTable +
|
||||
" xh USE INDEX (PRIMARY) INNER JOIN icinga_objects o ON o.object_id=xh.object_id WHERE " +
|
||||
typ.idoIdColumn + " > ? ORDER BY xh." + typ.idoIdColumn + " LIMIT 10000"
|
||||
|
||||
stmt, err := typ.snapshot.Preparex(query)
|
||||
if err != nil {
|
||||
log.With("query", query).Fatalf("%+v", errors.Wrap(err, "can't prepare query"))
|
||||
}
|
||||
defer stmt.Close()
|
||||
|
||||
var lastRowsLen int
|
||||
var lastQuery string
|
||||
var lastStmt *sqlx.Stmt
|
||||
start := time.Now()
|
||||
|
||||
defer func() {
|
||||
if lastStmt != nil {
|
||||
lastStmt.Close()
|
||||
}
|
||||
}()
|
||||
|
||||
Queries:
|
||||
for {
|
||||
var rows []ProgressRow
|
||||
if err := stmt.Select(&rows, typ.lastId); err != nil {
|
||||
log.With("query", query).Fatalf("%+v", errors.Wrap(err, "can't perform query"))
|
||||
}
|
||||
|
||||
if len(rows) < 1 {
|
||||
break
|
||||
}
|
||||
|
||||
if len(rows) != lastRowsLen {
|
||||
if lastStmt != nil {
|
||||
lastStmt.Close()
|
||||
}
|
||||
|
||||
buf := &bytes.Buffer{}
|
||||
fmt.Fprintf(
|
||||
buf, "SELECT %s FROM %s WHERE %s IN (?", typ.idbIdColumn, typ.idbTable, typ.idbIdColumn,
|
||||
)
|
||||
|
||||
for i := 1; i < len(rows); i++ {
|
||||
buf.Write([]byte(",?"))
|
||||
}
|
||||
|
||||
buf.Write([]byte(")"))
|
||||
lastRowsLen = len(rows)
|
||||
lastQuery = buf.String()
|
||||
|
||||
var err error
|
||||
lastStmt, err = idb.Preparex(lastQuery)
|
||||
|
||||
if err != nil {
|
||||
log.With("query", lastQuery).Fatalf("%+v", errors.Wrap(err, "can't prepare query"))
|
||||
}
|
||||
}
|
||||
|
||||
ids := make([]interface{}, 0, len(rows))
|
||||
converted := make([]convertedId, 0, len(rows))
|
||||
|
||||
for _, row := range rows {
|
||||
conv := typ.convertId(row, c.Icinga2.Env)
|
||||
ids = append(ids, conv)
|
||||
converted = append(converted, convertedId{row.Id, conv})
|
||||
}
|
||||
|
||||
var present [][]byte
|
||||
if err := lastStmt.Select(&present, ids...); err != nil {
|
||||
log.With("query", lastQuery).Fatalf("%+v", errors.Wrap(err, "can't perform query"))
|
||||
}
|
||||
|
||||
presentSet := map[[20]byte]struct{}{}
|
||||
for _, row := range present {
|
||||
var key [20]byte
|
||||
copy(key[:], row)
|
||||
presentSet[key] = struct{}{}
|
||||
}
|
||||
|
||||
for _, conv := range converted {
|
||||
var key [20]byte
|
||||
copy(key[:], conv.idb)
|
||||
|
||||
if _, ok := presentSet[key]; !ok {
|
||||
break Queries
|
||||
}
|
||||
|
||||
typ.lastId = conv.ido
|
||||
}
|
||||
|
||||
prev := start
|
||||
now := time.Now()
|
||||
start = now
|
||||
|
||||
typ.bar.IncrBy(len(rows))
|
||||
typ.bar.DecoratorEwmaUpdate(now.Sub(prev))
|
||||
}
|
||||
|
||||
typ.bar.SetTotal(typ.bar.Current(), true)
|
||||
return nil
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
_ = eg.Wait()
|
||||
progress.Wait()
|
||||
}
|
||||
|
||||
return internal.ExitSuccess
|
||||
}
|
||||
|
|
|
|||
149
cmd/ido2icingadb/misc.go
Normal file
149
cmd/ido2icingadb/misc.go
Normal file
|
|
@ -0,0 +1,149 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/sha1"
|
||||
"encoding/binary"
|
||||
"github.com/google/uuid"
|
||||
"github.com/icinga/icingadb/pkg/icingadb/objectpacker"
|
||||
"github.com/jmoiron/sqlx"
|
||||
"github.com/vbauerster/mpb/v6"
|
||||
)
|
||||
|
||||
type ProgressRow struct {
|
||||
Id uint64
|
||||
Name string
|
||||
}
|
||||
|
||||
type convertedId struct {
|
||||
ido uint64
|
||||
idb []byte
|
||||
}
|
||||
|
||||
// mkDeterministicUuid returns a formally random UUID (v4) as follows: 11111122-3300-4455-4455-555555555555
|
||||
//
|
||||
// 0: zeroed
|
||||
// 1: "IDO" (where the data identified by the new UUID is from)
|
||||
// 2: the history table the new UUID is for, e.g. "s" for state_history
|
||||
// 3: "h" (for "history")
|
||||
// 4: the new UUID's formal version (unused bits zeroed)
|
||||
// 5: the ID of the row the new UUID is for in the IDO (big endian)
|
||||
func mkDeterministicUuid(table byte, rowId uint64) []byte {
|
||||
uid := uuidTemplate
|
||||
uid[3] = table
|
||||
|
||||
buf := &bytes.Buffer{}
|
||||
if err := binary.Write(buf, binary.BigEndian, rowId); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
bEId := buf.Bytes()
|
||||
uid[7] = bEId[0]
|
||||
copy(uid[9:], bEId[1:])
|
||||
|
||||
return uid[:]
|
||||
}
|
||||
|
||||
// uuidTemplate is for mkDeterministicUuid.
|
||||
var uuidTemplate = func() uuid.UUID {
|
||||
buf := &bytes.Buffer{}
|
||||
buf.Write(uuid.Nil[:])
|
||||
|
||||
uid, err := uuid.NewRandomFromReader(buf)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
copy(uid[:], "IDO h")
|
||||
return uid
|
||||
}()
|
||||
|
||||
// hashAny combines PackAny and SHA1 hashing.
|
||||
func hashAny(in interface{}) []byte {
|
||||
hash := sha1.New()
|
||||
if err := objectpacker.PackAny(in, hash); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
return hash.Sum(nil)
|
||||
}
|
||||
|
||||
// calcObjectId calculates the ID of the config object named name1 for Icinga DB.
|
||||
func calcObjectId(env, name1 string) []byte {
|
||||
return hashAny([2]string{env, name1})
|
||||
}
|
||||
|
||||
var types = [6]struct {
|
||||
name string
|
||||
idoTable string
|
||||
idoIdColumn string
|
||||
idoColumns []string
|
||||
idbTable string
|
||||
idbIdColumn string
|
||||
convertId func(row ProgressRow, env string) []byte
|
||||
snapshot *sqlx.Tx
|
||||
total int64
|
||||
bar *mpb.Bar
|
||||
lastId uint64
|
||||
}{
|
||||
{
|
||||
"acknowledgement",
|
||||
"icinga_acknowledgements",
|
||||
"acknowledgement_id",
|
||||
nil,
|
||||
"history",
|
||||
"id",
|
||||
func(row ProgressRow, _ string) []byte { return mkDeterministicUuid('a', row.Id) },
|
||||
nil, 0, nil, 0,
|
||||
},
|
||||
{
|
||||
"comment",
|
||||
"icinga_commenthistory",
|
||||
"commenthistory_id",
|
||||
[]string{"name"},
|
||||
"comment_history",
|
||||
"comment_id",
|
||||
func(row ProgressRow, env string) []byte { return calcObjectId(env, row.Name) },
|
||||
nil, 0, nil, 0,
|
||||
},
|
||||
{
|
||||
"downtime",
|
||||
"icinga_downtimehistory",
|
||||
"downtimehistory_id",
|
||||
[]string{"name"},
|
||||
"downtime_history",
|
||||
"downtime_id",
|
||||
func(row ProgressRow, env string) []byte { return calcObjectId(env, row.Name) },
|
||||
nil, 0, nil, 0,
|
||||
},
|
||||
{
|
||||
"flapping",
|
||||
"icinga_flappinghistory",
|
||||
"flappinghistory_id",
|
||||
nil,
|
||||
"history",
|
||||
"id",
|
||||
func(row ProgressRow, _ string) []byte { return mkDeterministicUuid('f', row.Id) },
|
||||
nil, 0, nil, 0,
|
||||
},
|
||||
{
|
||||
"notification",
|
||||
"icinga_notifications",
|
||||
"notification_id",
|
||||
nil,
|
||||
"notification_history",
|
||||
"id",
|
||||
func(row ProgressRow, _ string) []byte { return mkDeterministicUuid('n', row.Id) },
|
||||
nil, 0, nil, 0,
|
||||
},
|
||||
{
|
||||
"state",
|
||||
"icinga_statehistory",
|
||||
"statehistory_id",
|
||||
nil,
|
||||
"state_history",
|
||||
"id",
|
||||
func(row ProgressRow, _ string) []byte { return mkDeterministicUuid('s', row.Id) },
|
||||
nil, 0, nil, 0,
|
||||
},
|
||||
}
|
||||
15
cmd/ido2icingadb/misc_test.go
Normal file
15
cmd/ido2icingadb/misc_test.go
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestMkDeterministicUuid(t *testing.T) {
|
||||
if !bytes.Equal(
|
||||
mkDeterministicUuid('s', 0x0102030405060708),
|
||||
[]byte{'I', 'D', 'O', 's', 'h', 0, 0x40, 1, 0x80, 2, 3, 4, 5, 6, 7, 8},
|
||||
) {
|
||||
t.Error("got wrong UUID from mkDeterministicUuid(stateHistory, 0x0102030405060708)")
|
||||
}
|
||||
}
|
||||
5
go.mod
5
go.mod
|
|
@ -15,12 +15,15 @@ require (
|
|||
github.com/pkg/errors v0.9.1
|
||||
github.com/ssgreg/journald v1.0.0
|
||||
github.com/stretchr/testify v1.8.0
|
||||
github.com/vbauerster/mpb/v6 v6.0.4
|
||||
go.uber.org/zap v1.21.0
|
||||
golang.org/x/exp v0.0.0-20220613132600-b0d781184e0d
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/VividCortex/ewma v1.2.0 // indirect
|
||||
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect
|
||||
github.com/benbjohnson/clock v1.1.0 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.1.2 // indirect
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
|
|
@ -28,7 +31,9 @@ require (
|
|||
github.com/fatih/color v1.10.0 // indirect
|
||||
github.com/mattn/go-colorable v0.1.8 // indirect
|
||||
github.com/mattn/go-isatty v0.0.12 // indirect
|
||||
github.com/mattn/go-runewidth v0.0.12 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
github.com/rivo/uniseg v0.2.0 // indirect
|
||||
go.uber.org/atomic v1.7.0 // indirect
|
||||
go.uber.org/multierr v1.6.0 // indirect
|
||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e // indirect
|
||||
|
|
|
|||
12
go.sum
12
go.sum
|
|
@ -1,3 +1,7 @@
|
|||
github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow=
|
||||
github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4=
|
||||
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8=
|
||||
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo=
|
||||
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
|
||||
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
||||
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
|
||||
|
|
@ -45,6 +49,8 @@ github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ
|
|||
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
|
||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||
github.com/mattn/go-runewidth v0.0.12 h1:Y41i/hVW3Pgwr8gV+J23B9YEY0zxjptBuCWEaxmAOow=
|
||||
github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
|
||||
github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg=
|
||||
github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
|
||||
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
|
||||
|
|
@ -57,6 +63,9 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
|||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
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/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
|
||||
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||
github.com/ssgreg/journald v1.0.0 h1:0YmTDPJXxcWDPba12qNMdO6TxvfkFSYpFIJ31CwmLcU=
|
||||
github.com/ssgreg/journald v1.0.0/go.mod h1:RUckwmTM8ghGWPslq2+ZBZzbb9/2KgjzYZ4JEP+oRt0=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
|
|
@ -67,6 +76,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
|
|||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
|
||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||
github.com/vbauerster/mpb/v6 v6.0.4 h1:h6J5zM/2wimP5Hj00unQuV8qbo5EPcj6wbkCqgj7KcY=
|
||||
github.com/vbauerster/mpb/v6 v6.0.4/go.mod h1:a/+JT57gqh6Du0Ay5jSR+uBMfXGdlR7VQlGP52fJxLM=
|
||||
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
|
||||
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||
|
|
@ -100,6 +111,7 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||
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-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM=
|
||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
|
|
|
|||
|
|
@ -66,6 +66,8 @@ github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBK
|
|||
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
|
||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
|
||||
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ=
|
||||
github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4=
|
||||
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo=
|
||||
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=
|
||||
|
|
@ -465,6 +467,7 @@ github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx
|
|||
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
|
||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||
github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
|
||||
github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
|
||||
github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus=
|
||||
github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg=
|
||||
|
|
@ -584,6 +587,8 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O
|
|||
github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
|
||||
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
|
||||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
|
||||
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
||||
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||
|
|
@ -642,6 +647,8 @@ github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/
|
|||
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/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
|
||||
github.com/vbauerster/mpb/v6 v6.0.4 h1:h6J5zM/2wimP5Hj00unQuV8qbo5EPcj6wbkCqgj7KcY=
|
||||
github.com/vbauerster/mpb/v6 v6.0.4/go.mod h1:a/+JT57gqh6Du0Ay5jSR+uBMfXGdlR7VQlGP52fJxLM=
|
||||
github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk=
|
||||
github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
|
||||
github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho=
|
||||
|
|
@ -857,6 +864,7 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359 h1:2B5p2L5IfGiD7+b9BOoRMC6DgObAVZV+Fsp050NqXik=
|
||||
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
|
|
|
|||
Loading…
Reference in a new issue