8 "github.com/Juniper/go-netconf/netconf"
9 xj "github.com/basgys/goxml2json"
10 "golang.org/x/crypto/ssh"
19 host = flag.String("host", "localhost", "Hostname")
20 username = flag.String("username", "netconf", "Username")
21 passwd = flag.String("password", "netconf", "Password")
22 source = flag.String("source", "running", "Source datastore")
23 target = flag.String("target", "running", "Target datastore")
24 subtree = flag.String("subtree", "ric", "Subtree or module to select")
25 namespace = flag.String("namespace", "urn:o-ran:ric:xapp-desc:1.0", "XML namespace")
26 file = flag.String("file", "", "Configuration file")
27 action = flag.String("action", "get", "Netconf command: get or edit")
28 timeout = flag.Int("timeout", 30, "Timeout")
30 getStateXml = "<get><filter type=\"subtree\"><ric xmlns=\"%s\"></ric></filter></get>"
31 getConfigXml = "<get-config><source><%s/></source><filter type=\"subtree\"><%s/></filter></get-config>"
32 editConfigXml = "<edit-config><target><%s/></target><config>%s</config></edit-config>"
36 defer func() { // catch or finally
37 if err := recover(); err != nil { //catch
38 fmt.Fprintf(os.Stderr, "Something went wrong: %v\n", err)
43 if flag.Parse(); flag.Parsed() == false {
44 log.Fatal("Syntax error!")
48 session := startSSHSession()
56 getStatus(session, getStateXml)
58 getConfig(session, getConfigXml)
64 func getStatus(session *netconf.Session, cmdXml string) {
65 cmd := netconf.RawMethod(fmt.Sprintf(cmdXml, *namespace))
66 reply, err := session.Exec(cmd)
71 displayReply(reply.RawReply)
74 func getConfig(session *netconf.Session, cmdXml string) {
75 cmd := netconf.RawMethod(fmt.Sprintf(cmdXml, *source, *subtree))
76 reply, err := session.Exec(cmd)
81 displayReply(reply.RawReply)
84 func editConfig(session *netconf.Session) {
86 log.Fatal("Configuration file missing!")
90 if data, err := ioutil.ReadFile(*file); err == nil {
91 cmd := netconf.RawMethod(fmt.Sprintf(editConfigXml, *target, data))
92 reply, err := session.Exec(cmd)
97 displayReply(reply.RawReply)
101 func startSSHSession() *netconf.Session {
102 sshConfig := &ssh.ClientConfig{
104 Auth: []ssh.AuthMethod{ssh.Password(*passwd)},
105 HostKeyCallback: ssh.InsecureIgnoreHostKey(),
106 Timeout: time.Duration(*timeout) * time.Second,
109 session, err := netconf.DialSSH(*host, sshConfig)
117 func prettyPrint(b string) string {
119 if err := json.Indent(&out, []byte(b), "", " "); err == nil {
120 return string(out.Bytes())
125 func displayReply(rawReply string) {
126 xml := strings.NewReader(rawReply)
127 json, err := xj.Convert(xml)
129 log.Fatal("Something went sore ... XML is invalid!")
131 fmt.Println(prettyPrint(json.String()))