From 36614c2f56504bdbe665df04bd6674a8f8e1c5e5 Mon Sep 17 00:00:00 2001 From: Andrei Gavrilov Date: Mon, 6 Apr 2026 15:22:59 +0300 Subject: [PATCH 1/3] fix login callback selection logic, add docs --- pkg/device/genericcli/genericcli.go | 26 ++++++++++++++++++------ pkg/device/genericcli/genericcli_test.go | 2 +- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/pkg/device/genericcli/genericcli.go b/pkg/device/genericcli/genericcli.go index 94d4164..9d2dcbb 100644 --- a/pkg/device/genericcli/genericcli.go +++ b/pkg/device/genericcli/genericcli.go @@ -247,12 +247,16 @@ func WithDevLogger(logger *zap.Logger) GenericDeviceOption { } } +// WithDevAdditionalLoginCallbacks adds given callbacks to device's login callbacks. func WithDevAdditionalLoginCallbacks(cb []cmd.ExprCallback) GenericDeviceOption { return func(h *GenericDevice) { h.cli.loginCB = append(h.cli.loginCB, cb...) } } +// WithDevLoginCallbacks replaces replaces device's login callbacks. +// Replacing behaviour is error-prone due to possible overwrites, so it should only be used in /pkg/device/... basic configs. +// If reusing device configs - use [WithDevAdditionalLoginCallbacks] instead. func WithDevLoginCallbacks(cb []cmd.ExprCallback) GenericDeviceOption { return func(h *GenericDevice) { h.cli.loginCB = cb @@ -339,9 +343,14 @@ func (m *GenericDevice) connectCLI(ctx context.Context) (err error) { return err } case cbExprName: - pos := match.GetUnderlyingRes().GetPatternNo() - f := m.cli.loginCB[pos] - err := m.connector.Write(f.GetAns()) + var ans []byte + for _, v := range m.cli.loginCB { + if _, ok := v.GetExpr().Match(match.GetMatched()); ok { + ans = v.GetAns() + break + } + } + err := m.connector.Write(ans) if err != nil { return fmt.Errorf("write error %w", err) } @@ -528,9 +537,14 @@ func genericLogin(ctx context.Context, connector streamer.Connector, cli Generic case promptExprName: return nil case cbExprName: - pos := readResLogin.GetUnderlyingRes().GetPatternNo() - f := cli.loginCB[pos] - err := connector.Write(f.GetAns()) + var ans []byte + for _, v := range cli.loginCB { + if _, ok := v.GetExpr().Match(readResLogin.GetMatched()); ok { + ans = v.GetAns() + break + } + } + err := connector.Write(ans) if err != nil { return fmt.Errorf("write error %w", err) } diff --git a/pkg/device/genericcli/genericcli_test.go b/pkg/device/genericcli/genericcli_test.go index 752ae79..2375b42 100644 --- a/pkg/device/genericcli/genericcli_test.go +++ b/pkg/device/genericcli/genericcli_test.go @@ -268,7 +268,7 @@ func TestLoginCallback(t *testing.T) { cli := MakeGenericCLI( expr.NewSimpleExprLast200().FromPattern(promptExpression), expr.NewSimpleExprLast200().FromPattern(``), - WithLoginCallbacks([]cmd.ExprCallback{cmd.NewExprCallback(`/\*.+Login: Someone logged in/`, "\n")}), + WithLoginCallbacks([]cmd.ExprCallback{cmd.NewExprCallback("/not valid regex/", "\r\n"), cmd.NewExprCallback(`/\*.+Login: Someone logged in/`, "\n")}), ) dev := MakeGenericDevice(cli, connector, WithDevLogger(logger)) return &dev From 5b938f7c10af3ed2b53820f441cd2a860bc2f351 Mon Sep 17 00:00:00 2001 From: Andrei Gavrilov Date: Mon, 6 Apr 2026 15:27:45 +0300 Subject: [PATCH 2/3] fix replaces replaces --- pkg/device/genericcli/genericcli.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/device/genericcli/genericcli.go b/pkg/device/genericcli/genericcli.go index 9d2dcbb..4ec016b 100644 --- a/pkg/device/genericcli/genericcli.go +++ b/pkg/device/genericcli/genericcli.go @@ -254,7 +254,7 @@ func WithDevAdditionalLoginCallbacks(cb []cmd.ExprCallback) GenericDeviceOption } } -// WithDevLoginCallbacks replaces replaces device's login callbacks. +// WithDevLoginCallbacks replaces device's login callbacks. // Replacing behaviour is error-prone due to possible overwrites, so it should only be used in /pkg/device/... basic configs. // If reusing device configs - use [WithDevAdditionalLoginCallbacks] instead. func WithDevLoginCallbacks(cb []cmd.ExprCallback) GenericDeviceOption { From c407faee46b5be4441e3c290579ba3b43f7d51d1 Mon Sep 17 00:00:00 2001 From: Andrei Gavrilov Date: Mon, 6 Apr 2026 15:43:13 +0300 Subject: [PATCH 3/3] add test comment --- pkg/device/genericcli/genericcli_test.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pkg/device/genericcli/genericcli_test.go b/pkg/device/genericcli/genericcli_test.go index 2375b42..a7e3855 100644 --- a/pkg/device/genericcli/genericcli_test.go +++ b/pkg/device/genericcli/genericcli_test.go @@ -268,7 +268,12 @@ func TestLoginCallback(t *testing.T) { cli := MakeGenericCLI( expr.NewSimpleExprLast200().FromPattern(promptExpression), expr.NewSimpleExprLast200().FromPattern(``), - WithLoginCallbacks([]cmd.ExprCallback{cmd.NewExprCallback("/not valid regex/", "\r\n"), cmd.NewExprCallback(`/\*.+Login: Someone logged in/`, "\n")}), + WithLoginCallbacks([]cmd.ExprCallback{ + // both not valid regex * added here to check that we make callback for an expected regex + cmd.NewExprCallback("/not valid regex 1/", "\r\n"), + cmd.NewExprCallback(`/\*.+Login: Someone logged in/`, "\n"), + cmd.NewExprCallback("/not valid regex 2/", "\r"), + }), ) dev := MakeGenericDevice(cli, connector, WithDevLogger(logger)) return &dev