@Gene I hacked together a bit of ES6 code you could place into a file, make it executable, modify the authToken and t128HostAddress variables...and you should be able to call it from your Linux shell. It will return all MAC addresses in a CSV format.
Note when I say all, I mean ALL. If you point this at a conductor, it will grab all arp entries from all routers in your authority! If you want to scope it to specific routers, you'll have to mess with the graphql query.
#!/usr/bin/env node
"use strict";
const https = require('https');
const authToken = '<your_token_string>'
const t128HostAddress = '<your_128T_host>'
var graphqlQuery = {
query: `query getArp($filterNodes: [String], $filterRouters: [String]) {
allRouters(names: $filterRouters) {
nodes {
name
nodes(names: $filterNodes) {
nodes {
_id
name
arp {
networkInterface
ipAddress
destinationMac
state
}
}
}
}
}
}`,
variables: null,
operationName: 'getArp'
}
const options = {
host : t128HostAddress,
port : 443,
path : '/api/v1/graphql',
method : 'POST',
rejectUnauthorized : false,
headers : {
'Content-Type' : 'application/json',
'Content-Length' : Buffer.byteLength(JSON.stringify(graphqlQuery), 'utf8'),
'Authorization' : `Bearer ${authToken}`,
'Accept' : 'application/json'
}
}
var req = https.request(options, (res) => {
var responseData = ''
res.setEncoding('utf8')
res.on('data', (resDataChunk) => {
responseData += resDataChunk
})
res.on('end', () => {
var arpResultsGraph = JSON.parse(responseData).data.allRouters.nodes
process.stdout.write(`Router,Node,Interface,IP,MAC,State\n`)
arpResultsGraph.forEach((router) => {
if (router.nodes.nodes instanceof Array) {
router.nodes.nodes.forEach((t128node) => {
if (t128node.arp instanceof Array) {
t128node.arp.forEach((arpEntry) => {
process.stdout.write(`${router.name},${t128node.name},${arpEntry.networkInterface},${arpEntry.ipAddress},${arpEntry.destinationMac},${arpEntry.state}\n`)
})
}
})
}
})
})
})
req.write(JSON.stringify(graphqlQuery))
req.on('error', (error) => {
console.log('debug', 'REST request failed:', error)
});
req.end()
------------------------------
- Reid
------------------------------
Original Message:
Sent: 12-07-2018 20:38
From: Reid Stidolph
Subject: Linux script to grab arp table from 128T router
Hey @Gene as the root user you can do a PCLI one-liner with `su - admin -c "<pcli-command>"`, which will load, run, then exit. Example:
[root@pilchuck t128]# su - admin -c "show arp"
Starting the PCLI...
Fri 2018-12-07 20:17:11 EST
Node: node1
========== ====== ================= =================== =======
Dev Name VLAN IP Dest MAC State
========== ====== ================= =================== =======
enp1s0 6 172.25.128.1 00:01:ff:ab:30:14 Valid
enp2s0 0 192.168.1.126 74:d0:2b:c5:d8:e8 Valid
enp2s0 0 192.168.1.128 48:a4:72:34:f3:14 Valid
enp2s0 0 192.168.1.160 ac:37:43:dd:29:cb Valid
enp2s0 0 192.168.1.161 e8:b2:ac:a3:6d:42 Valid
enp2s0 0 192.168.1.162 40:4e:36:3b:55:35 Valid
enp2s0 0 192.168.1.193 54:60:09:04:93:7c Valid
enp2s0 0 192.168.1.195 00:0e:58:58:aa:a2 Valid
enp2s0 0 192.168.1.196 00:0e:58:53:75:9a Valid
enp2s0 0 192.168.1.224 18:b4:30:9f:bf:b3 Valid
enp2s0 0 192.168.1.225 18:b4:30:a8:64:8f Valid
enp2s0 0 192.168.1.226 18:b4:30:a8:50:f6 Valid
enp2s0 0 192.168.1.227 18:b4:30:a5:2a:15 Valid
enp2s0 0 192.168.1.228 18:b4:30:a8:5e:e1 Valid
enp2s0 0 192.168.1.229 18:b4:30:9f:a5:50 Valid
enp2s0 0 192.168.1.230 18:b4:30:a8:53:9f Valid
enp2s0 0 192.168.1.232 18:b4:30:82:db:eb Valid
kni254 0 169.254.127.127 06:29:f1:63:9e:3c Valid
Completed in 0.11 seconds
[root@pilchuck t128]#
Note that this method is fairly inefficient, since it takes a while to load the entire PCLI. Looks like you can accomplish the same with GraphQL. Here would be an example:
curl -k -X POST \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer <token_string>' \
-d '{"query":"query getArp($routerName: String!, $filterNodes: [String], $filterString: String) {\n allRouters(name: $routerName) {\n nodes {\n nodes(names: $filterNodes) {\n nodes {\n _id\n name\n arp(first: 250, filter: $filterString) {\n networkInterface\n deviceInterface\n vlan\n ipAddress\n destinationMac\nstate\n}\n}\n}\n}\n}\n}","variables":{"routerName":"<my_router_name>","filterString":null,"filter":""}}' \
https://<my_128t_node>/api/v1/graphql
------------------------------
- Reid
Original Message:
Sent: 12-07-2018 20:10
From: Gene Shtirmer
Subject: Linux script to grab arp table from 128T router
Is there a script, or can one be created relatively quickly leveraging our REST or NETCONF APIs, to run in Linux shell, which will print out the 128T router's ARP table?
------------------------------
Gene Shtirmer
Sales Engineer
Randolph, NJ
------------------------------