Cisco CLI

Simple example with working with Cisco CLI:

package main

import (
    "context"
    "flag"
    "fmt"
    "time"

    "go.uber.org/zap"

    "github.com/annetutil/gnetcli/pkg/cmd"
    "github.com/annetutil/gnetcli/pkg/credentials"
    "github.com/annetutil/gnetcli/pkg/device"
    "github.com/annetutil/gnetcli/pkg/device/cisco"
    "github.com/annetutil/gnetcli/pkg/streamer/ssh"
)

func main() {
    host := flag.String("host", "", "host")
    login := flag.String("login", "", "login")
    password := flag.String("password", "", "password")
    command := flag.String("command", "", "command")
    debug := flag.Bool("debug", false, "set debug log level")
    flag.Parse()
    if len(*host) == 0 {
        panic("empty host")
    }
    if len(*command) == 0 {
        panic("empty command")
    }
    if login == nil {
        newLogin := credentials.GetLogin()
        login = &newLogin
    }
    logConfig := zap.NewProductionConfig()
    if *debug {
        logConfig = zap.NewDevelopmentConfig()
    }

    logger := zap.Must(logConfig.Build())

    creds := credentials.NewSimpleCredentials(
        credentials.WithUsername(*login),
        credentials.WithPassword(credentials.Secret(*password)),
        credentials.WithSSHAgentSocket(credentials.GetDefaultAgentSocket()),
        credentials.WithLogger(logger),
    )

    ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
    defer cancel()

    connector := ssh.NewStreamer(*host, creds, ssh.WithLogger(logger))
    var dev device.Device
    deva := cisco.NewDevice(connector)
    dev = &deva
    err := dev.Connect(ctx)
    if err != nil {
        panic(err)
    }

    res, err := dev.Execute(cmd.NewCmd(*command))
    if err != nil {
        panic(err)
    }
    if res.Status() == 0 {
        fmt.Printf("Result: %s\n", res.Output())
    } else {
        fmt.Printf("Error: %s\nStatus: %d\n", res.Error(), res.Status())
    }
}