From e8feeffb3f9b5ec76ff74326196b62589e220e7e Mon Sep 17 00:00:00 2001 From: flx5 <1330854+flx5@users.noreply.github.com> Date: Thu, 16 Sep 2021 15:46:56 +0200 Subject: [PATCH 1/6] Read only http header and give rest to vnc client --- .../common/step_type_boot_command.go | 45 +++++++++++++++---- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/builder/xenserver/common/step_type_boot_command.go b/builder/xenserver/common/step_type_boot_command.go index 00689ac..7445c24 100644 --- a/builder/xenserver/common/step_type_boot_command.go +++ b/builder/xenserver/common/step_type_boot_command.go @@ -105,18 +105,45 @@ func (self *StepTypeBootCommand) Run(ctx context.Context, state multistep.StateB return multistep.ActionHalt } - buffer := make([]byte, 10000) - _, err = tlsConn.Read(buffer) - if err != nil && err != io.EOF { - err := fmt.Errorf("failed to read vnc session response: %v", err) - state.Put("error", err) - ui.Error(err.Error()) - return multistep.ActionHalt + // Look for \r\n\r\n sequence. Everything after the HTTP Header is for the vnc client. + + builder := strings.Builder{} + buffer := make([]byte, 1) + sequenceProgress := 0 + + for { + if _, err := io.ReadFull(tlsConn, buffer); err != nil { + err := fmt.Errorf("failed to start vnc session: %v", err) + state.Put("error", err) + ui.Error(err.Error()) + return multistep.ActionHalt + } + + builder.WriteByte(buffer[0]) + + if buffer[0] == '\n' && sequenceProgress % 2 == 1 { + sequenceProgress++ + } else if buffer[0] == '\r' && sequenceProgress % 2 == 0 { + sequenceProgress++ + } else { + sequenceProgress = 0 + } + + if sequenceProgress == 4 { + break + } } + + ui.Say(fmt.Sprintf("Received response: %s", builder.String())) - ui.Say(fmt.Sprintf("Received response: %s", string(buffer))) - + // Make sure the VNC Handshake times out when it can't read anything. + duration,_ := time.ParseDuration("30s") + tlsConn.SetDeadline(time.Now().Add(duration)) vncClient, err := vnc.Client(tlsConn, &vnc.ClientConfig{Exclusive: true}) + + // Make sure further requests don't time out. + duration,_ = time.ParseDuration("1d") + tlsConn.SetDeadline(time.Now().Add(duration)) if err != nil { err := fmt.Errorf("Error establishing VNC session: %s", err) From 2929200bdb49209ab7ce64a6c6454e4c06ecadde Mon Sep 17 00:00:00 2001 From: flx5 <1330854+flx5@users.noreply.github.com> Date: Thu, 16 Sep 2021 19:03:24 +0200 Subject: [PATCH 2/6] Add firmware setting --- builder/xenserver/common/config.go | 2 ++ builder/xenserver/common/config.hcl2spec.go | 2 ++ builder/xenserver/common/step_start_vm_paused.go | 3 ++- builder/xenserver/iso/builder.go | 4 ++++ 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/builder/xenserver/common/config.go b/builder/xenserver/common/config.go index c09a09f..658e5c8 100644 --- a/builder/xenserver/common/config.go +++ b/builder/xenserver/common/config.go @@ -32,6 +32,8 @@ type Config struct { RawInstallTimeout string `mapstructure:"install_timeout"` InstallTimeout time.Duration `` SourcePath string `mapstructure:"source_path"` + + Firmware string `mapstructure:"firmware"` ctx interpolate.Context } diff --git a/builder/xenserver/common/config.hcl2spec.go b/builder/xenserver/common/config.hcl2spec.go index 768c5ee..65644ea 100644 --- a/builder/xenserver/common/config.hcl2spec.go +++ b/builder/xenserver/common/config.hcl2spec.go @@ -107,6 +107,7 @@ type FlatConfig struct { PlatformArgs map[string]string `mapstructure:"platform_args" cty:"platform_args" hcl:"platform_args"` RawInstallTimeout *string `mapstructure:"install_timeout" cty:"install_timeout" hcl:"install_timeout"` SourcePath *string `mapstructure:"source_path" cty:"source_path" hcl:"source_path"` + Firmware *string `mapstructure:"firmware" cty:"firmware" hcl:"firmware"` } // FlatMapstructure returns a new FlatConfig. @@ -218,6 +219,7 @@ func (*FlatConfig) HCL2Spec() map[string]hcldec.Spec { "platform_args": &hcldec.AttrSpec{Name: "platform_args", Type: cty.Map(cty.String), Required: false}, "install_timeout": &hcldec.AttrSpec{Name: "install_timeout", Type: cty.String, Required: false}, "source_path": &hcldec.AttrSpec{Name: "source_path", Type: cty.String, Required: false}, + "firmware": &hcldec.AttrSpec{Name: "firmware", Type: cty.String, Required: false}, } return s } diff --git a/builder/xenserver/common/step_start_vm_paused.go b/builder/xenserver/common/step_start_vm_paused.go index d383878..b8cd1ee 100644 --- a/builder/xenserver/common/step_start_vm_paused.go +++ b/builder/xenserver/common/step_start_vm_paused.go @@ -16,6 +16,7 @@ func (self *StepStartVmPaused) Run(ctx context.Context, state multistep.StateBag c := state.Get("client").(*Connection) ui := state.Get("ui").(packer.Ui) + config := state.Get("config").(Config) ui.Say("Step: Start VM Paused") @@ -34,7 +35,7 @@ func (self *StepStartVmPaused) Run(ctx context.Context, state multistep.StateBag return multistep.ActionHalt } - err = c.client.VM.SetHVMBootParams(c.session, instance, map[string]string{"order": "cd"}) + err = c.client.VM.SetHVMBootParams(c.session, instance, map[string]string{"order": "cd", "firmware": config.Firmware}) if err != nil { ui.Error(fmt.Sprintf("Unable to set HVM boot params: %s", err.Error())) return multistep.ActionHalt diff --git a/builder/xenserver/iso/builder.go b/builder/xenserver/iso/builder.go index 02b5548..c5ec0c8 100644 --- a/builder/xenserver/iso/builder.go +++ b/builder/xenserver/iso/builder.go @@ -76,6 +76,10 @@ func (self *Builder) Prepare(raws ...interface{}) (params []string, warns []stri if self.config.CloneTemplate == "" { self.config.CloneTemplate = "Other install media" } + + if self.config.Firmware == "" { + self.config.Firmware = "bios" + } if len(self.config.PlatformArgs) == 0 { pargs := make(map[string]string) From 6e84e6d37149c1d7f48bfe673b2756030740a384 Mon Sep 17 00:00:00 2001 From: flx5 <1330854+flx5@users.noreply.github.com> Date: Thu, 16 Sep 2021 21:06:29 +0200 Subject: [PATCH 3/6] Fix boot command --- builder/xenserver/common/common_config.go | 4 +- .../common/step_type_boot_command.go | 154 ++++-------------- go.sum | 1 + 3 files changed, 34 insertions(+), 125 deletions(-) diff --git a/builder/xenserver/common/common_config.go b/builder/xenserver/common/common_config.go index 6907e18..c375613 100644 --- a/builder/xenserver/common/common_config.go +++ b/builder/xenserver/common/common_config.go @@ -9,10 +9,13 @@ import ( "github.com/hashicorp/packer-plugin-sdk/common" "github.com/hashicorp/packer-plugin-sdk/multistep" "github.com/hashicorp/packer-plugin-sdk/template/interpolate" + "github.com/hashicorp/packer-plugin-sdk/bootcommand" xenapi "github.com/terra-farm/go-xen-api-client" ) type CommonConfig struct { + bootcommand.VNCConfig `mapstructure:",squash"` + Username string `mapstructure:"remote_username"` Password string `mapstructure:"remote_password"` HostIp string `mapstructure:"remote_host"` @@ -28,7 +31,6 @@ type CommonConfig struct { HostPortMin uint `mapstructure:"host_port_min"` HostPortMax uint `mapstructure:"host_port_max"` - BootCommand []string `mapstructure:"boot_command"` ShutdownCommand string `mapstructure:"shutdown_command"` RawBootWait string `mapstructure:"boot_wait"` diff --git a/builder/xenserver/common/step_type_boot_command.go b/builder/xenserver/common/step_type_boot_command.go index 7445c24..96ab373 100644 --- a/builder/xenserver/common/step_type_boot_command.go +++ b/builder/xenserver/common/step_type_boot_command.go @@ -10,13 +10,11 @@ import ( "log" "net" "strings" - "time" - "unicode" - "unicode/utf8" "github.com/hashicorp/packer-plugin-sdk/multistep" "github.com/hashicorp/packer-plugin-sdk/packer" "github.com/hashicorp/packer-plugin-sdk/template/interpolate" + "github.com/hashicorp/packer-plugin-sdk/bootcommand" "github.com/mitchellh/go-vnc" ) @@ -136,14 +134,7 @@ func (self *StepTypeBootCommand) Run(ctx context.Context, state multistep.StateB ui.Say(fmt.Sprintf("Received response: %s", builder.String())) - // Make sure the VNC Handshake times out when it can't read anything. - duration,_ := time.ParseDuration("30s") - tlsConn.SetDeadline(time.Now().Add(duration)) - vncClient, err := vnc.Client(tlsConn, &vnc.ClientConfig{Exclusive: true}) - - // Make sure further requests don't time out. - duration,_ = time.ParseDuration("1d") - tlsConn.SetDeadline(time.Now().Add(duration)) + vncClient, err := vnc.Client(tlsConn, &vnc.ClientConfig{Exclusive: false}) if err != nil { err := fmt.Errorf("Error establishing VNC session: %s", err) @@ -153,6 +144,7 @@ func (self *StepTypeBootCommand) Run(ctx context.Context, state multistep.StateB } defer vncClient.Close() + log.Printf("Connected to the VNC console: %s", vncClient.DesktopName) @@ -175,24 +167,35 @@ func (self *StepTypeBootCommand) Run(ctx context.Context, state multistep.StateB uint(httpPort), } + vncDriver := bootcommand.NewVNCDriver(vncClient, config.VNCConfig.BootKeyInterval) + ui.Say("Typing boot commands over VNC...") - for _, command := range config.BootCommand { - - command, err := interpolate.Render(command, &self.Ctx) - if err != nil { - err := fmt.Errorf("Error preparing boot command: %s", err) - state.Put("error", err) - ui.Error(err.Error()) - return multistep.ActionHalt - } - - // Check for interrupts - if _, ok := state.GetOk(multistep.StateCancelled); ok { - return multistep.ActionHalt - } - - vncSendString(vncClient, command) + + command, err := interpolate.Render(config.VNCConfig.FlatBootCommand(), &self.Ctx) + + if err != nil { + err := fmt.Errorf("Error preparing boot command: %s", err) + state.Put("error", err) + ui.Error(err.Error()) + return multistep.ActionHalt } + + seq, err := bootcommand.GenerateExpressionSequence(command) + + if err != nil { + err := fmt.Errorf("Error generating boot command: %s", err) + state.Put("error", err) + ui.Error(err.Error()) + return multistep.ActionHalt + } + + if err := seq.Do(ctx, vncDriver); err != nil { + err := fmt.Errorf("Error running boot command: %s", err) + state.Put("error", err) + ui.Error(err.Error()) + return multistep.ActionHalt + } + ui.Say("Finished typing.") @@ -200,100 +203,3 @@ func (self *StepTypeBootCommand) Run(ctx context.Context, state multistep.StateB } func (self *StepTypeBootCommand) Cleanup(multistep.StateBag) {} - -// Taken from qemu's builder plugin - not an exported function. -func vncSendString(c *vnc.ClientConn, original string) { - // Scancodes reference: https://github.com/qemu/qemu/blob/master/ui/vnc_keysym.h - special := make(map[string]uint32) - special[""] = 0xFF08 - special[""] = 0xFFFF - special[""] = 0xFF0D - special[""] = 0xFF1B - special[""] = 0xFFBE - special[""] = 0xFFBF - special[""] = 0xFFC0 - special[""] = 0xFFC1 - special[""] = 0xFFC2 - special[""] = 0xFFC3 - special[""] = 0xFFC4 - special[""] = 0xFFC5 - special[""] = 0xFFC6 - special[""] = 0xFFC7 - special[""] = 0xFFC8 - special[""] = 0xFFC9 - special[""] = 0xFF0D - special[""] = 0xFF09 - special[""] = 0xFF52 - special[""] = 0xFF54 - special[""] = 0xFF51 - special[""] = 0xFF53 - special[""] = 0x020 - special[""] = 0xFF63 - special[""] = 0xFF50 - special[""] = 0xFF57 - special[""] = 0xFF55 - special[""] = 0xFF56 - - shiftedChars := "~!@#$%^&*()_+{}|:\"<>?" - - // TODO(mitchellh): Ripe for optimizations of some point, perhaps. - for len(original) > 0 { - var keyCode uint32 - keyShift := false - - if strings.HasPrefix(original, "") { - log.Printf("Special code '' found, sleeping one second") - time.Sleep(1 * time.Second) - original = original[len(""):] - continue - } - - if strings.HasPrefix(original, "") { - log.Printf("Special code '' found, sleeping 5 seconds") - time.Sleep(5 * time.Second) - original = original[len(""):] - continue - } - - if strings.HasPrefix(original, "") { - log.Printf("Special code '' found, sleeping 10 seconds") - time.Sleep(10 * time.Second) - original = original[len(""):] - continue - } - - for specialCode, specialValue := range special { - if strings.HasPrefix(original, specialCode) { - log.Printf("Special code '%s' found, replacing with: %d", specialCode, specialValue) - keyCode = specialValue - original = original[len(specialCode):] - break - } - } - - if keyCode == 0 { - r, size := utf8.DecodeRuneInString(original) - original = original[size:] - keyCode = uint32(r) - keyShift = unicode.IsUpper(r) || strings.ContainsRune(shiftedChars, r) - - log.Printf("Sending char '%c', code %d, shift %v", r, keyCode, keyShift) - } - - if keyShift { - c.KeyEvent(uint32(KeyLeftShift), true) - } - - c.KeyEvent(keyCode, true) - time.Sleep(time.Second / 10) - c.KeyEvent(keyCode, false) - time.Sleep(time.Second / 10) - - if keyShift { - c.KeyEvent(uint32(KeyLeftShift), false) - } - - // no matter what, wait a small period - time.Sleep(50 * time.Millisecond) - } -} diff --git a/go.sum b/go.sum index bd131d0..5dec440 100644 --- a/go.sum +++ b/go.sum @@ -591,6 +591,7 @@ golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPI golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mobile v0.0.0-20191130191448-5c0e7e404af8/go.mod h1:p895TfNkDgPEmEQrNiOtIl3j98d/tGU95djDj7NfyjQ= +golang.org/x/mobile v0.0.0-20201208152944-da85bec010a2 h1:3HADozU50HyrJ2jklLtr3xr0itFkz9u4LxCJhqKVdjI= golang.org/x/mobile v0.0.0-20201208152944-da85bec010a2/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= From 1e4b5dd51b133eb3db22aad68baed6f0e866ace5 Mon Sep 17 00:00:00 2001 From: Dom Del Nano Date: Wed, 3 Nov 2021 07:45:19 -0700 Subject: [PATCH 4/6] Use buffered reading and higher level APIs to detect when http response is fully parsed --- .../common/step_type_boot_command.go | 58 ++++++++++--------- 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/builder/xenserver/common/step_type_boot_command.go b/builder/xenserver/common/step_type_boot_command.go index 96ab373..4bac0b3 100644 --- a/builder/xenserver/common/step_type_boot_command.go +++ b/builder/xenserver/common/step_type_boot_command.go @@ -1,8 +1,7 @@ package common -/* Heavily borrowed from builder/quemu/step_type_boot_command.go */ - import ( + "bufio" "context" "crypto/tls" "fmt" @@ -11,10 +10,10 @@ import ( "net" "strings" + "github.com/hashicorp/packer-plugin-sdk/bootcommand" "github.com/hashicorp/packer-plugin-sdk/multistep" "github.com/hashicorp/packer-plugin-sdk/packer" "github.com/hashicorp/packer-plugin-sdk/template/interpolate" - "github.com/hashicorp/packer-plugin-sdk/bootcommand" "github.com/mitchellh/go-vnc" ) @@ -103,36 +102,41 @@ func (self *StepTypeBootCommand) Run(ctx context.Context, state multistep.StateB return multistep.ActionHalt } - // Look for \r\n\r\n sequence. Everything after the HTTP Header is for the vnc client. - - builder := strings.Builder{} - buffer := make([]byte, 1) - sequenceProgress := 0 - + // Look for \r\n\r\n sequence. Everything after the HTTP Header is for the vnc client. + reader := bufio.NewReader(tlsConn) + var httpResp string for { - if _, err := io.ReadFull(tlsConn, buffer); err != nil { + httpResp, err = reader.ReadString('\r') + if err != nil { err := fmt.Errorf("failed to start vnc session: %v", err) state.Put("error", err) ui.Error(err.Error()) return multistep.ActionHalt } - builder.WriteByte(buffer[0]) - - if buffer[0] == '\n' && sequenceProgress % 2 == 1 { - sequenceProgress++ - } else if buffer[0] == '\r' && sequenceProgress % 2 == 0 { - sequenceProgress++ - } else { - sequenceProgress = 0 + // Peek at the next three bytes to see if it contains the remaining \n\r\n + var b []byte + b, err = reader.Peek(3) + if err != nil { + e := fmt.Errorf("failed to start vnc session: %v", err) + state.Put("error", e) + ui.Error(e.Error()) + return multistep.ActionHalt } - if sequenceProgress == 4 { + if b[0] == '\n' && b[1] == '\r' && b[2] == '\n' { + if _, err = reader.Discard(3); err != nil { + e := fmt.Errorf("failed to start vnc session: %v", err) + state.Put("error", e) + ui.Error(e.Error()) + return multistep.ActionHalt + } + break } } - - ui.Say(fmt.Sprintf("Received response: %s", builder.String())) + + ui.Say(fmt.Sprintf("Received response: %s", httpResp)) vncClient, err := vnc.Client(tlsConn, &vnc.ClientConfig{Exclusive: false}) @@ -144,7 +148,6 @@ func (self *StepTypeBootCommand) Run(ctx context.Context, state multistep.StateB } defer vncClient.Close() - log.Printf("Connected to the VNC console: %s", vncClient.DesktopName) @@ -170,32 +173,31 @@ func (self *StepTypeBootCommand) Run(ctx context.Context, state multistep.StateB vncDriver := bootcommand.NewVNCDriver(vncClient, config.VNCConfig.BootKeyInterval) ui.Say("Typing boot commands over VNC...") - + command, err := interpolate.Render(config.VNCConfig.FlatBootCommand(), &self.Ctx) - + if err != nil { err := fmt.Errorf("Error preparing boot command: %s", err) state.Put("error", err) ui.Error(err.Error()) return multistep.ActionHalt } - + seq, err := bootcommand.GenerateExpressionSequence(command) - + if err != nil { err := fmt.Errorf("Error generating boot command: %s", err) state.Put("error", err) ui.Error(err.Error()) return multistep.ActionHalt } - + if err := seq.Do(ctx, vncDriver); err != nil { err := fmt.Errorf("Error running boot command: %s", err) state.Put("error", err) ui.Error(err.Error()) return multistep.ActionHalt } - ui.Say("Finished typing.") From 916128547022478db7987868d4268f3f2b041b10 Mon Sep 17 00:00:00 2001 From: Dom Del Nano Date: Wed, 3 Nov 2021 07:48:02 -0700 Subject: [PATCH 5/6] Remove changes that will be part of another pull request --- builder/xenserver/common/config.go | 2 -- builder/xenserver/common/config.hcl2spec.go | 2 -- builder/xenserver/common/step_start_vm_paused.go | 3 +-- builder/xenserver/iso/builder.go | 4 ---- 4 files changed, 1 insertion(+), 10 deletions(-) diff --git a/builder/xenserver/common/config.go b/builder/xenserver/common/config.go index 658e5c8..c09a09f 100644 --- a/builder/xenserver/common/config.go +++ b/builder/xenserver/common/config.go @@ -32,8 +32,6 @@ type Config struct { RawInstallTimeout string `mapstructure:"install_timeout"` InstallTimeout time.Duration `` SourcePath string `mapstructure:"source_path"` - - Firmware string `mapstructure:"firmware"` ctx interpolate.Context } diff --git a/builder/xenserver/common/config.hcl2spec.go b/builder/xenserver/common/config.hcl2spec.go index 65644ea..768c5ee 100644 --- a/builder/xenserver/common/config.hcl2spec.go +++ b/builder/xenserver/common/config.hcl2spec.go @@ -107,7 +107,6 @@ type FlatConfig struct { PlatformArgs map[string]string `mapstructure:"platform_args" cty:"platform_args" hcl:"platform_args"` RawInstallTimeout *string `mapstructure:"install_timeout" cty:"install_timeout" hcl:"install_timeout"` SourcePath *string `mapstructure:"source_path" cty:"source_path" hcl:"source_path"` - Firmware *string `mapstructure:"firmware" cty:"firmware" hcl:"firmware"` } // FlatMapstructure returns a new FlatConfig. @@ -219,7 +218,6 @@ func (*FlatConfig) HCL2Spec() map[string]hcldec.Spec { "platform_args": &hcldec.AttrSpec{Name: "platform_args", Type: cty.Map(cty.String), Required: false}, "install_timeout": &hcldec.AttrSpec{Name: "install_timeout", Type: cty.String, Required: false}, "source_path": &hcldec.AttrSpec{Name: "source_path", Type: cty.String, Required: false}, - "firmware": &hcldec.AttrSpec{Name: "firmware", Type: cty.String, Required: false}, } return s } diff --git a/builder/xenserver/common/step_start_vm_paused.go b/builder/xenserver/common/step_start_vm_paused.go index b8cd1ee..d383878 100644 --- a/builder/xenserver/common/step_start_vm_paused.go +++ b/builder/xenserver/common/step_start_vm_paused.go @@ -16,7 +16,6 @@ func (self *StepStartVmPaused) Run(ctx context.Context, state multistep.StateBag c := state.Get("client").(*Connection) ui := state.Get("ui").(packer.Ui) - config := state.Get("config").(Config) ui.Say("Step: Start VM Paused") @@ -35,7 +34,7 @@ func (self *StepStartVmPaused) Run(ctx context.Context, state multistep.StateBag return multistep.ActionHalt } - err = c.client.VM.SetHVMBootParams(c.session, instance, map[string]string{"order": "cd", "firmware": config.Firmware}) + err = c.client.VM.SetHVMBootParams(c.session, instance, map[string]string{"order": "cd"}) if err != nil { ui.Error(fmt.Sprintf("Unable to set HVM boot params: %s", err.Error())) return multistep.ActionHalt diff --git a/builder/xenserver/iso/builder.go b/builder/xenserver/iso/builder.go index c5ec0c8..02b5548 100644 --- a/builder/xenserver/iso/builder.go +++ b/builder/xenserver/iso/builder.go @@ -76,10 +76,6 @@ func (self *Builder) Prepare(raws ...interface{}) (params []string, warns []stri if self.config.CloneTemplate == "" { self.config.CloneTemplate = "Other install media" } - - if self.config.Firmware == "" { - self.config.Firmware = "bios" - } if len(self.config.PlatformArgs) == 0 { pargs := make(map[string]string) From 292d6502546e6c97b4d7822d0de66fead3673665 Mon Sep 17 00:00:00 2001 From: Dom Del Nano Date: Wed, 3 Nov 2021 07:49:23 -0700 Subject: [PATCH 6/6] Clean up go.sum by running --- go.sum | 3 --- 1 file changed, 3 deletions(-) diff --git a/go.sum b/go.sum index 5dec440..fdb5993 100644 --- a/go.sum +++ b/go.sum @@ -159,7 +159,6 @@ github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48/go.mod h1:dZGr github.com/go-resty/resty/v2 v2.3.0/go.mod h1:UpN9CgLZNsv4e9XG50UU8xdI0F43UQ4HmxLBDwaroHU= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gofrs/flock v0.7.3 h1:I0EKY9l8HZCXTMYC4F80vwT6KNypV9uYKP3Alm/hjmQ= @@ -379,12 +378,10 @@ github.com/kr/fs v0.0.0-20131111012553-2788f0dbd169/go.mod h1:glhvuHOU9Hy7/8Pwwd github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348 h1:MtvEpTB6LX3vkb4ax0b5D2DHbNAUsen0Gx5wZoq3lV4= github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/linode/linodego v0.14.0/go.mod h1:2ce3S00NrDqJfp4i55ZuSlT0U3cKNELNYACWBPI8Tnw= github.com/masterzen/simplexml v0.0.0-20160608183007-4572e39b1ab9/go.mod h1:kCEbxUJlNDEBNbdQMkPSp6yaKcRXVI6f4ddk8Riv4bc=