Skip to content

Commit

Permalink
Make Mikrotik banner optional.
Browse files Browse the repository at this point in the history
  • Loading branch information
udhos committed Dec 10, 2016
1 parent 7d4dc67 commit a70ec4e
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 26 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ Please send pull requests for new plataforms.
- [Cisco IOS](https://github.com/udhos/jazigo/blob/master/dev/model_cisco.go)
- [Cisco IOS XR](https://github.com/udhos/jazigo/blob/master/dev/model_cisco_iosxr.go)
- [Juniper JunOS](https://github.com/udhos/jazigo/blob/master/dev/model_junos.go)
- [Mikrotik](https://github.com/udhos/jazigo/blob/master/dev/model_mikrotik.go)
- [HTTP](https://github.com/udhos/jazigo/blob/master/dev/model_http.go) (collect output of http GET method)
- [Linux](https://github.com/udhos/jazigo/blob/master/dev/model_linux.go) (collect output of SSH commands)
- [Run](https://github.com/udhos/jazigo/blob/master/dev/model_run.go) (run external program and collect its output)
Expand Down
38 changes: 22 additions & 16 deletions dev/model.go
Original file line number Diff line number Diff line change
Expand Up @@ -645,9 +645,6 @@ func (d *Device) login(logger hasPrintf, t transp, capture *dialog) (bool, error
if err != nil {
return false, fmt.Errorf("login: could not find password prompt: %v", err)
}

d.debugf("login: found post-username password prompt")

case 1:
d.debugf("login: found password prompt")
}
Expand All @@ -664,31 +661,40 @@ func (d *Device) login(logger hasPrintf, t transp, capture *dialog) (bool, error

d.debugf("post-login-prompt: looking for pattern=[%s]", d.Attr.PostLoginPromptPattern)

if _, _, mismatch := d.match(logger, t, capture, []string{d.Attr.PostLoginPromptPattern}); mismatch != nil {
var m int
var mismatch error
m, _, mismatch = d.match(logger, t, capture,
[]string{
d.Attr.DisabledPromptPattern,
d.Attr.EnabledPromptPattern,
d.Attr.PostLoginPromptPattern,
})
if mismatch != nil {
return false, fmt.Errorf("post-login-prompt: match: %v", mismatch)
}

d.debugf("post-login-prompt: prompt FOUND")
if m == 2 {

if nlErr := d.send(logger, t, d.Attr.PostLoginPromptResponse); nlErr != nil {
return false, fmt.Errorf("post-login-prompt: error: %v", nlErr)
}
d.debugf("post-login-prompt: prompt FOUND")

if nlErr := d.send(logger, t, d.Attr.PostLoginPromptResponse); nlErr != nil {
return false, fmt.Errorf("post-login-prompt: error: %v", nlErr)
}

d.debugf("post-login-prompt: response sent: [%q]", d.Attr.PostLoginPromptResponse)
} else {

d.debugf("post-login-prompt: response sent: [%q]", d.Attr.PostLoginPromptResponse)
enabled := m == 1

return enabled, nil
}
}

m, _, err := d.match(logger, t, capture, []string{d.Attr.DisabledPromptPattern, d.Attr.EnabledPromptPattern})
if err != nil {
return false, fmt.Errorf("login: could not find command prompt: %v", err)
}

switch m {
case 0:
d.debugf("login: found disabled command prompt")
case 1:
d.debugf("login: found enabled command prompt")
}

enabled := m == 1

return enabled, nil
Expand Down
95 changes: 85 additions & 10 deletions dev/model_mikrotik_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ import (
)

type optionsMikrotik struct {
breakConn bool
sendBanner bool
breakConn bool
}

func TestMikrotik1(t *testing.T) {
Expand Down Expand Up @@ -54,6 +55,41 @@ func TestMikrotik2(t *testing.T) {

// launch bogus test server
addr := ":2012"
s, listenErr := spawnServerMikrotik(t, addr, optionsMikrotik{sendBanner: true})
if listenErr != nil {
t.Errorf("could not spawn bogus Mikrotik server: %v", listenErr)
}

// run client test
logger := &testLogger{t}
tab := NewDeviceTable()
opt := conf.NewOptions()
opt.Set(&conf.AppConfig{MaxConcurrency: 3, MaxConfigFiles: 10})
RegisterModels(logger, tab)
CreateDevice(tab, logger, "mikrotik", "lab1", "localhost"+addr, "telnet", "lab", "pass", "en", false, nil)

repo := temp.MakeTempRepo()
defer temp.CleanupTempRepo()

requestCh := make(chan FetchRequest)
errlogPrefix := filepath.Join(repo, "errlog_test.")
go Spawner(tab, logger, requestCh, repo, errlogPrefix, opt, NewFilterTable(logger))
good, bad, skip := Scan(tab, tab.ListDevices(), logger, opt.Get(), requestCh)
if good != 1 || bad != 0 || skip != 0 {
t.Errorf("good=%d bad=%d skip=%d", good, bad, skip)
}

close(requestCh) // shutdown Spawner - we might exit first though

s.close() // shutdown server

<-s.done // wait termination of accept loop goroutine
}

func TestMikrotik3(t *testing.T) {

// launch bogus test server
addr := ":2013"
s, listenErr := spawnServerMikrotik(t, addr, optionsMikrotik{breakConn: true})
if listenErr != nil {
t.Errorf("could not spawn bogus Mikrotik server: %v", listenErr)
Expand Down Expand Up @@ -85,6 +121,41 @@ func TestMikrotik2(t *testing.T) {
<-s.done // wait termination of accept loop goroutine
}

func TestMikrotik4(t *testing.T) {

// launch bogus test server
addr := ":2014"
s, listenErr := spawnServerMikrotik(t, addr, optionsMikrotik{sendBanner: true, breakConn: true})
if listenErr != nil {
t.Errorf("could not spawn bogus Mikrotik server: %v", listenErr)
}

// run client test
logger := &testLogger{t}
tab := NewDeviceTable()
opt := conf.NewOptions()
opt.Set(&conf.AppConfig{MaxConcurrency: 3, MaxConfigFiles: 10})
RegisterModels(logger, tab)
CreateDevice(tab, logger, "mikrotik", "lab1", "localhost"+addr, "telnet", "lab", "pass", "en", false, nil)

repo := temp.MakeTempRepo()
defer temp.CleanupTempRepo()

requestCh := make(chan FetchRequest)
errlogPrefix := filepath.Join(repo, "errlog_test.")
go Spawner(tab, logger, requestCh, repo, errlogPrefix, opt, NewFilterTable(logger))
good, bad, skip := Scan(tab, tab.ListDevices(), logger, opt.Get(), requestCh)
if good != 0 || bad != 1 || skip != 0 {
t.Errorf("good=%d bad=%d skip=%d", good, bad, skip)
}

close(requestCh) // shutdown Spawner - we might exit first though

s.close() // shutdown server

<-s.done // wait termination of accept loop goroutine
}

func spawnServerMikrotik(t *testing.T, addr string, options optionsMikrotik) (*testServer, error) {

ln, err := net.Listen("tcp", addr)
Expand Down Expand Up @@ -143,7 +214,9 @@ func handleConnectionMikrotik(t *testing.T, c net.Conn, options optionsMikrotik)

// send post login prompt

banner := `
if options.sendBanner {

banner := `
MMM MMM KKK TTTTTTTTTTT KKK
MMMM MMMM KKK TTTTTTTTTTT KKK
MMM MMMM MMM III KKK KKK RRRRRR OOOOOO TTT III KKK KKK
Expand All @@ -165,15 +238,17 @@ Current installation "software ID": 6ZDH-HYFR
Please press "Enter" to continue!
`

if _, err := c.Write([]byte("\r\n" + banner)); err != nil {
t.Logf("handleConnectionMikrotik: send banner error: %v", err)
return
}
if _, err := c.Write([]byte("\r\n" + banner)); err != nil {
t.Logf("handleConnectionMikrotik: send banner error: %v", err)
return
}

// consume response
if _, err := c.Read(buf); err != nil {
t.Logf("handleConnectionMikrotik: read response error: %v", err)
return
}

// consume response
if _, err := c.Read(buf); err != nil {
t.Logf("handleConnectionMikrotik: read response error: %v", err)
return
}

LOOP:
Expand Down

0 comments on commit a70ec4e

Please sign in to comment.