forked from davedotdev/go-netconf
/
client.go
107 lines (84 loc) · 2.61 KB
/
client.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package main
import (
"flag"
"fmt"
"io/ioutil"
"log"
"os"
"strings"
driver "github.com/vinpatel24/go-netconf/drivers/driver"
junosdriver "github.com/vinpatel24/go-netconf/drivers/junos"
sshdriver "github.com/vinpatel24/go-netconf/drivers/ssh"
"golang.org/x/crypto/ssh"
)
const versionstring string = "0.3"
func main() {
var cleanoutput = flag.Bool("cleanoutput", false, "Remove newline characters from XML")
var version = flag.Bool("version", false, "Show version for code")
var targethost = flag.String("targethost", "", "Target IPv4 or FQDN hostname of a NETCONF node")
var transport = flag.String("transport", "ssh", "Transport mode, either 'ssh' or 'junos'")
var envelope = flag.String("envelope", "", "XML Envelope")
var envelopefile = flag.String("envelopefile", "", "XML envelope file path")
var username = flag.String("username", "", "Username")
var password = flag.String("password", "", "Password")
var port = flag.Int("port", 830, "Port for accessing NETCONF")
/*var sshkey = */ flag.String("sshkey", "", "Path to SSHKey for accessing node (NOT IMPLEMENTED YET)")
flag.Parse()
// If version has been requested
if *version {
fmt.Printf("Version is: %s", versionstring)
os.Exit(0)
}
// Dummy interface var ready for loading from inputs
var nconf driver.Driver
switch *transport {
case "ssh":
d := driver.New(sshdriver.New())
nc := d.(*sshdriver.DriverSSH)
nc.Host = *targethost
nc.Port = *port
// Sort yourself out with SSH. Easiest to do that here.
nc.SSHConfig = &ssh.ClientConfig{
User: *username,
Auth: []ssh.AuthMethod{ssh.Password(*password)},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
}
nconf = nc
case "junos":
d := driver.New(junosdriver.New())
nc := d.(*junosdriver.DriverJunos)
nconf = nc
}
// Forceful type assertion to make sure our specific chosen transport implements the driver interface{}
err := nconf.Dial()
if err != nil {
log.Fatal(err)
}
// netconfcall content var
netconfcall := ""
// If the flag 'envelopefile' is set, then let's read the content into memory instead of using envelope
if *envelopefile != "" {
// Read content from disk
bytes, err := ioutil.ReadFile(*envelopefile)
netconfcall = string(bytes)
if err != nil {
log.Panic(err)
}
// Else, consume content of envelope
} else {
netconfcall = *envelope
}
reply, err := nconf.SendRaw(netconfcall)
if err != nil {
panic(err)
}
if *cleanoutput == true {
d1 := strings.Replace(reply.Data, "\n", "", -1)
fmt.Print(d1 + "\n")
}
if *cleanoutput == false {
d1 := strings.TrimLeft(reply.Data, "\n")
fmt.Print(d1)
}
nconf.Close()
}