├── .gitignore
├── MIGRATE.md
├── README.md
├── lib
├── cmd.applications.list.sh
├── cmd.applications.status.sh
├── cmd.applications.tiers.list.sh
├── cmd.logical-switches.list.sh
├── drv.applications.list.sh
├── drv.applications.status.sh
├── drv.applications.tiers.list.sh
├── drv.core
├── drv.entities.hosts.list.sh
├── drv.logical-switches.list.sh
├── drv.nodes.status.sh
├── drv
│ ├── completions.sh
│ ├── drv.applications.list.sh
│ ├── drv.entities.clusters.list.sh
│ ├── drv.entities.hosts.list.sh
│ ├── drv.entities.vms.list.sh
│ ├── drv.host.detail.list.sh
│ ├── drv.model.sh
│ ├── drv.nsx.client
│ ├── drv.object.types.sh
│ ├── drv.testicle.sh
│ ├── drv.vrni.client
│ ├── login-notes.txt
│ ├── login.sh
│ ├── mod.core
│ ├── object.type.txt
│ ├── object.types.json
│ ├── output.json
│ ├── read.sh
│ ├── sddc.parameters
│ ├── search.sh
│ ├── test.sh
│ ├── vmvm
│ │ ├── response.json
│ │ └── vm-vm-model.txt
│ ├── vrni.cookies.txt
│ └── vrni.token.txt
├── mod.command
├── sddc.parameters
├── test
│ ├── cmd.data.list.sh
│ ├── cmd.result.list.sh
│ ├── completions.sh
│ ├── drv.model.host.sh
│ ├── drv.model.object.types.sh
│ ├── drv.model.sh
│ ├── drv.search.sh
│ ├── drv.vrni.client
│ ├── drv
│ │ ├── data.json
│ │ ├── drv.data.list.sh
│ │ ├── drv.entities.list.sh
│ │ ├── drv.objects.list.sh
│ │ ├── drv.result.list.sh
│ │ ├── drv.vrni.client
│ │ ├── entities.json
│ │ ├── mod.core
│ │ └── result.json
│ ├── flow.json
│ ├── host.detail.json
│ ├── host.jq
│ ├── host.json
│ ├── login.sh
│ ├── mod.command
│ ├── moo.json
│ ├── new.jq
│ ├── object.type.txt
│ ├── object.types.json
│ ├── read.sh
│ ├── sddc.parameters
│ ├── vmvm
│ │ ├── response.json
│ │ └── vm-vm-model.txt
│ └── workflow.txt
├── vrni.application.list.sh
├── vrni.application.tiers.get.sh
├── vrni.login.sh
└── vrni.token.txt
├── mapping.md
├── metrics
├── cmd
├── cmd.data.list.sh
├── cmd.result.list.sh
├── completions.sh
├── drv.search.sh
├── drv.vrni.client
├── drv
│ ├── data.json
│ ├── drv.data.list.sh
│ ├── drv.metrics.get.sh
│ ├── drv.objects.list.sh
│ ├── drv.result.list.sh
│ ├── drv.vrni.client
│ ├── mod.core
│ ├── result.json
│ └── sddc.parameters
├── jq
│ └── host.jq
├── login.sh
├── mod.command
├── old.login.sh
├── result.json
├── sddc.parameters
├── vrni.cookies.txt
└── vrni.token.txt
├── new
├── cmd
├── cmd.data.list.sh
├── cmd.result.list.sh
├── completions.sh
├── drv.search.sh
├── drv.vrni.client
├── drv
│ ├── data.json
│ ├── drv.data.list.sh
│ ├── drv.objects.list.sh
│ ├── drv.result.list.sh
│ ├── drv.vrni.client
│ ├── mod.core
│ ├── result.json
│ ├── sddc.parameters
│ └── vrni.token.txt
├── jq
│ └── host.jq
├── login.sh
├── mod.command
├── old.login.sh
├── result.json
├── sddc.parameters
├── testdata.json
├── vrni.cookies.txt
└── vrni.token.txt
├── test.md
└── test
├── cmd.test.list.sh
├── cmd.vm.list.sh
├── drv.complete.sh
├── drv.search.sh
├── drv
├── drv.host.list.sh
├── drv.objects.list.sh
├── drv.test.list.sh
├── drv.vm.list.sh
├── link.cmd
├── mod.core
└── test.json
├── jq
├── cluster.jq
├── flow_info.jq
├── generic_vm.jq
├── host.jq
└── vm.jq
├── login.sh
├── mod.command
├── sddc.parameters
└── test.sh
/.gitignore:
--------------------------------------------------------------------------------
1 | **/state
2 | **/cfg
3 |
--------------------------------------------------------------------------------
/MIGRATE.md:
--------------------------------------------------------------------------------
1 | #1 Create a Migration Wave
2 | #2 Look at CPU/Mem footprint
3 | #3 Look at VM dependency with other VMS outside the APP
4 | #4 Look at Networks vms where application = MigrationWave01 group by Network Address
5 | #5 Look at Storage
6 | 1 - Avoid Network tromboning
7 | 2 - Identify all VMs using North-South traffic and traversing DET’s firewall
8 | 3 - Group VMs together if there are dependency (i.e. Web server, apps and database server)
9 | -- Look at Dependency
10 | 4 - Identify VMs with high network bandwidth usage
11 | 5 - Identify VMs with high network bandwidth traffic between our 2 DCs (2T <-> EB)
12 | 6 - Group our selected VMs into vLan groups, we have stretch vLans and non-stretch vLans.
13 |
14 | # Storage queries
15 | vms where application = 'Migration-wave-01' group by vcenter
16 | vms where application = 'Migration-wave-01' group by Network Address
17 |
18 | ## check port group
19 | vm group by dvpg
20 |
21 | ### check subnet pairs
22 | flow where application = 'Migration-wave-01' and Flow Type = 'Routed' group by Source Subnet Network, Destination Subnet Network order by sum(bytes)
23 |
24 | ### 10.10.134.0/24
25 | vms in dvpg that are not in app
26 |
27 | ###
28 | Flows where (External IPs - PHYSICAL) outside migration wave are talking to migration wave // flow type?
29 | Flows where VMs outside migration wave are talking to migration wave // flow type?
30 |
31 | ### VM
32 | Subnet by subnet
33 |
34 | ### If I migrate these whole subnets, what VMs are affected?
35 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # vRealize Network Insight - Traffic Analysis
2 |
3 | 1. [Trial Process](#overview)
4 | 1. [Prerequisites](#prerequisites)
5 | 2. [Installation](#installation)
6 | 2. [Useful Queries](#queries)
7 | 1. [Security](#query-security)
8 | 2. [VM by Application](#query-vm-application)
9 | 3. [VM by Network](#query-vm-network)
10 | 4. [Traffic Analysis - L2 Network](#query-traffic-network)
11 | 5. [Traffic Analysis - Routing and Aggregation](#query-traffic-routing)
12 | 6. [Traffic Analysis - Ports and Services](#query-traffic-services)
13 | 7. [VMs, Routed via Specific L3 Device](#query-vms-routed-specific)
14 | 8. [VMs, Hairpinning and L3 Subnet Dependencies](#query-vms-hairpinning)
15 | 9. [Flows, Aggegration Prefix - Traffic Stats](#query-flows-aggregation)
16 | 10. [Flows, VM-VM, Routed, on Same Host](#query-flows-routed-samehost)
17 | 11. [Flows, VM-VM, Routed, via any L3 Router](#query-flows-routed-any)
18 | 12. [Flows, VM-VM, Routed, via specific L3 Router](#query-flows-routed-specific)
19 | 3. [Import/Export Applications](#applications)
20 |
21 | ## vRNI Trial Process
22 |
23 | The first step is to register for the VRNI trial and download the appliance files.
24 | You can then copy the OVAs onto a vSphere Datastore in your management environment ready to go, as this will greatly simplify the process.
25 |
26 | Also - please read the pre-requisites below as they relate to product versions, vCenter permissions, and the Distributed Switch.
27 |
28 | To get access to the 60-day vRNI Trial you can go here:
29 | https://www.vmware.com/go/vna-field
30 |
31 | To download the appliances (and get the license key), you can sign in using your my.vmware.com credentials.
32 | If you do not have a my.vmware.com account - select "create an account" to register first.
33 |
34 | You will then get access to download the latest vRNI OVAs:
35 | - VMware-vRealize-Network-Insight-X.X.X.XXXXXXXXXX-platform.ova
36 | - VMware-vRealize-Network-Insight-X.X.X.XXXXXXXXXX-proxy.ova
37 |
38 | Main documentation page:
39 | https://docs.vmware.com/en/VMware-vRealize-Network-Insight/index.html
40 |
41 | ### vRNI Prerequisites
42 | For the vRNI trial, there are 2x OVA images (mentioned above) to be imported into a vSphere environment.
43 | These will be configured to begin collecting vCenter inventory and VDS flow information from the virtual environment.
44 |
45 | Please take a look at the pre-requisites below.
46 |
47 | To set up these VMs - you will require:
48 | 1. 2x static IP addresses to be allocated from a MGMT environment (1 IP per VM)
49 | 2. VMs to be imported into a MGMT environment (OVAs to be copied over to vCenter datastore first, but not yet deployed)
50 | 3. These IP addresses require connectivity/access (L2 or L3) to the MGMT network of vCenter and ESX host mgmt VMK ports
51 | 4. Environment must be using the Distributed Virtual Switch
52 | 5. vCenter Server credentials with privileges:
53 | - Distributed Switch: Modify
54 | - dvPort group: Modify
55 |
56 | More details on permissions here:
57 | https://docs.vmware.com/en/VMware-vRealize-Network-Insight/6.1/com.vmware.vrni.using.doc/GUID-B9F6B6B4-5426-4752-B852-B307E49E86D1.html
58 |
59 | 6. Once installed - the vRNI Platform will modify and enable IPFIX flows on the VDS
60 | - This will be a change (although non-impacting) - please ensure any change control items are covered
61 | - Verify current ESX VDS IPFIX configuration before proceeding
62 |
63 | From here we can:
64 | - Create some high level VM 'Application' grouping constructs
65 | - Typically gather data for 3-5 days (or more) and generate reports for app dependencies, routed, switched etc..
66 | - Plan logical constructs for a transition to NSX
67 |
68 | Here are the vRNI VM requirements (refer to Install documentation below):
69 |
70 | vRealize Network Insight Platform OVA:
71 | - 8 cores - Reservation 4096 Mhz
72 | - 32 GB RAM - Reservation - 16GB
73 | - 750 GB - HDD, Thin provisioned
74 |
75 | vRealize Network Insight Proxy OVA:
76 | - 4 cores - Reservation 2048 Mhz
77 | - 10 GB RAM - Reservation - 5GB
78 | - 150 GB - HDD, Thin provisioned
79 |
80 | VMware vCenter Server (version 5.5+ and 6.0+):
81 | - To configure and use IPFIX
82 |
83 | VMware ESXi:
84 | - 5.5 Update 2 (Build 2068190) and above
85 | - 6.0 Update 1b (Build 3380124) and above
86 |
87 | Full list of supported data sources:
88 | https://docs.vmware.com/en/VMware-vRealize-Network-Insight/6.1/com.vmware.vrni.using.doc/GUID-4BA21C7A-18FD-4411-BFAC-CADEF0050D76.html
89 |
90 | VMware Tools ideally installed on all the virtual machines in the data center.
91 | This helps in identifying the VM to VM traffic.
92 |
93 | ### Installation Steps
94 |
95 | I would usually block out a morning or afternoon (around 2 hours) to complete this.
96 | If you have already copied the VMs to vCenter this can be < 1 hour.
97 |
98 | vRealize Network Insight Install Documentation:
99 | https://www.vmware.com/support/pubs/vrealize-network-insight-pubs.html
100 |
101 | This covers the install process - fairly straight forward.
102 | High-level steps:
103 | 1. Import Platform VM OVA and power up
104 | 2. Connect HTTPS to Platform VM and run through wizard
105 | 3. Enter License Key - this is for the 60-day trial
106 | 4. Generate shared key from Platform VM
107 | 5. Import Proxy VM and enter shared key
108 | 6. Finalise Proxy install via setup CLI
109 | 7. Login to Platform VM UI (HTTPS) and configure vCenter / VDS datasources (IPFIX)
110 |
111 | ## Useful Queries
112 |
113 | vRNI can provide a dizzying array of outputs and data analysis.
114 | The usefulness of these outputs is only as good as the questions asked of the system, as constructed via **queries**
115 | Here is a collection of query information that I have personally found useful.
116 |
117 | **Basic Search Queries**
118 |
119 | https://docs.vmware.com/en/VMware-vRealize-Network-Insight/6.1/com.vmware.vrni.using.doc/GUID-176F5A09-2325-41EA-A315-58738CB4F117.html
120 |
121 | **Advanced Search Queries**
122 |
123 | https://docs.vmware.com/en/VMware-vRealize-Network-Insight/6.1/com.vmware.vrni.using.doc/GUID-6D40445C-8BBD-4BCE-88D5-BD4A9D733EFF.html
124 |
125 | #### Security Rules
126 | ```
127 | firewall rules where Service Any = true
128 | firewall rules where Service Any = true and action = ALLOW and destination ip = '0.0.0.0'
129 | firewall rules from VM 'App01-ACI' to VM 'DB02-ACI'
130 | ```
131 |
132 | #### VMs in an Application
133 | ```
134 | vms group by Application
135 | ```
136 |
137 | #### VMs on a Network
138 | ```
139 | vm group by network address
140 | vm group by subnet
141 | ```
142 |
143 | #### Traffic Analysis - L2 Network
144 |
145 | ```
146 | vms group by Default Gateway Router
147 | vms group by Network Address, Default Gateway
148 | L2 Network group by Default Gateway
149 | L2 Network group by Default Gateway, Network Address
150 | L2 Network where VM Count = 0
151 | L2 Network where VM Count = 0 group by Network Address
152 | L2 Network where VM Count > 0 group by Network Address, VM Count
153 |
154 | Router Interface group by Device
155 | Router Interface where device = 'w1c04-vrni-tmm-7050sx-1'
156 | ```
157 |
158 | #### Traffic Analysis - Routing and Aggregation
159 | - Flows by Subnet
160 |
161 | ```
162 | flows group by subnet order by sum(bytes)
163 | ```
164 |
165 | - Flows by Destination VM
166 |
167 | ```
168 | flows group by Destination VM order by sum(bytes)
169 | ```
170 |
171 | - Show highest VM->VM pairs by Byte Rate (Routed)
172 |
173 | ```
174 | sum(bytes) of flows where Flow Type = 'Routed' group by Source VM, Destination VM order by avg(Bytes Rate)
175 | ```
176 |
177 | - Show highest VM->VM pairs by Byte Rate (Switched)
178 |
179 | ```
180 | sum(bytes) of flows where Flow Type = 'Switched' group by Source VM, Destination VM order by avg(Bytes Rate)
181 | ```
182 |
183 | - Show highest Subnet->Subnet pairs by Byte Rate (Routed)
184 |
185 | ```
186 | sum(bytes) of flows where Flow Type = 'Routed' group by Source Subnet, Destination Subnet order by avg(Bytes Rate)
187 | ```
188 |
189 | - Show highest Subnet->Subnet pairs by Byte Rate (Switched)
190 |
191 | ```
192 | sum(bytes) of flows where Flow Type = 'Switched' group by Source Subnet, Destination Subnet order by avg(Bytes Rate)
193 | ```
194 |
195 | #### Traffic Analysis - Ports and Services
196 | - List VMs accepting UDP 53 (DNS) connections
197 |
198 | ```
199 | list(Destination VM) of flows where Destination Port = 53
200 | ```
201 |
202 | - List flows by port-range
203 |
204 | ```
205 | flows where (port >= 100 AND port <= 200)
206 | ```
207 |
208 | - Show RDP connections to VMs (List)
209 |
210 | ```
211 | flows where Destination Port == 3389
212 | ```
213 |
214 | - Show RDP connections to VMs from specific `Source Country`
215 |
216 | ```
217 | flows where Destination Port == 3389 and Source Country == 'China'
218 | ```
219 |
220 | - Show RDP connections to VMs (List VM pairs)
221 |
222 | ```
223 | flows where Destination Port == 3389 group by Destination VM, Source VM
224 | ```
225 |
226 | - Show RDP connections to VMs (List IP-VM pairs)
227 |
228 | ```
229 | flows where Destination Port == 3389 group by Destination VM, Source IP Address
230 | ```
231 |
232 | - Show RDP connections to VMs (List Source Country)
233 |
234 | ```
235 | flows where Destination Port == 3389 group by Destination VM, Source Country
236 | ```
237 |
238 | #### VMs, Routed via Specific L3 Device
239 | - Show me all VMs that use L3 Router `w1c04-vrni-tmm-7050sx-1`
240 |
241 | ```
242 | vms where Default Gateway Router Interface in (Router Interface where (device = 'w1c04-vrni-tmm-7050sx-1'))
243 | ```
244 |
245 | - Show me all VMs that use L3 Router `w1c04-vrni-tmm-7050sx-1` - group by VLAN
246 |
247 | ```
248 | vms where Default Gateway Router Interface in (Router Interface where (device = 'w1c04-vrni-tmm-7050sx-1')) group by VLAN
249 | ```
250 |
251 | - Show me all VMs that use L3 Router `w1c04-vrni-tmm-7050sx-1` - group by VLAN, SUBNET
252 |
253 | ```
254 | vms where Default Gateway Router Interface in (Router Interface where (device = 'w1c04-vrni-tmm-7050sx-1')) group by VLAN, Network Address
255 | ```
256 |
257 | - Show me all VMs that use any L3 Router - group by Router Interface, Network Address
258 |
259 | ```
260 | vm group by Default Gateway Router Interface, Network Address
261 | ```
262 |
263 | #### VM Flow Hairpinning and L3 Subnet Dependencies
264 | - Show me traffic between VMs grouped by L3 router device
265 |
266 | ```
267 | vms group by Default Gateway Router, Default Gateway order by sum(Total Network Traffic)
268 | ```
269 |
270 | - Show me VM->VM pairs of flows hairpinning via any L3 Router
271 |
272 | ```
273 | sum(Bytes) of flows where (Flow Type = 'Routed' and Flow Type = 'Same Host') group by Source VM, Destination VM order by avg(Byte Rate)
274 | ```
275 |
276 | - Show me aggregated Bytes and Byte rate of hairpinning traffic
277 |
278 | ```
279 | sum(bytes), avg(Bytes Rate) of flows where (Flow Type = 'Routed' and Flow Type = 'Same Host')
280 | ```
281 |
282 | - Show me physical Hosts from where I am hairpinning traffic
283 |
284 | ```
285 | flows where (Flow Type = 'Routed' and Flow Type = 'Same Host') group by Host order by sum(Bytes)
286 | ```
287 |
288 | - Show me VM->VM hairpinning from a specific host
289 |
290 | ```
291 | flows where host = 'esx003-ovh-ns103551.vrni.cmbu.org' and (Flow Type = 'Routed' and Flow Type = 'Same Host') group by Source VM, Destination VM order by sum(bytes)
292 | ```
293 |
294 | #### Flows: Aggegration Prefix - Traffic Stats
295 | A useful query prefix for constructing aggregation traffic stats for `Flows`
296 | Replace **``** with actual query filter syntax.
297 |
298 | ```
299 | sum(Bytes), sum(Bytes Rate), sum(Retransmitted Packet Ratio), max(Average Tcp RTT) of flows where
300 | ```
301 |
302 | #### Flows: Routed, Same Host
303 | - Show me aggregated Bytes and Byte Rate of hairpinning traffic via L3 Router (includes VM->Physical flows)
304 |
305 | ```
306 | sum(Bytes), sum(Bytes Rate) of flows where (Flow Type = 'Routed' and Flow Type = 'Same Host')
307 | ```
308 |
309 | - Show me hosts from where I am hairpinning traffic (includes VM->Physical flows) - group by `Host`
310 |
311 | ```
312 | sum(Bytes), sum(Bytes Rate) of flows where (Flow Type = 'Routed' and Flow Type = 'Same Host') group by Host order by sum(Bytes)
313 | ```
314 |
315 | - Show me VM->VM pairs hairpinning traffic via any L3 Router in same Host
316 |
317 | ```
318 | sum(Bytes), sum(Bytes Rate) of flows where (Flow Type = 'Routed' and Flow Type = 'Same Host') group by Source VM, Destination VM order by sum(Bytes)
319 | ```
320 |
321 | - Show me VM->VM hairpinning via any L3 Router from specific host `esx003-ovh-ns103551.vrni.cmbu.org`
322 |
323 | ```
324 | sum(Bytes), sum(Bytes Rate) of flows where host = 'esx003-ovh-ns103551.vrni.cmbu.org' and (Flow Type = 'Routed' and Flow Type = 'Same Host') group by Source VM, Destination VM order by sum(bytes)
325 | ```
326 |
327 | #### Flows: Routed, VM->VM, via any L3 Router
328 |
329 | - Show aggregate traffic stats of all VM->VM flows via any L3 Router
330 |
331 | ```
332 | sum(Bytes) of flows where (Flow Type = 'Routed' and Flow Type = 'VM-VM')
333 | ```
334 |
335 | - Show aggregate traffic stats of all `Same Host` VM->VM flows via any L3 Router
336 |
337 | ```
338 | sum(bytes) of flows where (Flow Type = 'Routed' and Flow Type = 'VM-VM' and Flow Type = 'Same Host')
339 | ```
340 |
341 | - Show aggregate traffic stats of all `Diff Host` VM->VM flows via any L3 Router
342 |
343 | ```
344 | sum(bytes) of flows where (Flow Type = 'Routed' and Flow Type = 'VM-VM' and Flow Type = 'Diff Host')
345 | ```
346 |
347 | - Show aggregate traffic stats of `Same Host` VM->VM flows that are hairpinning via any L3 Router
348 |
349 | ```
350 | sum(Bytes), sum(Bytes Rate), sum(Retransmitted Packet Ratio), max(Average Tcp RTT) of flows where (Flow Type = 'Routed' and Flow Type = 'VM-VM' and Flow Type = 'Same Host')
351 | ```
352 |
353 | - Show me VM->VM pairs and traffic stats of `Same Host` VM->VM flows that are hairpinning via any L3 Router
354 |
355 | ```
356 | sum(Bytes), sum(Bytes Rate), sum(Retransmitted Packet Ratio), max(Average Tcp RTT) of flows where (Flow Type = 'Routed' and Flow Type = 'VM-VM') group by Source VM, Destination VM order by sum(Bytes)
357 | ```
358 |
359 | #### Flows: Routed, VM->VM via specific L3 Router
360 | - Show me all flows via L3 Router `w1c04-vrni-tmm-7050sx-1`
361 |
362 | ```
363 | flows where vm in (vms where Default Gateway Router Interface in (Router Interface where (device = 'w1c04-vrni-tmm-7050sx-1')))
364 | ```
365 |
366 | - Show me aggregate packet stats of all flows via L3 Router `w1c04-vrni-tmm-7050sx-1`
367 |
368 | ```
369 | sum(Bytes), sum(Bytes Rate), sum(Retransmitted Packet Ratio), max(Average Tcp RTT) of flows where vm in (vms where Default Gateway Router Interface in (Router Interface where (device = 'w1c04-vrni-tmm-7050sx-1')))
370 | ```
371 |
372 | - Show me all flows (East-West + North-South) via L3 Router `w1c04-vrni-tmm-7050sx-1`
373 |
374 | ```
375 | sum(bytes) of flows where vm in (vms where Default Gateway Router Interface in (Router Interface where (device = 'w1c04-vrni-tmm-7050sx-1'))) AND (Flow Type = 'Routed')
376 | ```
377 |
378 | - Show me all North-South (VM->Internet) flows via L3 Router `w1c04-vrni-tmm-7050sx-1`
379 |
380 | ```
381 | sum(bytes) of flows where vm in (vms where Default Gateway Router Interface in (Router Interface where (device = 'w1c04-vrni-tmm-7050sx-1'))) AND (Flow Type = 'Routed' and Flow Type = 'Internet')
382 | ```
383 |
384 | - Show me all East-West (VM->VM and VM->Physical) flows via L3 Router `w1c04-vrni-tmm-7050sx-1`
385 |
386 | ```
387 | sum(bytes) of flows where vm in (vms where Default Gateway Router Interface in (Router Interface where (device = 'w1c04-vrni-tmm-7050sx-1'))) AND (Flow Type = 'Routed' and Flow Type = 'East-West')
388 | ```
389 |
390 | - Show me all VM->VM flows via L3 Router `w1c04-vrni-tmm-7050sx-1`
391 |
392 | ```
393 | sum(bytes) of flows where vm in (vms where Default Gateway Router Interface in (Router Interface where (device = 'w1c04-vrni-tmm-7050sx-1'))) AND (Flow Type = 'Routed' and Flow Type = 'VM-VM')
394 | ```
395 |
396 | - Show me all VM->Physical flows via L3 Router `w1c04-vrni-tmm-7050sx-1`
397 |
398 | ```
399 | sum(bytes) of flows where vm in (vms where Default Gateway Router Interface in (Router Interface where (device = 'w1c04-vrni-tmm-7050sx-1'))) AND (Flow Type = 'Routed' and Flow Type = 'VM-Physical')
400 | ```
401 |
402 | - Show me VM->VM pairs and traffic stats of all flows via L3 Router `w1c04-vrni-tmm-7050sx-1`
403 |
404 | ```
405 | sum(Bytes), sum(Bytes Rate), sum(Retransmitted Packet Ratio), max(Average Tcp RTT) of flows where vm in (vms where Default Gateway Router Interface in (Router Interface where (device = 'w1c04-vrni-tmm-7050sx-1'))) group by Source VM, Destination VM order by sum(Bytes)
406 | ```
407 |
408 | - Show me SUBNET->SUBNET pairs and traffic stats of all flows via L3 Router `w1c04-vrni-tmm-7050sx-1`
409 |
410 | ```
411 | sum(Bytes), sum(Bytes Rate), sum(Retransmitted Packet Ratio), max(Average Tcp RTT) of flows where vm in (vms where Default Gateway Router Interface in (Router Interface where (device = 'w1c04-vrni-tmm-7050sx-1'))) group by Source Subnet, Destination Subnet order by sum(Bytes)
412 | ```
413 |
414 | ## Import/Export Applications
415 | Step by step instructions for setting up and exporting vRNI Application definitions as per:
416 | https://code.vmware.com/samples/7128/backup-and-restore-applications---vrealize-network-insight
417 |
418 | This workflow leverages the vRNI Python SDK.
419 |
420 | #### 1. Create new Centos VM
421 | Build a new minimal Centos VM to run the necessary scripts.
422 | For this, you can use my unattended install procedure here:
423 | https://github.com/apnex/pxe
424 |
425 | #### 2. Install Python and pre-requisite packages
426 | Each command should be completed individually before proceeding to the next.
427 | Commands assume you are logged in as root.
428 | ```sh
429 | yum update
430 | yum install epel-release
431 | yum install python python-pip git
432 | pip install --upgrade pip
433 | pip install python-dateutil urllib3 requests pyyaml
434 | ```
435 |
436 | #### 3. Clone the `network-insight-sdk-python` repository
437 | ```sh
438 | git clone https://github.com/vmware/network-insight-sdk-python
439 | ```
440 |
441 | #### 4. Install the Python Swagger client
442 | ```sh
443 | cd network-insight-sdk-python/swagger_client-py2.7.egg
444 | python setup.py install
445 | ```
446 |
447 | #### 5. Test and run an example
448 | ```sh
449 | cd ../examples
450 | python application_backups.py --help
451 | ```
452 |
453 | #### 6. EXPORT: Run `application_backups.py` with valid parameters
454 | Example with **LOCAL** auth:
455 | ```sh
456 | python application_backups.py \
457 | --deployment_type 'onprem' \
458 | --platform_ip '' \
459 | --domain_type 'LOCAL' \
460 | --username '' \
461 | --password '' \
462 | --application_backup_yaml 'applications.yaml' \
463 | --application_backup_action 'save'
464 | ```
465 |
466 | Example with **LDAP** auth:
467 | ```sh
468 | python application_backups.py \
469 | --deployment_type 'onprem' \
470 | --platform_ip '' \
471 | --domain_type 'LDAP' \
472 | --domain_value '' \
473 | --username '' \
474 | --password '' \
475 | --application_backup_yaml 'applications.yaml' \
476 | --application_backup_action 'save'
477 | ```
478 |
479 | #### 7. IMPORT: Run `application_backups.py` with valid parameters
480 | Example with **LOCAL** auth:
481 | ```sh
482 | python application_backups.py \
483 | --deployment_type 'onprem' \
484 | --platform_ip '' \
485 | --domain_type 'LOCAL' \
486 | --username '' \
487 | --password '' \
488 | --application_backup_yaml 'applications.yaml' \
489 | --application_backup_action 'restore'
490 | ```
491 |
492 | Example with **LDAP** auth:
493 | ```sh
494 | python application_backups.py \
495 | --deployment_type 'onprem' \
496 | --platform_ip '' \
497 | --domain_type 'LDAP' \
498 | --domain_value '' \
499 | --username '' \
500 | --password '' \
501 | --application_backup_yaml 'applications.yaml' \
502 | --application_backup_action 'restore'
503 | ```
504 |
505 | #### Throttling Calls - HTTP 429 Errors
506 | Depending on vRNI platform utilisation and deployed size, you may see a `429 Too Many Requests` error.
507 | This is the platfrom appliance rejecting API calls that exceed its current ability to process.
508 |
509 | Solve this by modifying the `application_backups.py` file to sleep longer (for 1 second) between API calls.
510 |
511 | ```diff
512 | - 36 time.sleep(0.025)
513 | + 36 time.sleep(1)
514 | - 58 time.sleep(0.025)
515 | + 58 time.sleep(1)
516 | ```
517 |
--------------------------------------------------------------------------------
/lib/cmd.applications.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/([^/]+)$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | fi
5 | source ${WORKDIR}/mod.command
6 |
7 | function run { ## build record
8 | read -r -d '' SPEC <<-CONFIG
9 | .results | if (. != null) then map({
10 | "entity_id": .entity_id,
11 | "entity_type": .entity_type
12 | }) else "" end
13 | CONFIG
14 | printf "${SPEC}"
15 | }
16 |
17 | ## cmd
18 | cmd "${@}"
19 |
--------------------------------------------------------------------------------
/lib/cmd.applications.status.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/([^/]+)$ ]]; then ## offload to drv.core?
3 | WORKDIR=${BASH_REMATCH[1]}
4 | if [[ ${BASH_REMATCH[2]} =~ ^[^.]+[.](.+)[.]sh$ ]]; then
5 | TYPE=${BASH_REMATCH[1]}
6 | fi
7 | fi
8 | source ${WORKDIR}/drv.core
9 |
10 | ## input driver
11 | INPUT=$(${WORKDIR}/drv.applications.status.sh)
12 |
13 | ## build record structure
14 | read -r -d '' INPUTSPEC <<-CONFIG
15 | . | map({
16 | "entity_id": .entity_id,
17 | "entity_type": .entity_type,
18 | "name": .name,
19 | "created_by": .created_by
20 | })
21 | CONFIG
22 | PAYLOAD=$(echo "$INPUT" | jq -r "$INPUTSPEC")
23 |
24 | # build filter
25 | FILTER=${1}
26 | FORMAT=${2}
27 | #PAYLOAD=$(filter "${PAYLOAD}" "${FILTER}")
28 |
29 | ## cache context data record
30 | setContext "$PAYLOAD" "$TYPE"
31 |
32 | ## output
33 | case "${FORMAT}" in
34 | json)
35 | ## build payload json
36 | echo "${PAYLOAD}" | jq --tab .
37 | ;;
38 | raw)
39 | ## build input json
40 | echo "${INPUT}" | jq --tab .
41 | ;;
42 | *)
43 | ## build payload table
44 | buildTable "${PAYLOAD}"
45 | ;;
46 | esac
47 |
--------------------------------------------------------------------------------
/lib/cmd.applications.tiers.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/([^/]+)$ ]]; then ## offload to drv.core?
3 | WORKDIR=${BASH_REMATCH[1]}
4 | if [[ ${BASH_REMATCH[2]} =~ ^[^.]+[.](.+)[.]sh$ ]]; then
5 | TYPE=${BASH_REMATCH[1]}
6 | fi
7 | fi
8 | source ${WORKDIR}/drv.core
9 |
10 | ## input driver
11 | INPUT=$(${WORKDIR}/drv.applications.tiers.list.sh "${@}")
12 |
13 | # "membership_type": "SearchMembershipCriteria",
14 | # "search_membership_criteria": {
15 | # "entity_type": "BaseVirtualMachine",
16 | # "filter": "name = 'App01'"
17 | # }
18 | ## build record structure
19 | read -r -d '' INPUTSPEC <<-CONFIG
20 | .results | map({
21 | "entity_id": .entity_id,
22 | "name": .name,
23 | "entity_type": .entity_type,
24 | "membership_type": .group_membership_criteria[0].membership_type,
25 | "membership_entity_type": .group_membership_criteria[0].search_membership_criteria.entity_type,
26 | "membership_entity_filter": .group_membership_criteria[0].search_membership_criteria.filter
27 | })
28 | CONFIG
29 | PAYLOAD=$(echo "$INPUT" | jq -r "$INPUTSPEC")
30 |
31 | # build filter
32 | #FILTER=${1}
33 | FORMAT=${2}
34 | #PAYLOAD=$(filter "${PAYLOAD}" "${FILTER}")
35 |
36 | ## cache context data record
37 | setContext "$PAYLOAD" "$TYPE"
38 |
39 | ## output
40 | case "${FORMAT}" in
41 | json)
42 | ## build payload json
43 | echo "${PAYLOAD}" | jq --tab .
44 | ;;
45 | raw)
46 | ## build input json
47 | echo "${INPUT}" | jq --tab .
48 | ;;
49 | *)
50 | ## build payload table
51 | buildTable "${PAYLOAD}"
52 | ;;
53 | esac
54 |
--------------------------------------------------------------------------------
/lib/cmd.logical-switches.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/([^/]+)$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | fi
5 | source ${WORKDIR}/mod.command
6 |
7 | function run { ## build record
8 | read -r -d '' SPEC <<-CONFIG
9 | .results | if (. != null) then map({
10 | "id": .id,
11 | "name": .display_name,
12 | "vni": .vni,
13 | "vlan": .vlan,
14 | "admin_state": .admin_state
15 | }) else "" end
16 | CONFIG
17 | printf "${SPEC}"
18 | }
19 |
20 | ## cmd
21 | cmd "${@}"
22 |
--------------------------------------------------------------------------------
/lib/drv.applications.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | fi
5 | source ${WORKDIR}/drv.core
6 | source ${WORKDIR}/drv.vrni.client
7 |
8 | CALL=$1
9 | if [[ -n "${VRNIHOST}" ]]; then
10 | ITEM="groups/applications"
11 | URL=$(buildURL "${ITEM}")
12 | if [[ -n "${CALL}" ]]; then
13 | URL+="/${CALL}"
14 | else
15 | URL+="?size=10"
16 | fi
17 | if [[ -n "${URL}" ]]; then
18 | printf "[$(cgreen "INFO")]: nsx [$(cgreen "list")] ${ITEM} [$(cgreen "$URL")]... " 1>&2
19 | vrniGet "${URL}"
20 | fi
21 | fi
22 |
--------------------------------------------------------------------------------
/lib/drv.applications.status.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | fi
5 | source ${WORKDIR}/drv.core
6 | source ${WORKDIR}/drv.vrni.client
7 |
8 | ## input driver
9 | NODES=$(${WORKDIR}/drv.applications.list.sh)
10 |
11 | # re-base to drv.node....?
12 | function getStatus {
13 | local NODEID=${1}
14 | ./drv.applications.list.sh "${NODEID}"
15 | }
16 |
17 | function buildNode {
18 | local KEY=${1}
19 |
20 | read -r -d '' JQSPEC <<-CONFIG # collapse into single line
21 | .results[] | select(.entity_id=="${KEY}")
22 | CONFIG
23 | NODE=$(echo ${NODES} | jq -r "$JQSPEC")
24 |
25 | # build node record
26 | read -r -d '' NODESPEC <<-CONFIG
27 | {
28 | "entity_id": .entity_id,
29 | "entity_type": .entity_type
30 | }
31 | CONFIG
32 | NEWNODE=$(echo "${NODE}" | jq -r "${NODESPEC}")
33 |
34 | ## get node status
35 | RESULT=$(getStatus "$KEY")
36 | read -r -d '' STATUSSPEC <<-CONFIG
37 | {
38 | "name": .name,
39 | "created_by": .created_by
40 | }
41 | CONFIG
42 | NEWSTAT=$(echo "${RESULT}" | jq -r "${STATUSSPEC}")
43 |
44 | # merge node and status
45 | MYNODE="$(echo "${NEWNODE}${NEWSTAT}" | jq -s '. | add')"
46 | printf "%s\n" "${MYNODE}"
47 | }
48 |
49 | FINAL="[]"
50 | for KEY in $(echo ${NODES} | jq -r '.results[] | .entity_id'); do
51 | MYNODE=$(buildNode "${KEY}")
52 | FINAL="$(echo "${FINAL}[${MYNODE}]" | jq -s '. | add')"
53 | done
54 | printf "${FINAL}" | jq --tab .
55 |
--------------------------------------------------------------------------------
/lib/drv.applications.tiers.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | fi
5 | source ${WORKDIR}/drv.core
6 | source ${WORKDIR}/drv.vrni.client
7 |
8 | CALL=$1
9 | if [[ -n "${VRNIHOST}" && "${CALL}" ]]; then
10 | ITEM="groups/applications"
11 | URL=$(buildURL "${ITEM}")
12 | if [[ -n "${CALL}" ]]; then
13 | URL+="/${CALL}/tiers"
14 | fi
15 | if [[ -n "${URL}" ]]; then
16 | printf "[$(cgreen "INFO")]: vrni [$(cgreen "list")] ${ITEM} [$(cgreen "$URL")]... " 1>&2
17 | vrniGet "${URL}"
18 | fi
19 | else
20 | printf "[$(corange "ERROR")]: command usage: $(cgreen "applications.tiers.list") $(ccyan "")\n" 1>&2
21 | fi
22 |
23 |
--------------------------------------------------------------------------------
/lib/drv.core:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | # detect and resolve symlink
3 | if [[ -L $0 ]]; then
4 | if [[ $(readlink $0) =~ ^(.*)/([^/]+)$ ]]; then
5 | WORKDIR="${BASH_REMATCH[1]}"
6 | CALLED="${BASH_REMATCH[2]}"
7 | fi
8 | else
9 | if [[ $0 =~ ^(.*)/([^/]+)$ ]]; then
10 | WORKDIR="${BASH_REMATCH[1]}"
11 | CALLED="${BASH_REMATCH[2]}"
12 | fi
13 | fi
14 | STATEDIR="${WORKDIR}/state"
15 | if [ ! -d ${STATEDIR} ]; then
16 | mkdir ${STATEDIR}
17 | fi
18 |
19 | # detect available cmds
20 | commands() {
21 | #echo "-- [COMMANDS] --"
22 | printf "%s" "list"
23 | for FILE in ${WORKDIR}/cmd.*.sh; do
24 | if [[ $FILE =~ cmd[.](.+)[.]sh ]]; then
25 | printf " %s" "${BASH_REMATCH[1]}"
26 | fi
27 | done
28 | exit 1
29 | }
30 | if [[ -n "$1" && ${CALLED} == "drv.core" ]]; then
31 | case "${1}" in
32 | list) ## list commands
33 | commands
34 | ;;
35 | setup-params) ## output sddc.parameters
36 | cat ${WORKDIR}/sddc.parameters
37 | ;;
38 | setup-bash) ## output bash-cli
39 | cat ${WORKDIR}/bash-cli
40 | ;;
41 | *) ## execute command
42 | if [ -f "${WORKDIR}/cmd.${1}.sh" ]; then
43 | eval "${WORKDIR}/cmd.${1}.sh ${2} ${3} ${4}"
44 | fi
45 | ;;
46 | esac
47 | fi
48 |
49 | # get OSNAME
50 | OSNAME="$(uname -s)"
51 | case "${OSNAME}" in
52 | Linux*)
53 | #printf "HAHA you run a L:${OSNAME}\n" 1>&2
54 | ;;
55 | Darwin*)
56 | #printf "HAHA you run a D:${OSNAME}\n" 1>&2
57 | ;;
58 | esac
59 |
60 | # COLOURS
61 | NC='\033[0m' # no colour
62 | BLACK='\033[0;30m' # black
63 | RED='\033[0;31m' # red
64 | GREEN='\033[0;32m' # green
65 | ORANGE='\033[0;33m' # orange
66 | BLUE='\033[0;34m' # blue
67 | PURPLE='\033[0;35m' # purple
68 | CYAN='\033[0;36m' # cyan
69 | LIGHTGREY='\033[0;37m' # light grey
70 | DARKGREY='\033[0;30m' # dark grey
71 | LIGHTRED='\033[0;31m' # light red
72 | LIGHTGREEN='\033[0;32m' # light green
73 | YELLOW='\033[0;33m' # yellow
74 | LIGHTBLUE='\033[0;34m' # light blue
75 | LIGHTPURPLE='\033[0;35m' # light purple
76 | LIGHTCYAN='\033[0;36m' # light cyan
77 | WHITE='\033[0;37m' # white
78 |
79 | function corange {
80 | local STRING=${1}
81 | printf "${ORANGE}${STRING}${NC}"
82 | }
83 | function cgreen {
84 | local STRING=${1}
85 | printf "${GREEN}${STRING}${NC}"
86 | }
87 | function ccyan {
88 | local STRING=${1}
89 | printf "${CYAN}${STRING}${NC}"
90 | }
91 |
92 | function isSuccess {
93 | local STRING=${1}
94 | if [[ $STRING =~ ^(.*)([0-9]{3})$ ]]; then
95 | local BODY=${BASH_REMATCH[1]}
96 | local CODE=${BASH_REMATCH[2]}
97 | fi
98 | printf "[$(ccyan "${CODE}")] - " 1>&2
99 | if [[ $CODE =~ 2..$ ]]; then
100 | printf "SUCCESS\n" 1>&2
101 | else
102 | printf "ERROR\n" 1>&2
103 | fi
104 | printf "%s\n" "${BODY}"
105 | }
106 |
107 | function getFile {
108 | local ENDPOINT=${1}
109 | local BASE=${2}
110 | local STATE
111 | if [[ -n $BASE ]]; then
112 | REGEX="^($BASE)"
113 | if [[ $ENDPOINT =~ $REGEX ]]; then
114 | ENDPOINT=${ENDPOINT#*"${BASH_REMATCH[1]}"}
115 | fi
116 | fi
117 | while [[ $ENDPOINT =~ ([^/]+) ]]; do
118 | ENDPOINT=${ENDPOINT#*"${BASH_REMATCH[1]}"}
119 | STATE+=".${BASH_REMATCH[1]}"
120 | done
121 | STATE+=".json"
122 | printf "${STATE}"
123 | }
124 |
125 | function getThumbprint {
126 | local HOST="${1}"
127 | local PAYLOAD=$(echo -n | openssl s_client -connect "${HOST}" 2>/dev/null)
128 | local PRINT=$(echo "$PAYLOAD" | openssl x509 -noout -fingerprint -sha256)
129 | local REGEX='^(.*)=(([0-9A-Fa-f]{2}[:])+([0-9A-Fa-f]{2}))$'
130 | if [[ $PRINT =~ $REGEX ]]; then
131 | local TYPE=${BASH_REMATCH[1]}
132 | local CODE=${BASH_REMATCH[2]}
133 | fi
134 | printf "%s\n" "${CODE}" | sed "s/\(.*\)/\L\1/g" | sed "s/://g"
135 | }
136 |
137 | function getCertificate {
138 | local HOST="${1}"
139 | local PAYLOAD=$(echo -n | openssl s_client -connect "${HOST}" 2>/dev/null)
140 | local RESULT=$(echo "${PAYLOAD}" | sed -e '1h;2,$H;$!d;g' -e 's/.*\(-----BEGIN\sCERTIFICATE-----.*-----END\sCERTIFICATE-----\).*/\1/g')
141 | printf "%s\n" "$RESULT" | sed ':a;N;$!ba;s/\n/\\\\n/g'
142 | }
143 |
144 | # build and output table from input dataset
145 | function buildTable {
146 | local INPUT="${1}"
147 | read -r -d '' JQTABLE <<-CONFIG
148 | if (.[0]?) then
149 | [(
150 | [.[0] | to_entries[] | .key]
151 | | ., map(length * "-")
152 | ),(
153 | .[] | [to_entries[] | .value]
154 | )]
155 | else . end
156 | CONFIG
157 | echo "$INPUT" | jq -r "$JQTABLE | .[] | @tsv" | column -t -s $'\t'
158 | }
159 |
160 | ## filter payload with string
161 | function filter {
162 | local PAYLOAD=${1}
163 | local STRING=${2}
164 | while [[ $STRING =~ ([^,]+) ]]; do
165 | local FILTER="${BASH_REMATCH[1]}"
166 | STRING=${STRING#*"${BASH_REMATCH[1]}"}
167 | local FIELD="name"
168 | local VALUE="."
169 | if [[ $FILTER =~ ([^:]+):([^:]+) ]]; then
170 | FIELD=${BASH_REMATCH[1]}
171 | VALUE=${BASH_REMATCH[2]}
172 | else
173 | VALUE="${FILTER}"
174 | fi
175 | read -r -d '' FILTERSPEC <<-CONFIG
176 | map(select(."$FIELD"|test("$VALUE";"i")))
177 | CONFIG
178 | PAYLOAD=$(echo "$PAYLOAD" | jq -r "$FILTERSPEC")
179 | done
180 | printf "%s\n" "${PAYLOAD}" | jq --tab .
181 | }
182 |
183 | ## set current context
184 | function setContext {
185 | local INPUT="${1}"
186 | local ITEM="${2}"
187 | local STATE="${STATEDIR}/ctx.${ITEM}.json"
188 | local PAYLOAD=$(echo "$INPUT" | jq --tab '.[0]')
189 | if [[ ! "${PAYLOAD}" == null ]]; then
190 | printf "%s\n" "${PAYLOAD}" >"${STATE}"
191 | fi
192 | }
193 |
194 | ## get current context
195 | function getContext {
196 | local FILTER="${1}"
197 | if [[ -z $FILTER ]]; then
198 | FILTER="."
199 | fi
200 | echo "FILTER: ${FILTER}" 1>&2
201 | local PAYLOAD=$("${WORKDIR}"/cmd.context.list.sh "${FILTER}" json | jq '.[0]')
202 | if [[ ! "$PAYLOAD" == null ]]; then
203 | printf "%s\n" "${PAYLOAD}" | jq -r '.id'
204 | fi
205 | }
206 |
--------------------------------------------------------------------------------
/lib/drv.entities.hosts.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | fi
5 | source ${WORKDIR}/drv.vrni.client
6 |
7 | CALL=$1
8 | if [[ -n "${VRNIHOST}" ]]; then
9 | ITEM="groups/applications"
10 | URL=$(buildURL "${ITEM}")
11 | if [[ -n "${CALL}" ]]; then
12 | URL+="/${CALL}"
13 | else
14 | URL+="?size=10"
15 | fi
16 | if [[ -n "${URL}" ]]; then
17 | printf "[$(cgreen "INFO")]: nsx [$(cgreen "list")] ${ITEM} [$(cgreen "$URL")]... " 1>&2
18 | vrniGet "${URL}"
19 | fi
20 | fi
21 |
--------------------------------------------------------------------------------
/lib/drv.logical-switches.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | fi
5 | source ${WORKDIR}/drv.nsx.client
6 |
7 | ITEM="logical-switches"
8 | if [[ -n "${NSXHOST}" ]]; then
9 | URL=$(buildURL "${ITEM}")
10 | if [[ -n "${URL}" ]]; then
11 | printf "[$(cgreen "INFO")]: nsx [$(cgreen "list")] ${ITEM} [$(cgreen "$URL")]... " 1>&2
12 | nsxGet "${URL}"
13 | fi
14 | fi
15 |
--------------------------------------------------------------------------------
/lib/drv.nodes.status.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | fi
5 | source ${WORKDIR}/drv.core
6 | source ${WORKDIR}/drv.nsx.client
7 |
8 | ## input driver
9 | NODES=$(${WORKDIR}/drv.nodes.list.sh)
10 |
11 | # re-base to drv.node....?
12 | function getStatus {
13 | local NODEID=${1}
14 | ITEM="fabric/nodes"
15 | CALL="/${NODEID}/status"
16 | URL=$(buildURL "${ITEM}${CALL}")
17 | if [[ -n "${URL}" ]]; then
18 | printf "[$(cgreen "INFO")]: nsx [$(cgreen "status")] ${ITEM} [$(cgreen "$URL")]... " 1>&2
19 | nsxGet "${URL}"
20 | fi
21 | }
22 |
23 | function buildNode {
24 | local KEY=${1}
25 |
26 | read -r -d '' JQSPEC <<-CONFIG # collapse into single line
27 | .results[] | select(.id=="${KEY}")
28 | CONFIG
29 | NODE=$(echo ${NODES} | jq -r "$JQSPEC")
30 |
31 | # build node record
32 | read -r -d '' NODESPEC <<-CONFIG
33 | {
34 | "id": .id,
35 | "name": .display_name,
36 | "resource_type": .resource_type,
37 | "ip_address": .ip_addresses[0]
38 | }
39 | CONFIG
40 | NEWNODE=$(echo "${NODE}" | jq -r "${NODESPEC}")
41 |
42 | ## get node status
43 | RESULT=$(getStatus "$KEY")
44 | read -r -d '' STATUSSPEC <<-CONFIG
45 | {
46 | "status": .host_node_deployment_status,
47 | "version": .software_version
48 | }
49 | CONFIG
50 | NEWSTAT=$(echo "${RESULT}" | jq -r "${STATUSSPEC}")
51 |
52 | # merge node and status
53 | MYNODE="$(echo "${NEWNODE}${NEWSTAT}" | jq -s '. | add')"
54 | printf "%s\n" "${MYNODE}"
55 | }
56 |
57 | FINAL="[]"
58 | for KEY in $(echo ${NODES} | jq -r '.results[] | .id'); do
59 | MYNODE=$(buildNode "${KEY}")
60 | FINAL="$(echo "${FINAL}[${MYNODE}]" | jq -s '. | add')"
61 | done
62 | printf "${FINAL}" | jq --tab .
63 |
--------------------------------------------------------------------------------
/lib/drv/completions.sh:
--------------------------------------------------------------------------------
1 | ## api for query completions
2 |
3 | https://field-demo.vrni.cmbu.local/api/search/completions?partialQuery=hosts+where+name+&fullQuery=hosts+where+name+&maxCompletions=70
4 |
--------------------------------------------------------------------------------
/lib/drv/drv.applications.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | fi
5 | source ${WORKDIR}/drv.vrni.client
6 |
7 | CALL=$1
8 | if [[ -n "${VRNIHOST}" ]]; then
9 | ITEM="groups/applications"
10 | URL=$(buildURL "${ITEM}")
11 | if [[ -n "${CALL}" ]]; then
12 | URL+="/${CALL}"
13 | else
14 | URL+="?size=10"
15 | fi
16 | if [[ -n "${URL}" ]]; then
17 | printf "[$(cgreen "INFO")]: nsx [$(cgreen "list")] ${ITEM} [$(cgreen "$URL")]... " 1>&2
18 | vrniGet "${URL}"
19 | fi
20 | fi
21 |
--------------------------------------------------------------------------------
/lib/drv/drv.entities.clusters.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | fi
5 | source ${WORKDIR}/drv.vrni.client
6 |
7 | CALL=$1
8 | if [[ -n "${VRNIHOST}" ]]; then
9 | ITEM="entities/clusters"
10 | URL=$(buildURL "${ITEM}")
11 | if [[ -n "${CALL}" ]]; then
12 | URL+="/${CALL}"
13 | else
14 | URL+="?size=10"
15 | fi
16 | if [[ -n "${URL}" ]]; then
17 | printf "[$(cgreen "INFO")]: nsx [$(cgreen "list")] ${ITEM} [$(cgreen "$URL")]... " 1>&2
18 | vrniGet "${URL}"
19 | fi
20 | fi
21 |
--------------------------------------------------------------------------------
/lib/drv/drv.entities.hosts.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | fi
5 | source ${WORKDIR}/drv.vrni.client
6 |
7 | CALL=$1
8 | if [[ -n "${VRNIHOST}" ]]; then
9 | ITEM="entities/hosts"
10 | URL=$(buildURL "${ITEM}")
11 | if [[ -n "${CALL}" ]]; then
12 | URL+="/${CALL}"
13 | else
14 | URL+="?size=10"
15 | fi
16 | if [[ -n "${URL}" ]]; then
17 | printf "[$(cgreen "INFO")]: nsx [$(cgreen "list")] ${ITEM} [$(cgreen "$URL")]... " 1>&2
18 | vrniGet "${URL}"
19 | fi
20 | fi
21 |
--------------------------------------------------------------------------------
/lib/drv/drv.entities.vms.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | fi
5 | source ${WORKDIR}/drv.vrni.client
6 |
7 | CALL=$1
8 | if [[ -n "${VRNIHOST}" ]]; then
9 | ITEM="entities/vms"
10 | URL=$(buildURL "${ITEM}")
11 | if [[ -n "${CALL}" ]]; then
12 | URL+="/${CALL}"
13 | else
14 | URL+="?size=10"
15 | fi
16 | if [[ -n "${URL}" ]]; then
17 | printf "[$(cgreen "INFO")]: nsx [$(cgreen "list")] ${ITEM} [$(cgreen "$URL")]... " 1>&2
18 | vrniGet "${URL}"
19 | fi
20 | fi
21 |
--------------------------------------------------------------------------------
/lib/drv/drv.host.detail.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | fi
5 | source ${WORKDIR}/drv.vrni.client
6 |
7 | function makeBody {
8 | read -r -d '' BODY <<-CONFIG
9 | {
10 | "entity_type": "Host"
11 | }
12 | CONFIG
13 | printf "${BODY}"
14 | }
15 |
16 | CALL=$1
17 | if [[ -n "${VRNIHOST}" ]]; then
18 | ITEM="search"
19 | BODY=$(makeBody)
20 | URL=$(buildURL "${ITEM}")
21 | if [[ -n "${CALL}" ]]; then
22 | URL+="/${CALL}"
23 | else
24 | URL+="?size=10"
25 | fi
26 | if [[ -n "${URL}" ]]; then
27 | printf "[$(cgreen "INFO")]: nsx [$(cgreen "list")] ${ITEM} [$(cgreen "$URL")]... " 1>&2
28 | vrniPost "${URL}" "${BODY}"
29 | fi
30 | fi
31 |
--------------------------------------------------------------------------------
/lib/drv/drv.model.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | fi
5 | source ${WORKDIR}/drv.vrni.client
6 |
7 | if [[ -n "${VRNIHOST}" ]]; then
8 | ITEM="search/query"
9 | URL=$(buildURL "${ITEM}")
10 | #if [[ -n "${CALL}" ]]; then
11 | # URL+="/${CALL}"
12 | #else
13 | #URL+="?size=10"
14 | URL="https://field-demo.vrni.cmbu.local/api/model/properties?objectType=1"
15 | #URL+='?searchString=memory%2Ccpu+of+host'
16 | #fi
17 | #if [[ -n "${URL}" ]]; then
18 | printf "%s" "[INFO]: nsx [list] ${ITEM} [${URL}]... " 1>&2
19 | #printf "%s" "[$(cgreen "INFO")]: nsx [$(cgreen "list")] ${ITEM} [$(cgreen "$URL")]... " 1>&2
20 | #printf '%s\n' "${URL}"
21 | vrniGet "${URL}"
22 | #fi
23 | fi
24 |
--------------------------------------------------------------------------------
/lib/drv/drv.nsx.client:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [ -z ${WORKDIR} ]; then
3 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
4 | WORKDIR=${BASH_REMATCH[1]}
5 | fi
6 | if [[ $0 == "bash" ]]; then
7 | WORKDIR="."
8 | fi
9 | fi
10 | if [ -z ${SDDCDIR} ]; then
11 | SDDCDIR=${WORKDIR}
12 | fi
13 | STATEDIR="${WORKDIR}/state"
14 | if [ ! -d ${STATEDIR} ]; then
15 | mkdir ${STATEDIR}
16 | fi
17 | source ${WORKDIR}/mod.core
18 |
19 | PARAMS=$(cat ${SDDCDIR}/sddc.parameters)
20 | DOMAIN=$(echo "${PARAMS}" | jq -r '.domain')
21 | SPEC=$(echo "${PARAMS}" | jq -r '.endpoints[] | select(.type=="nsx")')
22 | NSXHOST=$(echo "$SPEC" | jq -r '.hostname')
23 | if [[ ! "$NSXHOST" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
24 | if [[ ! "$NSXHOST" =~ [.] ]]; then
25 | NSXHOST+=".$DOMAIN" #if not an IP or FQDN, append domain
26 | fi
27 | fi
28 | NSXUSER=$(echo "$SPEC" | jq -r '.username')
29 | NSXPASS=$(echo "$SPEC" | jq -r '.password')
30 | NSXONLINE=$(echo "$SPEC" | jq -r '.online')
31 | NSXSESSION="${STATEDIR}/nsx.token.txt"
32 | NSXBASE="https://${NSXHOST}/api/v1/"
33 |
34 | function nsxLogin {
35 | local URL="https://${NSXHOST}/api/session/create"
36 |
37 | ### DEBUG ###
38 | #printf "%s\n" "NSXUSER: ${NSXUSER}" 1>&2
39 | #printf "%s\n" "NSXPASS: ${NSXPASS}" 1>&2
40 | #curl -k --trace-ascii /dev/stdout -c "${STATEDIR}/nsx.cookies.txt" -D "${STATEDIR}/nsx.headers.txt" -w "%{http_code}" -X POST \
41 | # --data-urlencode "j_username=${NSXUSER}" \
42 | # --data-urlencode "j_password=${NSXPASS}" \
43 | #"${URL}" 1>&2
44 | ### DEBUG ###
45 |
46 | local RESPONSE=$(curl -k -c "${STATEDIR}/nsx.cookies.txt" -D "${STATEDIR}/nsx.headers.txt" -w "%{http_code}" -X POST \
47 | --data-urlencode "j_username=${NSXUSER}" \
48 | --data-urlencode "j_password=${NSXPASS}" \
49 | "${URL}" 2>/dev/null)
50 | local RESULT=$(isSuccess "${RESPONSE}" "${NSXSESSION}")
51 | local CODE=$(getCode "${RESPONSE}")
52 | if [[ $CODE =~ 2..$ ]]; then
53 | local HEADER="$(grep X-XSRF-TOKEN: "${STATEDIR}/nsx.headers.txt")"
54 | if [[ $HEADER =~ ([-a-f0-9:]+)[^-a-f0-9:]*$ ]]; then
55 | local TOKEN=${BASH_REMATCH[1]}
56 | fi
57 | printf "%s\n" "${TOKEN}"
58 | fi
59 | }
60 |
61 | function nsxSession {
62 | local SESSION=$NSXSESSION
63 | local ONLINE=$NSXONLINE
64 | if [[ "$ONLINE" == "true" ]]; then
65 | local RUNFIND="$(find ${SESSION} -mmin -10 2>/dev/null)"
66 | if [[ -z ${RUNFIND} ]]; then
67 | printf "No valid session found, authenticating... " 1>&2
68 | local LOGIN=$(nsxLogin)
69 | if [[ -n ${LOGIN} ]]; then
70 | echo "${LOGIN}" >"$SESSION"
71 | fi
72 | fi
73 | fi
74 | printf "%s\n" "$(cat "${SESSION}" 2>/dev/null)"
75 | #printf "%s\n" "$(cat "${SESSION}")" 1>&2
76 | }
77 |
78 | function nsxPost {
79 | local URL=${1}
80 | local BODY=${2}
81 | if [[ "$NSXONLINE" == "true" ]]; then
82 | RESPONSE=$(curl -k -b "${STATEDIR}/nsx.cookies.txt" -w "%{http_code}" -X POST \
83 | -H "X-Allow-Overwrite: true" \
84 | -H "X-XSRF-TOKEN: $(cat ${NSXSESSION})" \
85 | -H "Content-Type: application/json" \
86 | -d "$BODY" \
87 | "$URL" 2>/dev/null)
88 | RESULT=$(isSuccess "${RESPONSE}" "${NSXSESSION}")
89 | else
90 | printf "[$(ccyan "OFFLINE")] - SUCCESS\n" 1>&2
91 | fi
92 | printf "%s\n" "${RESULT}" | jq --tab .
93 | }
94 |
95 | function nsxPut {
96 | local URL=${1}
97 | local BODY=${2}
98 | if [[ "$NSXONLINE" == "true" ]]; then
99 |
100 | ### DEBUG ###
101 | #curl -k --trace-ascii /dev/stdout -b "${STATEDIR}/nsx.cookies.txt" -w "%{http_code}" -X PUT \
102 | # -H "X-Allow-Overwrite: true" \
103 | # -H "X-XSRF-TOKEN: $(cat ${NSXSESSION})" \
104 | # -H "Content-Type: application/json" \
105 | # --data "${BODY}" \
106 | #"${URL}" 1>&2
107 | ### DEBUG ###
108 |
109 | RESPONSE=$(curl -k -b "${STATEDIR}/nsx.cookies.txt" -w "%{http_code}" -X PUT \
110 | -H "X-Allow-Overwrite: true" \
111 | -H "X-XSRF-TOKEN: $(cat ${NSXSESSION})" \
112 | -H "Content-Type: application/json" \
113 | --data "${BODY}" \
114 | "$URL" 2>/dev/null)
115 | RESULT=$(isSuccess "${RESPONSE}" "${NSXSESSION}")
116 | else
117 | printf "[$(ccyan "OFFLINE")] - SUCCESS\n" 1>&2
118 | fi
119 | #printf "%s\n" "${RESULT}" | jq --tab .
120 | }
121 |
122 | function nsxDelete {
123 | local URL=${1}
124 | local BODY=${2}
125 | if [[ "$NSXONLINE" == "true" ]]; then
126 | STATE=$(getFile "${URL}")
127 |
128 | ### DEBUG ###
129 | #curl -k --trace-ascii /dev/stdout -b "${STATEDIR}/nsx.cookies.txt" -w "%{http_code}" -G -X DELETE \
130 | # -H "X-Allow-Overwrite: true" \
131 | # -H "X-XSRF-TOKEN: $(cat ${NSXSESSION})" \
132 | # -H "Content-Type: application/x-form-urlencoded" \
133 | # --data "${BODY}" \
134 | #"${URL}" 1>&2
135 | ### DEBUG ###
136 |
137 | RESPONSE=$(curl -k -b "${STATEDIR}/nsx.cookies.txt" -w "%{http_code}" -G -X DELETE \
138 | -H "X-Allow-Overwrite: true" \
139 | -H "X-XSRF-TOKEN: $(cat ${NSXSESSION})" \
140 | -H "Content-Type: application/x-form-urlencoded" \
141 | --data "$BODY" \
142 | "$URL" 2>/dev/null)
143 | RESULT=$(isSuccess "${RESPONSE}" "${NSXSESSION}")
144 | else
145 | printf "[$(ccyan "OFFLINE")] - SUCCESS\n" 1>&2
146 | fi
147 | #work out state synch for deletes
148 | printf "%s\n" "${RESULT}" | jq --tab .
149 | }
150 |
151 | function nsxGet {
152 | local URL=${1}
153 | local BASE=${NSXBASE}
154 | local STATE
155 | if [[ "$NSXONLINE" == "true" ]]; then
156 | local FILE=$(getFile "${URL}" "${BASE}")
157 | STATE="${STATEDIR}/nsx${FILE}"
158 |
159 | ### DEBUG ###
160 | #curl -k --trace-ascii /dev/stdout -b "${STATEDIR}/nsx.cookies.txt" -w "%{http_code}" -X PUT \
161 | # -H "X-Allow-Overwrite: true" \
162 | # -H "X-XSRF-TOKEN: $(cat ${NSXSESSION})" \
163 | # -H "Content-Type: application/json" \
164 | # --data "${BODY}" \
165 | #"${URL}" 1>&2
166 | ### DEBUG ###
167 |
168 | RESPONSE=$(curl -k -b "${STATEDIR}/nsx.cookies.txt" -w "%{http_code}" -X GET \
169 | -H "X-XSRF-TOKEN: $(cat ${NSXSESSION})" \
170 | -H "Content-Type: application/json" \
171 | "$URL" 2>/dev/null)
172 | RESULT=$(isSuccess "${RESPONSE}" "${NSXSESSION}")
173 | else
174 | printf "[$(ccyan "OFFLINE")] - SUCCESS\n" 1>&2
175 | RESULT=$(cat "${URL}")
176 | STATE="${URL}"
177 | fi
178 | printf "%s\n" "${RESULT}" | jq --tab . >"${STATE}"
179 | printf "%s\n" "${RESULT}" | jq --tab .
180 | }
181 |
182 | function buildURL {
183 | local ENDPOINT="${1}"
184 | local BASE="${NSXBASE}"
185 | local STATE="${STATEDIR}"
186 | local ONLINE="${NSXONLINE}"
187 | if [[ "$ONLINE" == "true" ]]; then
188 | local SUCCESS=$(nsxSession)
189 | if [[ -n ${SUCCESS} ]]; then
190 | URL="$BASE$ENDPOINT"
191 | else
192 | URL="" #failed to obtain valid session
193 | fi
194 | else
195 | local FILE=$(getFile "${ENDPOINT}")
196 | URL="${STATE}/nsx${FILE}"
197 | fi
198 | printf "$URL"
199 | }
200 |
--------------------------------------------------------------------------------
/lib/drv/drv.object.types.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | TOKEN=$(cat vrni.token.txt)
4 | curl -k -X GET \
5 | -b "vrni.cookies.txt" \
6 | 'https://field-demo.vrni.cmbu.local/api/model/objectTypes?=' \
7 | -H 'accept: application/json, text/javascript, */*; q=0.01' \
8 | -H "x-vrni-csrf-token: $TOKEN"
9 |
--------------------------------------------------------------------------------
/lib/drv/drv.testicle.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | fi
5 | source ${WORKDIR}/drv.vrni.client
6 |
7 | if [[ -n "${VRNIHOST}" ]]; then
8 | ITEM="search/query"
9 | #URL=$(buildURL "${ITEM}")
10 | #if [[ -n "${CALL}" ]]; then
11 | # URL+="/${CALL}"
12 | #else
13 | #URL+="?size=10"
14 | URL="https://field-demo.vrni.cmbu.local/api/search/query?searchString=memory%2Ccpu+of+host×tamp=1576021141486&timeRangeString=+at+Now+&includeObjects=false&includeFacets=true&includeMetrics=false&includeEvents=false&startIndex=0&maxItemCount=10&dateTimeZone=%2B11%3A00&sourceString=USER&includeModelKeyOnly=false"
15 | #URL+='?searchString=memory%2Ccpu+of+host'
16 | #fi
17 | #if [[ -n "${URL}" ]]; then
18 | printf "%s" "[INFO]: nsx [list] ${ITEM} [${URL}]... " 1>&2
19 | #printf "%s" "[$(cgreen "INFO")]: nsx [$(cgreen "list")] ${ITEM} [$(cgreen "$URL")]... " 1>&2
20 | #printf '%s\n' "${URL}"
21 | vrniGet "${URL}"
22 | #fi
23 | fi
24 |
--------------------------------------------------------------------------------
/lib/drv/drv.vrni.client:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [ -z ${WORKDIR} ]; then
3 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
4 | WORKDIR=${BASH_REMATCH[1]}
5 | fi
6 | if [[ $0 == "bash" ]]; then
7 | WORKDIR="."
8 | fi
9 | fi
10 | if [ -z ${SDDCDIR} ]; then
11 | SDDCDIR=${WORKDIR}
12 | fi
13 | STATEDIR="${WORKDIR}/state"
14 | if [ ! -d ${STATEDIR} ]; then
15 | mkdir ${STATEDIR}
16 | fi
17 | source ${WORKDIR}/mod.core
18 |
19 | PARAMS=$(cat ${SDDCDIR}/sddc.parameters)
20 | DOMAIN=$(echo "${PARAMS}" | jq -r '.domain')
21 | SPEC=$(echo "${PARAMS}" | jq -r '.endpoints[] | select(.type=="vrni")')
22 | VRNIHOST=$(echo "$SPEC" | jq -r '.hostname')
23 | if [[ ! "$VRNIHOST" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
24 | if [[ ! "$VRNIHOST" =~ [.] ]]; then
25 | VRNIHOST+=".$DOMAIN" #if not an IP or FQDN, append domain
26 | fi
27 | fi
28 | VRNIUSER=$(echo "$SPEC" | jq -r '.username')
29 | VRNIPASS=$(echo "$SPEC" | jq -r '.password')
30 | VRNIONLINE=$(echo "$SPEC" | jq -r '.online')
31 | VRNISESSION="${STATEDIR}/vrni.token.txt"
32 | VRNIBASE="https://${VRNIHOST}/api/ni/"
33 |
34 | function vrniLogin {
35 | local URL="https://${VRNIHOST}/api/ni/auth/token"
36 | read -r -d '' VRNIBODY <<-CONFIG
37 | {
38 | "username": "${VRNIUSER}",
39 | "password": "${VRNIPASS}",
40 | "domain": {
41 | "domain_type": "LOCAL"
42 | }
43 | }
44 | CONFIG
45 | #local RESPONSE=$(curl -k -w "%{http_code}" -X POST \
46 | local RESPONSE=$(curl -k -c "${STATEDIR}/vrni.cookies.txt" -D "${STATEDIR}/vrni.headers.txt" -w "%{http_code}" -X POST \
47 | -H 'Content-Type: application/json' \
48 | -H 'Accept: application/json' \
49 | -d "$VRNIBODY" \
50 | "${URL}" 2>/dev/null)
51 | local RESULT=$(isSuccess "${RESPONSE}")
52 | local CODE=$(getCode "${RESPONSE}")
53 | if [[ $CODE =~ 2..$ ]]; then
54 | local TOKEN=$(echo $RESULT | jq -r '.token')
55 | printf "%s\n" "${TOKEN}"
56 | fi
57 | }
58 |
59 | function vrniSession {
60 | local SESSION=$VRNISESSION
61 | local ONLINE=$VRNIONLINE
62 | if [[ "$ONLINE" == "true" ]]; then
63 | local RUNFIND="$(find ${SESSION} -mmin -10 2>/dev/null)"
64 | if [[ -z ${RUNFIND} ]]; then
65 | printf "No valid session found, authenticating... " 1>&2
66 | local LOGIN=$(vrniLogin)
67 | if [[ -n ${LOGIN} ]]; then
68 | echo "${LOGIN}" >"$SESSION"
69 | fi
70 | fi
71 | fi
72 | printf "%s\n" "$(cat "${SESSION}" 2>/dev/null)"
73 | }
74 |
75 | function vrniPost {
76 | local URL=${1}
77 | local BODY=${2}
78 | if [[ "$VRNIONLINE" == "true" ]]; then
79 | RESPONSE=$(curl -k -w "%{http_code}" -X POST \
80 | -H "Content-Type: application/json" \
81 | -H 'Accept: application/json' \
82 | -H "Authorization: NetworkInsight $(cat ${VRNISESSION})" \
83 | -d "$BODY" \
84 | "${URL}" 2>/dev/null)
85 | RESULT=$(isSuccess "${RESPONSE}")
86 | else
87 | printf "[$(ccyan "OFFLINE")] - SUCCESS\n" 1>&2
88 | fi
89 | printf "%s\n" "${RESULT}" | jq --tab .
90 | }
91 |
92 | function vrniGet {
93 | local URL=${1}
94 | local BASE=${VRNIBASE}
95 | local ONLINE="${VRNIONLINE}"
96 | local STATE
97 | if [[ "$ONLINE" == "true" ]]; then
98 | local SUCCESS=$(vrniSession)
99 | local FILE=$(getFile "${URL}" "${BASE}")
100 | STATE="${STATEDIR}/vrni${FILE}"
101 |
102 | ### DEBUG ###
103 | curl -k --trace-ascii /dev/stdout -b "${STATEDIR}/vrni.cookies.txt" -D "${STATEDIR}/vrni.headers.txt" -w "%{http_code}" -X GET \
104 | -H 'Accept: application/json' \
105 | -H 'Origin: https://field-demo.vrni.cmbu.local' \
106 | -H 'x-vrni-csrf-token: RW6X9sZkHvNM+rJLFlEpaQ==' \
107 | "${URL}" 1>&2
108 | ### DEBUG ###
109 | #-H "Authorization: NetworkInsight $(cat ${VRNISESSION})" \
110 |
111 | #RESPONSE=$(curl -k -w "%{http_code}" -X GET \
112 | # -H "Content-Type: application/json" \
113 | # -H 'Accept: application/json' \
114 | # -H 'Origin: https://field-demo.vrni.cmbu.local' \
115 | # -H 'x-vrni-csrf-token: RW6X9sZkHvNM+rJLFlEpaQ==' \
116 | # -H "Authorization: NetworkInsight $(cat ${VRNISESSION})" \
117 | #"${URL}" 2>/dev/null)
118 | #RESULT=$(isSuccess "${RESPONSE}")
119 | else
120 | printf "[$(ccyan "OFFLINE")] - SUCCESS\n" 1>&2
121 | RESULT=$(cat "${URL}")
122 | STATE="${URL}"
123 | fi
124 | #printf "%s\n" "${RESULT}" | jq --tab . >"${STATE}"
125 | printf "%s\n" "${RESULT}" | jq --tab .
126 | }
127 |
128 | function buildURL {
129 | local ENDPOINT="${1}"
130 | local BASE="${VRNIBASE}"
131 | local STATE="${STATEDIR}"
132 | local ONLINE="${VRNIONLINE}"
133 | if [[ "$ONLINE" == "true" ]]; then
134 | local SUCCESS=$(vrniSession)
135 | if [[ -n ${SUCCESS} ]]; then
136 | URL="$BASE$ENDPOINT"
137 | else
138 | URL="" #failed to obtain valid session
139 | fi
140 | else
141 | local FILE=$(getFile "${ENDPOINT}")
142 | URL="${STATE}/vrni${FILE}"
143 | fi
144 | printf "$URL"
145 | }
146 |
--------------------------------------------------------------------------------
/lib/drv/login-notes.txt:
--------------------------------------------------------------------------------
1 | {
2 | "status": true,
3 | "statusCode": {
4 | "code": 0,
5 | "codeStr": "OK"
6 | },
7 | "responseMessage": "Logged In",
8 | "displayName": "demouser@cmbu.local",
9 | "serverTimestamp": 1576037347717,
10 | "csrfToken": "D660/Qkd5ZTgZlT+eSSKMg==",
11 | "redirectUrl": null
12 | }
13 |
14 |
--------------------------------------------------------------------------------
/lib/drv/login.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | curl -k -X POST \
4 | -c "vrni.cookies.txt" \
5 | https://field-demo.vrni.cmbu.local/api/auth/login \
6 | -H 'accept: application/json, text/javascript, */*; q=0.01' \
7 | -H 'cache-control: no-cache' \
8 | -H 'content-type: application/json' \
9 | -H 'dnt: 1' \
10 | -H 'origin: https://field-demo.vrni.cmbu.local' \
11 | -H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36' \
12 | -H 'x-requested-with: XMLHttpRequest' \
13 | -H 'x-vrni-csrf-token: RW6X9sZkHvNM+rJLFlEpaQ==' \
14 | -d '{"username":"demouser@cmbu.local","password":"demoVMware1!","tenantName":"field-demo.vrni.cmbu.local","vIDMURL":"","redirectURL":"","authenticationDomains":{"0":{"domainType":"LDAP","domain":"vmware.com","redirectUrl":""},"1":{"domainType":"LOCAL_DOMAIN","domain":"localdomain","redirectUrl":""}},"currentDomain":1,"domain":"localdomain","nDomains":2,"serverTimestamp":false,"loginFieldPlaceHolder":"Username"}'
15 |
16 | #{"username":"demouser@cmbu.local","password":"demoVMware1!","tenantName":"field-demo.vrni.cmbu.local","vIDMURL":"","redirectURL":"","authenticationDomains":{"0":{"domainType":"LDAP","domain":"vmware.com","redirectUrl":""},"1":{"domainType":"LOCAL_DOMAIN","domain":"localdomain","redirectUrl":""}},"currentDomain":1,"domain":"localdomain","nDomains":2,"serverTimestamp":false,"loginFieldPlaceHolder":"Username"}
17 |
--------------------------------------------------------------------------------
/lib/drv/mod.core:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | # detect and resolve symlink
3 | if [[ -L $0 ]]; then
4 | if [[ $(readlink $0) =~ ^(.*)/([^/]+)$ ]]; then
5 | WORKDIR="${BASH_REMATCH[1]}"
6 | CALLED="${BASH_REMATCH[2]}"
7 | fi
8 | else
9 | if [[ $0 =~ ^(.*)/([^/]+)$ ]]; then
10 | WORKDIR="${BASH_REMATCH[1]}"
11 | CALLED="${BASH_REMATCH[2]}"
12 | fi
13 | fi
14 | if [ -z ${STATEDIR} ]; then
15 | STATEDIR="${WORKDIR}/state"
16 | fi
17 | #printf "0 ${0} state ${STATEDIR}\n" 1>&2
18 | if [ ! -d ${STATEDIR} ]; then
19 | mkdir ${STATEDIR}
20 | fi
21 |
22 | # detect available cmds
23 | commands() {
24 | #echo "-- [COMMANDS] --"
25 | printf "%s" "list"
26 | for FILE in ${WORKDIR}/cmd.*.sh; do
27 | if [[ $FILE =~ cmd[.](.+)[.]sh ]]; then
28 | printf " %s" "${BASH_REMATCH[1]}"
29 | fi
30 | done
31 | exit 1
32 | }
33 | if [[ -n "$1" && ${CALLED} == "mod.core" ]]; then
34 | case "${1}" in
35 | list) ## list commands
36 | commands
37 | ;;
38 | setup-params) ## output sddc.parameters
39 | cat ${WORKDIR}/sddc.parameters
40 | ;;
41 | setup-bash) ## output bash-cli
42 | cat ${WORKDIR}/bash-cli
43 | ;;
44 | *) ## execute command
45 | if [ -f "${WORKDIR}/cmd.${1}.sh" ]; then
46 | eval "${WORKDIR}/cmd.${1}.sh ${2} ${3} ${4}"
47 | fi
48 | ;;
49 | esac
50 | fi
51 |
52 | # get OSNAME
53 | OSNAME="$(uname -s)"
54 | case "${OSNAME}" in
55 | Linux*)
56 | #printf "HAHA you run a L:${OSNAME}\n" 1>&2
57 | ;;
58 | Darwin*)
59 | #printf "HAHA you run a D:${OSNAME}\n" 1>&2
60 | ;;
61 | esac
62 |
63 | # COLOURS
64 | #RED=$'\e[31;1m'
65 | #CYAN=$'\e[36;1m'
66 | #GREEN='\e[32;1m' # light green
67 | #ORANGE=$'\e[33;1m' # orange
68 | #BLUE=$'\e[34;1m' # light blue
69 | #NC=$'\e[31;00m'
70 |
71 | #NC='\033[0;00m' # no colour
72 | BLACK='\033[0;30m' # black
73 | RED='\033[0;31m' # red
74 | #GREEN='\033[0;32m' # orange
75 | #ORANGE='\033[0;33m' # orange
76 | BLUE='\033[0;34m' # blue
77 | PURPLE='\033[0;35m' # purple
78 | #CYAN='\033[0;36m' # cyan
79 |
80 | NC='\e[0;00m' # no colour
81 | GREEN='\e[0;32m' # orange
82 | ORANGE='\e[0;33m' # orange
83 | CYAN='\e[0;36m' # cyan
84 | #LIGHTGREY='\033[0;37m' # light grey
85 | #DARKGREY='\033[0;30m' # dark grey
86 | #LIGHTRED='\033[0;31m' # light red
87 | #LIGHTGREEN='\033[0;32m' # light green
88 | #YELLOW='\033[0;33m' # yellow
89 | #LIGHTBLUE='\033[0;34m' # light blue
90 | #LBLUE='\033[33;1m' ## test
91 | #WHITE='\033[0;37m' # white
92 |
93 | function corange {
94 | local STRING=${1}
95 | printf '%s' "${ORANGE}${STRING}${NC}"
96 | }
97 | function cgreen {
98 | local STRING=${1}
99 | printf '%s' "${GREEN}${STRING}${NC}"
100 | }
101 | function ccyan {
102 | local STRING=${1}
103 | printf '%s' "${CYAN}${STRING}${NC}"
104 | }
105 |
106 | function isSuccess {
107 | local STRING=${1}
108 | local SESSION=${2}
109 | local CODE=$(getCode "${STRING}")
110 | local VALID
111 | printf "[$(ccyan "${CODE}")] - " 1>&2
112 | case $CODE in
113 | 2[0-9][0-9])
114 | printf "SUCCESS\n" 1>&2
115 | VALID="1"
116 | ;;
117 | 400)
118 | printf "ERROR\n" 1>&2
119 | ;;
120 | 40[1-3])
121 | printf "ERROR-AUTH\n" 1>&2
122 | ;;
123 | 404)
124 | printf "ERROR-NOTFOUND\n" 1>&2
125 | ;;
126 | *)
127 | printf "ERROR\n" 1>&2
128 | ;;
129 | esac
130 | if [[ -z "${VALID}" && -f "${SESSION}" ]]; then
131 | rm "${SESSION}" 2>/dev/null
132 | fi
133 | local BODY=$(getBody "${STRING}")
134 | printf "%s\n" "${BODY}"
135 | }
136 |
137 | function getCode {
138 | local STRING=${1}
139 | if [[ $STRING =~ ^(.*)([0-9]{3})$ ]]; then
140 | local BODY=${BASH_REMATCH[1]}
141 | local CODE=${BASH_REMATCH[2]}
142 | fi
143 | printf "%s\n" "${CODE}"
144 | }
145 |
146 | function getBody {
147 | local STRING=${1}
148 | if [[ $STRING =~ ^(.*)([0-9]{3})$ ]]; then
149 | local BODY=${BASH_REMATCH[1]}
150 | local CODE=${BASH_REMATCH[2]}
151 | fi
152 | printf "%s\n" "${BODY}"
153 | }
154 |
155 | function getFile {
156 | local ENDPOINT=${1}
157 | local BASE=${2}
158 | local STATE
159 | if [[ -n $BASE ]]; then
160 | REGEX="^($BASE)"
161 | if [[ $ENDPOINT =~ $REGEX ]]; then
162 | ENDPOINT=${ENDPOINT#*"${BASH_REMATCH[1]}"}
163 | fi
164 | fi
165 | while [[ $ENDPOINT =~ ([^/]+) ]]; do
166 | ENDPOINT=${ENDPOINT#*"${BASH_REMATCH[1]}"}
167 | STATE+=".${BASH_REMATCH[1]}"
168 | done
169 | STATE+=".json"
170 | printf "%s" "${STATE}"
171 | }
172 |
173 | function getThumbprint {
174 | local HOST="${1}"
175 | local PAYLOAD=$(echo -n | openssl s_client -connect "${HOST}" 2>/dev/null)
176 | local PRINT=$(echo "$PAYLOAD" | openssl x509 -noout -fingerprint -sha256)
177 | local REGEX='^(.*)=(([0-9A-Fa-f]{2}[:])+([0-9A-Fa-f]{2}))$'
178 | if [[ $PRINT =~ $REGEX ]]; then
179 | local TYPE=${BASH_REMATCH[1]}
180 | local CODE=${BASH_REMATCH[2]}
181 | fi
182 | printf "%s\n" "${CODE}" | sed "s/\(.*\)/\L\1/g" | sed "s/://g"
183 | }
184 |
185 | function getCertificate {
186 | local HOST="${1}"
187 | local PAYLOAD=$(echo -n | openssl s_client -connect "${HOST}" 2>/dev/null)
188 | local RESULT=$(echo "${PAYLOAD}" | sed -e '1h;2,$H;$!d;g' -e 's/.*\(-----BEGIN\sCERTIFICATE-----.*-----END\sCERTIFICATE-----\).*/\1/g')
189 | printf "%s\n" "$RESULT" | sed ':a;N;$!ba;s/\n/\\\\n/g'
190 | }
191 |
192 | function buildTable {
193 | local INPUT="${1}" # change first entry to color, separate from data body
194 | read -r -d '' JQTABLE <<-CONFIG
195 | if (.[0]?) then
196 | [(
197 | [.[0] | to_entries[] | "<" + .key + ">"]
198 | ),(
199 | .[] | [to_entries[] | .value]
200 | )]
201 | else . end
202 | CONFIG
203 | local HEADER="1"
204 | echo "$INPUT" | jq -r "$JQTABLE | .[] | @tsv" | column -t -s $'\t' | while read -r LINE; do
205 | if [[ -n $HEADER ]]; then
206 | printf "${CYAN}${LINE}${NC}\n"
207 | HEADER=""
208 | else
209 | printf "$LINE\n";
210 | fi
211 | done
212 | }
213 |
214 | function buildTest {
215 | local INPUT="${1}" # change first entry to color, separate from data body
216 | read -r -d '' JQTABLE <<-CONFIG
217 | if (.[0]?) then
218 | [(
219 | [.[0] | to_entries[] | "${BLUE}<" + .key + ">${NC}"]
220 | ),(
221 | .[] | [to_entries[] | "${NC}" + .value + "${NC}"]
222 | )]
223 | else . end
224 | CONFIG
225 | BODY=$(echo "$INPUT" | jq -r "$JQTABLE | .[] | @tsv" | column -t -s $'\t')
226 | printf "${BODY}\n"
227 | }
228 |
229 | function buildNoColour {
230 | local INPUT="${1}" # change first entry to color, separate from data body
231 | read -r -d '' JQTABLE <<-CONFIG
232 | if (.[0]?) then
233 | [(
234 | [.[0] | to_entries[] | "<" + .key + ">"]
235 | ),(
236 | .[] | [to_entries[] | .value]
237 | )]
238 | else . end
239 | CONFIG
240 | BODY=$(echo "$INPUT" | jq -r "$JQTABLE | .[] | @tsv" | column -t -s $'\t')
241 | printf "${BODY}\n"
242 | }
243 |
244 | ## filter payload with string
245 | function filter {
246 | local PAYLOAD=${1}
247 | local STRING=${2}
248 | while [[ $STRING =~ ([^,]+) ]]; do
249 | local FILTER="${BASH_REMATCH[1]}"
250 | STRING=${STRING#*"${BASH_REMATCH[1]}"}
251 | local FIELD="name"
252 | local VALUE="."
253 | if [[ $FILTER =~ ([^:]+):([^:]*) ]]; then
254 | FIELD=${BASH_REMATCH[1]}
255 | VALUE=${BASH_REMATCH[2]}
256 | else
257 | VALUE="${FILTER}"
258 | fi
259 | read -r -d '' FILTERSPEC <<-CONFIG
260 | map(select(
261 | ."$FIELD" |
262 | if (. != null) then (. | tostring) else "" end
263 | | test("$VALUE";"i")
264 | ))
265 | CONFIG
266 | PAYLOAD=$(echo "$PAYLOAD" | jq -r "$FILTERSPEC")
267 | done
268 | printf "%s\n" "${PAYLOAD}" | jq --tab .
269 | }
270 |
271 | ## set current context
272 | function setContext {
273 | local INPUT="${1}"
274 | local ITEM="${2}"
275 | local STATE="${STATEDIR}/ctx.${ITEM}.json"
276 | local PAYLOAD=$(echo "$INPUT" | jq --tab '.[0]')
277 | if [[ -n "${PAYLOAD}" && "${PAYLOAD}" != null ]]; then
278 | printf "%s\n" "${PAYLOAD}" >"${STATE}"
279 | fi
280 | }
281 |
282 | ## get current context
283 | function getContext {
284 | local FILTER="${1}"
285 | if [[ -z $FILTER ]]; then
286 | FILTER="."
287 | fi
288 | echo "FILTER: ${FILTER}" 1>&2
289 | local PAYLOAD=$("${WORKDIR}"/cmd.context.list.sh "${FILTER}" json | jq '.[0]')
290 | if [[ ! "$PAYLOAD" == null ]]; then
291 | printf "%s\n" "${PAYLOAD}" | jq -r '.id'
292 | fi
293 | }
294 |
--------------------------------------------------------------------------------
/lib/drv/object.type.txt:
--------------------------------------------------------------------------------
1 |
2 | # list all object types
3 | https://field-demo.vrni.cmbu.local/api/model/objectTypes?=
4 |
5 | # get fields of object
6 |
7 |
--------------------------------------------------------------------------------
/lib/drv/read.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | TOKEN=$(cat vrni.token.txt)
4 | #curl -k --trace-ascii /dev/stdout -X GET \
5 | curl -k -X GET \
6 | -b "vrni.cookies.txt" \
7 | 'https://field-demo.vrni.cmbu.local/api/model/properties?objectType=1' \
8 | -H 'accept: application/json, text/javascript, */*; q=0.01' \
9 | -H 'cache-control: no-cache' \
10 | -H 'dnt: 1' \
11 | -H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36' \
12 | -H 'x-requested-with: XMLHttpRequest' \
13 | -H "x-vrni-csrf-token: $TOKEN"
14 |
--------------------------------------------------------------------------------
/lib/drv/sddc.parameters:
--------------------------------------------------------------------------------
1 | {
2 | "dns": "172.16.0.1",
3 | "domain": "lab",
4 | "endpoints": [
5 | {
6 | "type": "vrni",
7 | "hostname": "demo.vrni.local",
8 | "username": "demo",
9 | "password": "demo",
10 | "online": "true"
11 | }
12 | ]
13 | }
14 |
--------------------------------------------------------------------------------
/lib/drv/search.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | #https://field-demo.vrni.cmbu.local/api/search/query?searchString=memory%2Ccpu+of+host×tamp=1576021141486&timeRangeString=+at+Now+&includeObjects=false&includeFacets=true&includeMetrics=false&includeEvents=false&startIndex=0&maxItemCount=10&dateTimeZone=%2B11%3A00&sourceString=USER&includeModelKeyOnly=false
4 |
5 | https://field-demo.vrni.cmbu.local/api/search/query?
6 | searchString=memory%2Ccpu+of+host
7 |
--------------------------------------------------------------------------------
/lib/drv/test.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | curl -k -X GET \
4 | 'https://field-demo.vrni.cmbu.local/api/auth/user?userEmail=demouser%40cmbu.local' \
5 | -H 'accept: application/json, text/javascript, */*; q=0.01' \
6 | -H 'cache-control: no-cache' \
7 | -H 'dnt: 1' \
8 | -H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36' \
9 | -H 'x-requested-with: XMLHttpRequest' \
10 | -H 'x-vrni-csrf-token: 35ABiqMI7WEnwZ3NZRhf0A=='
11 |
--------------------------------------------------------------------------------
/lib/drv/vmvm/vm-vm-model.txt:
--------------------------------------------------------------------------------
1 | https://field-demo.vrni.cmbu.local/api/config/graph?graphLevel=L2_UNDERLAY_OVERLAY&graphType=VM_TO_VM_TOPOLOGY2&listOfObjects=10000%3A1%3A1748993961&listOfObjects=10000%3A1%3A1748994023&includeUnderlay=true&time=1576031880876
2 |
--------------------------------------------------------------------------------
/lib/drv/vrni.cookies.txt:
--------------------------------------------------------------------------------
1 | # Netscape HTTP Cookie File
2 | # https://curl.haxx.se/docs/http-cookies.html
3 | # This file was generated by libcurl! Edit at your own risk.
4 |
5 | field-demo.vrni.cmbu.local FALSE / FALSE 1576037869 rememberMe deleteMe
6 | #HttpOnly_field-demo.vrni.cmbu.local FALSE / TRUE 0 VRNI-JSESSIONID 506c7b3c-32a0-4678-9114-6ef668b8be40
7 |
--------------------------------------------------------------------------------
/lib/drv/vrni.token.txt:
--------------------------------------------------------------------------------
1 | YG83vYDhv5rPEfL+wDgOrQ==
2 |
--------------------------------------------------------------------------------
/lib/mod.command:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/([^/]+)$ ]]; then ## offload to mod.header
3 | WORKDIR=${BASH_REMATCH[1]}
4 | FILE=${BASH_REMATCH[2]}
5 | if [[ ${FILE} =~ ^[^.]+[.](.+)[.]sh$ ]]; then
6 | TYPE=${BASH_REMATCH[1]}
7 | fi
8 | fi
9 | STATEDIR=${WORKDIR}/drv/state
10 | source ${WORKDIR}/drv/mod.core
11 |
12 | # build filter
13 | function cmd {
14 | local COMMAND=${1}
15 | case "${COMMAND}" in
16 | watch)
17 | watch -t -c -n 3 "${WORKDIR}/${FILE} 2>/dev/null"
18 | ;;
19 | json)
20 | local PAYLOAD=$(payload)
21 | setContext "${PAYLOAD}" "${TYPE}"
22 | echo "${PAYLOAD}" | jq --tab .
23 | ;;
24 | filter)
25 | local FILTER=${2}
26 | local PAYLOAD=$(filter "$(payload)" "${FILTER}")
27 | setContext "${PAYLOAD}" "${TYPE}"
28 | buildTable "${PAYLOAD}"
29 | ;;
30 | *)
31 | local PAYLOAD=$(payload)
32 | setContext "${PAYLOAD}" "${TYPE}"
33 | buildTable "${PAYLOAD}"
34 | ;;
35 | esac
36 | }
37 |
38 | function payload {
39 | local INPUT=$(eval $(drv "${TYPE}")) # link to drv
40 | local PAYLOAD=$(echo "${INPUT}" | jq -r "$(run)")
41 | printf "${PAYLOAD}"
42 | }
43 |
44 | function drv {
45 | local DRIVER=${1}
46 | printf "${WORKDIR}/drv/drv.${DRIVER}.sh"
47 | }
48 |
--------------------------------------------------------------------------------
/lib/sddc.parameters:
--------------------------------------------------------------------------------
1 | {
2 | "dns": "172.16.0.1",
3 | "domain": "lab",
4 | "endpoints": [
5 | {
6 | "type": "vrni",
7 | "hostname": "demo.vrni.local",
8 | "username": "demo",
9 | "password": "demo",
10 | "online": "true"
11 | }
12 | ]
13 | }
14 |
--------------------------------------------------------------------------------
/lib/test/cmd.data.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/([^/]+)$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | fi
5 | source ${WORKDIR}/mod.command
6 |
7 | function run {
8 | printf '%s' "$(/dev/null)
10 |
11 | printf "${RESULT}" | jq --tab .
12 |
--------------------------------------------------------------------------------
/lib/test/drv.model.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | fi
5 | source ${WORKDIR}/drv.vrni.client
6 |
7 | if [[ -n "${VRNIHOST}" ]]; then
8 | ITEM="search/query"
9 | URL=$(buildURL "${ITEM}")
10 | #if [[ -n "${CALL}" ]]; then
11 | # URL+="/${CALL}"
12 | #else
13 | #URL+="?size=10"
14 | URL="https://field-demo.vrni.cmbu.local/api/model/properties?objectType=1"
15 | #URL+='?searchString=memory%2Ccpu+of+host'
16 | #fi
17 | #if [[ -n "${URL}" ]]; then
18 | printf "%s" "[INFO]: nsx [list] ${ITEM} [${URL}]... " 1>&2
19 | #printf "%s" "[$(cgreen "INFO")]: nsx [$(cgreen "list")] ${ITEM} [$(cgreen "$URL")]... " 1>&2
20 | #printf '%s\n' "${URL}"
21 | vrniGet "${URL}"
22 | #fi
23 | fi
24 |
--------------------------------------------------------------------------------
/lib/test/drv.search.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | urlencode() {
4 | # urlencode
5 | old_lc_collate=$LC_COLLATE
6 | LC_COLLATE=C
7 | local length="${#1}"
8 | for (( i = 0; i < length; i++ )); do
9 | local c="${1:i:1}"
10 | case $c in
11 | [a-zA-Z0-9.~_-]) printf "$c" ;;
12 | *) printf '%%%02X' "'$c" ;;
13 | esac
14 | done
15 | LC_COLLATE=$old_lc_collate
16 | }
17 |
18 | urldecode() {
19 | # urldecode
20 | local url_encoded="${1//+/ }"
21 | printf '%b' "${url_encoded//%/\\x}"
22 | }
23 |
24 | SEARCH=${1}
25 | STATEDIR="./drv"
26 | TOKEN=$(<${STATEDIR}/vrni.token.txt)
27 | QUERY=$(urlencode "${SEARCH}")
28 | #searchString=hosts+where+VM+Count+%3E+10
29 | RESULT=$(curl -k -b "${STATEDIR}/vrni.cookies.txt" -X GET \
30 | -H 'accept: application/json' \
31 | -H "x-vrni-csrf-token: $TOKEN" \
32 | "https://field-demo.vrni.cmbu.local/api/search/query?searchString=${QUERY}&includeObjects=false&includeModelKeyOnly=false&startIndex=0&maxItemCount=10" \
33 | 2>/dev/null)
34 |
35 | read -r -d '' SPEC <<-CONFIG
36 | .resultList | if (. != null) then {
37 | "requests": map(
38 | .searchContext | {
39 | "modelKey": .modelKey
40 | })
41 | } else "" end
42 | CONFIG
43 |
44 | printf '%s' "${RESULT}" | jq --tab "${SPEC}" >${STATEDIR}/result.json
45 |
46 | ./drv/drv.objects.list.sh
47 |
48 | #'https://field-demo.vrni.cmbu.local/api/search/query?searchString=host&includeObjects=false&includeFacets=true&includeMetrics=false&includeEvents=false&includeModelKeyOnly=false&startIndex=0&maxItemCount=10'
49 | #'https://field-demo.vrni.cmbu.local/api/search/query?searchString=host&includeObjects=true&includeModelKeyOnly=false'
50 |
51 | #printf '%s' "${RESULT}" | jq --tab .
52 |
--------------------------------------------------------------------------------
/lib/test/drv.vrni.client:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [ -z ${WORKDIR} ]; then
3 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
4 | WORKDIR=${BASH_REMATCH[1]}
5 | fi
6 | if [[ $0 == "bash" ]]; then
7 | WORKDIR="."
8 | fi
9 | fi
10 | if [ -z ${SDDCDIR} ]; then
11 | SDDCDIR=${WORKDIR}
12 | fi
13 | STATEDIR="${WORKDIR}/state"
14 | if [ ! -d ${STATEDIR} ]; then
15 | mkdir ${STATEDIR}
16 | fi
17 | source ${WORKDIR}/mod.core
18 |
19 | PARAMS=$(cat ${SDDCDIR}/sddc.parameters)
20 | DOMAIN=$(echo "${PARAMS}" | jq -r '.domain')
21 | SPEC=$(echo "${PARAMS}" | jq -r '.endpoints[] | select(.type=="vrni")')
22 | VRNIHOST=$(echo "$SPEC" | jq -r '.hostname')
23 | if [[ ! "$VRNIHOST" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
24 | if [[ ! "$VRNIHOST" =~ [.] ]]; then
25 | VRNIHOST+=".$DOMAIN" #if not an IP or FQDN, append domain
26 | fi
27 | fi
28 | VRNIUSER=$(echo "$SPEC" | jq -r '.username')
29 | VRNIPASS=$(echo "$SPEC" | jq -r '.password')
30 | VRNIONLINE=$(echo "$SPEC" | jq -r '.online')
31 | VRNISESSION="${STATEDIR}/vrni.token.txt"
32 | VRNIBASE="https://${VRNIHOST}/api/ni/"
33 |
34 | function vrniLogin {
35 | local URL="https://${VRNIHOST}/api/ni/auth/token"
36 | read -r -d '' VRNIBODY <<-CONFIG
37 | {
38 | "username": "${VRNIUSER}",
39 | "password": "${VRNIPASS}",
40 | "domain": {
41 | "domain_type": "LOCAL"
42 | }
43 | }
44 | CONFIG
45 | #local RESPONSE=$(curl -k -w "%{http_code}" -X POST \
46 | local RESPONSE=$(curl -k -c "${STATEDIR}/vrni.cookies.txt" -D "${STATEDIR}/vrni.headers.txt" -w "%{http_code}" -X POST \
47 | -H 'Content-Type: application/json' \
48 | -H 'Accept: application/json' \
49 | -d "$VRNIBODY" \
50 | "${URL}" 2>/dev/null)
51 | local RESULT=$(isSuccess "${RESPONSE}")
52 | local CODE=$(getCode "${RESPONSE}")
53 | if [[ $CODE =~ 2..$ ]]; then
54 | local TOKEN=$(echo $RESULT | jq -r '.token')
55 | printf "%s\n" "${TOKEN}"
56 | fi
57 | }
58 |
59 | function vrniSession {
60 | local SESSION=$VRNISESSION
61 | local ONLINE=$VRNIONLINE
62 | if [[ "$ONLINE" == "true" ]]; then
63 | local RUNFIND="$(find ${SESSION} -mmin -10 2>/dev/null)"
64 | if [[ -z ${RUNFIND} ]]; then
65 | printf "No valid session found, authenticating... " 1>&2
66 | local LOGIN=$(vrniLogin)
67 | if [[ -n ${LOGIN} ]]; then
68 | echo "${LOGIN}" >"$SESSION"
69 | fi
70 | fi
71 | fi
72 | printf "%s\n" "$(cat "${SESSION}" 2>/dev/null)"
73 | }
74 |
75 | function vrniPost {
76 | local URL=${1}
77 | local BODY=${2}
78 | if [[ "$VRNIONLINE" == "true" ]]; then
79 | RESPONSE=$(curl -k -w "%{http_code}" -X POST \
80 | -H "Content-Type: application/json" \
81 | -H 'Accept: application/json' \
82 | -H "Authorization: NetworkInsight $(cat ${VRNISESSION})" \
83 | -d "$BODY" \
84 | "${URL}" 2>/dev/null)
85 | RESULT=$(isSuccess "${RESPONSE}")
86 | else
87 | printf "[$(ccyan "OFFLINE")] - SUCCESS\n" 1>&2
88 | fi
89 | printf "%s\n" "${RESULT}" | jq --tab .
90 | }
91 |
92 | function vrniGet {
93 | local URL=${1}
94 | local BASE=${VRNIBASE}
95 | local ONLINE="${VRNIONLINE}"
96 | local STATE
97 | if [[ "$ONLINE" == "true" ]]; then
98 | local SUCCESS=$(vrniSession)
99 | local FILE=$(getFile "${URL}" "${BASE}")
100 | STATE="${STATEDIR}/vrni${FILE}"
101 |
102 | ### DEBUG ###
103 | curl -k --trace-ascii /dev/stdout -b "${STATEDIR}/vrni.cookies.txt" -D "${STATEDIR}/vrni.headers.txt" -w "%{http_code}" -X GET \
104 | -H 'Accept: application/json' \
105 | -H 'Origin: https://field-demo.vrni.cmbu.local' \
106 | -H 'x-vrni-csrf-token: RW6X9sZkHvNM+rJLFlEpaQ==' \
107 | "${URL}" 1>&2
108 | ### DEBUG ###
109 | #-H "Authorization: NetworkInsight $(cat ${VRNISESSION})" \
110 |
111 | #RESPONSE=$(curl -k -w "%{http_code}" -X GET \
112 | # -H "Content-Type: application/json" \
113 | # -H 'Accept: application/json' \
114 | # -H 'Origin: https://field-demo.vrni.cmbu.local' \
115 | # -H 'x-vrni-csrf-token: RW6X9sZkHvNM+rJLFlEpaQ==' \
116 | # -H "Authorization: NetworkInsight $(cat ${VRNISESSION})" \
117 | #"${URL}" 2>/dev/null)
118 | #RESULT=$(isSuccess "${RESPONSE}")
119 | else
120 | printf "[$(ccyan "OFFLINE")] - SUCCESS\n" 1>&2
121 | RESULT=$(cat "${URL}")
122 | STATE="${URL}"
123 | fi
124 | #printf "%s\n" "${RESULT}" | jq --tab . >"${STATE}"
125 | printf "%s\n" "${RESULT}" | jq --tab .
126 | }
127 |
128 | function buildURL {
129 | local ENDPOINT="${1}"
130 | local BASE="${VRNIBASE}"
131 | local STATE="${STATEDIR}"
132 | local ONLINE="${VRNIONLINE}"
133 | if [[ "$ONLINE" == "true" ]]; then
134 | local SUCCESS=$(vrniSession)
135 | if [[ -n ${SUCCESS} ]]; then
136 | URL="$BASE$ENDPOINT"
137 | else
138 | URL="" #failed to obtain valid session
139 | fi
140 | else
141 | local FILE=$(getFile "${ENDPOINT}")
142 | URL="${STATE}/vrni${FILE}"
143 | fi
144 | printf "$URL"
145 | }
146 |
--------------------------------------------------------------------------------
/lib/test/drv/data.json:
--------------------------------------------------------------------------------
1 | {
2 | "resultList": [
3 | {
4 | "modelKey": "10000:515:1018548286",
5 | "metricsMap": {
6 | "flow.totalBytes.delta.summation.bytes.300": {
7 | "timestamp": [
8 | 1576099200000,
9 | 1576099500000,
10 | 1576099800000,
11 | 1576100100000,
12 | 1576100400000,
13 | 1576100700000,
14 | 1576101000000,
15 | 1576101300000,
16 | 1576101600000,
17 | 1576101900000,
18 | 1576102200000,
19 | 1576102500000,
20 | 1576102800000,
21 | 1576103100000,
22 | 1576103400000,
23 | 1576103700000,
24 | 1576104000000,
25 | 1576104300000,
26 | 1576104600000,
27 | 1576104900000,
28 | 1576105200000,
29 | 1576105500000,
30 | 1576105800000,
31 | 1576106100000,
32 | 1576106400000,
33 | 1576106700000,
34 | 1576107000000,
35 | 1576107300000,
36 | 1576107600000,
37 | 1576107900000,
38 | 1576108200000,
39 | 1576108500000,
40 | 1576108800000,
41 | 1576109100000,
42 | 1576109400000,
43 | 1576109700000,
44 | 1576110000000,
45 | 1576110300000,
46 | 1576110600000,
47 | 1576110900000,
48 | 1576111200000,
49 | 1576111500000,
50 | 1576111800000,
51 | 1576112100000,
52 | 1576112400000,
53 | 1576112700000,
54 | 1576113000000,
55 | 1576113300000,
56 | 1576113600000,
57 | 1576113900000,
58 | 1576114200000,
59 | 1576114500000,
60 | 1576114800000,
61 | 1576115100000,
62 | 1576115400000,
63 | 1576115700000,
64 | 1576116000000,
65 | 1576116300000,
66 | 1576116600000,
67 | 1576116900000,
68 | 1576117200000,
69 | 1576117500000,
70 | 1576117800000,
71 | 1576118100000,
72 | 1576118400000,
73 | 1576118700000,
74 | 1576119000000,
75 | 1576119300000,
76 | 1576119600000,
77 | 1576119900000,
78 | 1576120200000,
79 | 1576120500000,
80 | 1576120800000,
81 | 1576121100000,
82 | 1576121400000,
83 | 1576121700000,
84 | 1576122000000,
85 | 1576122300000,
86 | 1576122600000,
87 | 1576122900000,
88 | 1576123200000,
89 | 1576123500000,
90 | 1576123800000,
91 | 1576124100000,
92 | 1576124400000,
93 | 1576124700000,
94 | 1576125000000,
95 | 1576125300000,
96 | 1576125600000,
97 | 1576125900000,
98 | 1576126200000,
99 | 1576126500000,
100 | 1576126800000,
101 | 1576127100000,
102 | 1576127400000,
103 | 1576127700000,
104 | 1576128000000,
105 | 1576128300000,
106 | 1576128600000,
107 | 1576128900000,
108 | 1576129200000,
109 | 1576129500000,
110 | 1576129800000,
111 | 1576130100000,
112 | 1576130400000,
113 | 1576130700000,
114 | 1576131000000,
115 | 1576131300000,
116 | 1576131600000,
117 | 1576131900000,
118 | 1576132200000,
119 | 1576132500000,
120 | 1576132800000,
121 | 1576133100000,
122 | 1576133400000,
123 | 1576133700000,
124 | 1576134000000,
125 | 1576134300000,
126 | 1576134600000,
127 | 1576134900000,
128 | 1576135200000,
129 | 1576135500000,
130 | 1576135800000,
131 | 1576136100000,
132 | 1576136400000,
133 | 1576136700000,
134 | 1576137000000,
135 | 1576137300000,
136 | 1576137600000,
137 | 1576137900000,
138 | 1576138200000,
139 | 1576138500000,
140 | 1576138800000,
141 | 1576139100000,
142 | 1576139400000,
143 | 1576139700000,
144 | 1576140000000,
145 | 1576140300000,
146 | 1576140600000,
147 | 1576140900000,
148 | 1576141200000,
149 | 1576141500000,
150 | 1576141800000,
151 | 1576142100000,
152 | 1576142400000,
153 | 1576142700000,
154 | 1576143000000,
155 | 1576143300000,
156 | 1576143600000,
157 | 1576143900000,
158 | 1576144200000,
159 | 1576144500000,
160 | 1576144800000,
161 | 1576145100000,
162 | 1576145400000,
163 | 1576145700000,
164 | 1576146000000,
165 | 1576146300000,
166 | 1576146600000,
167 | 1576146900000,
168 | 1576147200000,
169 | 1576147500000,
170 | 1576147800000,
171 | 1576148100000,
172 | 1576148400000,
173 | 1576148700000,
174 | 1576149000000,
175 | 1576149300000,
176 | 1576149600000,
177 | 1576149900000,
178 | 1576150200000,
179 | 1576150500000,
180 | 1576150800000,
181 | 1576151100000,
182 | 1576151400000,
183 | 1576151700000,
184 | 1576152000000,
185 | 1576152300000,
186 | 1576152600000,
187 | 1576152900000,
188 | 1576153200000,
189 | 1576153500000,
190 | 1576153800000,
191 | 1576154100000,
192 | 1576154400000,
193 | 1576154700000,
194 | 1576155000000,
195 | 1576155300000,
196 | 1576155600000,
197 | 1576155900000,
198 | 1576156200000,
199 | 1576156500000,
200 | 1576156800000,
201 | 1576157100000,
202 | 1576157400000,
203 | 1576157700000,
204 | 1576158000000,
205 | 1576158300000,
206 | 1576158600000,
207 | 1576158900000,
208 | 1576159200000,
209 | 1576159500000,
210 | 1576159800000,
211 | 1576160100000,
212 | 1576160400000,
213 | 1576160700000,
214 | 1576161000000,
215 | 1576161300000,
216 | 1576161600000,
217 | 1576161900000,
218 | 1576162200000,
219 | 1576162500000,
220 | 1576162800000,
221 | 1576163100000,
222 | 1576163400000,
223 | 1576163700000,
224 | 1576164000000,
225 | 1576164300000,
226 | 1576164600000,
227 | 1576164900000,
228 | 1576165200000,
229 | 1576165500000,
230 | 1576165800000,
231 | 1576166100000,
232 | 1576166400000,
233 | 1576166700000,
234 | 1576167000000,
235 | 1576167300000,
236 | 1576167600000,
237 | 1576167900000,
238 | 1576168200000,
239 | 1576168500000,
240 | 1576168800000,
241 | 1576169100000,
242 | 1576169400000,
243 | 1576169700000,
244 | 1576170000000,
245 | 1576170300000,
246 | 1576170600000,
247 | 1576170900000,
248 | 1576171200000,
249 | 1576171500000,
250 | 1576171800000,
251 | 1576172100000,
252 | 1576172400000,
253 | 1576172700000,
254 | 1576173000000,
255 | 1576173300000,
256 | 1576173600000,
257 | 1576173900000,
258 | 1576174200000,
259 | 1576174500000,
260 | 1576174800000,
261 | 1576175100000,
262 | 1576175400000,
263 | 1576175700000,
264 | 1576176000000,
265 | 1576176300000,
266 | 1576176600000,
267 | 1576176900000,
268 | 1576177200000,
269 | 1576177500000,
270 | 1576177800000,
271 | 1576178100000,
272 | 1576178400000,
273 | 1576178700000,
274 | 1576179000000,
275 | 1576179300000,
276 | 1576179600000,
277 | 1576179900000,
278 | 1576180200000,
279 | 1576180500000,
280 | 1576180800000,
281 | 1576181100000,
282 | 1576181400000,
283 | 1576181700000,
284 | 1576182000000,
285 | 1576182300000,
286 | 1576182600000,
287 | 1576182900000,
288 | 1576183200000,
289 | 1576183500000,
290 | 1576183800000,
291 | 1576184100000,
292 | 1576184400000,
293 | 1576184700000,
294 | 1576185000000,
295 | 1576185300000
296 | ],
297 | "value": [
298 | -1,
299 | 21360,
300 | -1,
301 | 21360,
302 | -1,
303 | 21360,
304 | -1,
305 | 21360,
306 | -1,
307 | 21360,
308 | -1,
309 | -1,
310 | 21360,
311 | -1,
312 | 21360,
313 | -1,
314 | 21360,
315 | -1,
316 | 21360,
317 | -1,
318 | 21360,
319 | -1,
320 | 21360,
321 | -1,
322 | 21360,
323 | -1,
324 | 21360,
325 | -1,
326 | 21360,
327 | -1,
328 | 21360,
329 | -1,
330 | 21360,
331 | -1,
332 | -1,
333 | 21360,
334 | -1,
335 | 21360,
336 | -1,
337 | 21360,
338 | -1,
339 | 21360,
340 | -1,
341 | 21360,
342 | -1,
343 | 21360,
344 | -1,
345 | 21360,
346 | -1,
347 | 21360,
348 | -1,
349 | 21360,
350 | -1,
351 | 21360,
352 | -1,
353 | 21360,
354 | -1,
355 | 21360,
356 | -1,
357 | 21360,
358 | -1,
359 | 21360,
360 | -1,
361 | -1,
362 | 21360,
363 | -1,
364 | 21360,
365 | -1,
366 | 21360,
367 | -1,
368 | 21360,
369 | -1,
370 | 21360,
371 | -1,
372 | 21360,
373 | -1,
374 | 21360,
375 | -1,
376 | 21360,
377 | -1,
378 | 21360,
379 | -1,
380 | 21360,
381 | -1,
382 | 21360,
383 | -1,
384 | 21360,
385 | -1,
386 | 21360,
387 | -1,
388 | -1,
389 | 21360,
390 | -1,
391 | 21360,
392 | -1,
393 | 21360,
394 | -1,
395 | 21360,
396 | -1,
397 | 21360,
398 | -1,
399 | 21360,
400 | -1,
401 | 21360,
402 | -1,
403 | 21360,
404 | -1,
405 | 21360,
406 | -1,
407 | 21360,
408 | -1,
409 | 21360,
410 | -1,
411 | 21360,
412 | -1,
413 | -1,
414 | 21360,
415 | -1,
416 | 21360,
417 | -1,
418 | 21360,
419 | -1,
420 | 21360,
421 | -1,
422 | 21360,
423 | -1,
424 | 21360,
425 | -1,
426 | 21360,
427 | -1,
428 | 21360,
429 | -1,
430 | 21360,
431 | -1,
432 | 21360,
433 | -1,
434 | 21360,
435 | -1,
436 | 21360,
437 | -1,
438 | -1,
439 | 21360,
440 | -1,
441 | 21360,
442 | -1,
443 | 21360,
444 | -1,
445 | 21360,
446 | -1,
447 | 21360,
448 | -1,
449 | 21360,
450 | -1,
451 | 21360,
452 | -1,
453 | 21360,
454 | -1,
455 | 21360,
456 | -1,
457 | 21360,
458 | -1,
459 | 21360,
460 | -1,
461 | -1,
462 | 21360,
463 | -1,
464 | 21360,
465 | -1,
466 | 21360,
467 | -1,
468 | 21360,
469 | -1,
470 | 21360,
471 | -1,
472 | 21360,
473 | -1,
474 | 21360,
475 | -1,
476 | 21360,
477 | -1,
478 | 21360,
479 | -1,
480 | 21360,
481 | -1,
482 | -1,
483 | 21360,
484 | -1,
485 | 21360,
486 | -1,
487 | 21360,
488 | -1,
489 | 21360,
490 | -1,
491 | 21360,
492 | -1,
493 | 21360,
494 | -1,
495 | 21360,
496 | -1,
497 | 21360,
498 | -1,
499 | 21360,
500 | -1,
501 | 21360,
502 | -1,
503 | -1,
504 | 21360,
505 | -1,
506 | 21360,
507 | -1,
508 | 21360,
509 | -1,
510 | 21360,
511 | -1,
512 | 21360,
513 | -1,
514 | 21360,
515 | -1,
516 | 21360,
517 | -1,
518 | 21360,
519 | -1,
520 | 21360,
521 | -1,
522 | 21360,
523 | -1,
524 | -1,
525 | 21360,
526 | -1,
527 | 21360,
528 | -1,
529 | 21360,
530 | -1,
531 | 21360,
532 | -1,
533 | 21360,
534 | 21360,
535 | -1,
536 | 21360,
537 | -1,
538 | -1,
539 | 21360,
540 | -1,
541 | 21360,
542 | -1,
543 | 21360,
544 | 21360,
545 | -1,
546 | 21360,
547 | -1,
548 | -1,
549 | 21360,
550 | -1,
551 | 21360,
552 | -1,
553 | 21360,
554 | -1,
555 | 21360,
556 | -1,
557 | 21360,
558 | -1,
559 | 21360,
560 | -1,
561 | 21360,
562 | -1,
563 | 21360,
564 | -1,
565 | 21360,
566 | -1,
567 | 21360,
568 | -1,
569 | 21360,
570 | -1,
571 | 21360,
572 | -1,
573 | 21360,
574 | -1,
575 | 21360,
576 | -1,
577 | 21360,
578 | -1,
579 | 21360,
580 | -1,
581 | 21360,
582 | -1,
583 | -1,
584 | 21360,
585 | -1
586 | ],
587 | "indicativeValue": 2947680
588 | },
589 | "flow.totalBytesRate.rate.average.bitsPerSecond.300": {
590 | "timestamp": [
591 | 1576099200000,
592 | 1576099500000,
593 | 1576099800000,
594 | 1576100100000,
595 | 1576100400000,
596 | 1576100700000,
597 | 1576101000000,
598 | 1576101300000,
599 | 1576101600000,
600 | 1576101900000,
601 | 1576102200000,
602 | 1576102500000,
603 | 1576102800000,
604 | 1576103100000,
605 | 1576103400000,
606 | 1576103700000,
607 | 1576104000000,
608 | 1576104300000,
609 | 1576104600000,
610 | 1576104900000,
611 | 1576105200000,
612 | 1576105500000,
613 | 1576105800000,
614 | 1576106100000,
615 | 1576106400000,
616 | 1576106700000,
617 | 1576107000000,
618 | 1576107300000,
619 | 1576107600000,
620 | 1576107900000,
621 | 1576108200000,
622 | 1576108500000,
623 | 1576108800000,
624 | 1576109100000,
625 | 1576109400000,
626 | 1576109700000,
627 | 1576110000000,
628 | 1576110300000,
629 | 1576110600000,
630 | 1576110900000,
631 | 1576111200000,
632 | 1576111500000,
633 | 1576111800000,
634 | 1576112100000,
635 | 1576112400000,
636 | 1576112700000,
637 | 1576113000000,
638 | 1576113300000,
639 | 1576113600000,
640 | 1576113900000,
641 | 1576114200000,
642 | 1576114500000,
643 | 1576114800000,
644 | 1576115100000,
645 | 1576115400000,
646 | 1576115700000,
647 | 1576116000000,
648 | 1576116300000,
649 | 1576116600000,
650 | 1576116900000,
651 | 1576117200000,
652 | 1576117500000,
653 | 1576117800000,
654 | 1576118100000,
655 | 1576118400000,
656 | 1576118700000,
657 | 1576119000000,
658 | 1576119300000,
659 | 1576119600000,
660 | 1576119900000,
661 | 1576120200000,
662 | 1576120500000,
663 | 1576120800000,
664 | 1576121100000,
665 | 1576121400000,
666 | 1576121700000,
667 | 1576122000000,
668 | 1576122300000,
669 | 1576122600000,
670 | 1576122900000,
671 | 1576123200000,
672 | 1576123500000,
673 | 1576123800000,
674 | 1576124100000,
675 | 1576124400000,
676 | 1576124700000,
677 | 1576125000000,
678 | 1576125300000,
679 | 1576125600000,
680 | 1576125900000,
681 | 1576126200000,
682 | 1576126500000,
683 | 1576126800000,
684 | 1576127100000,
685 | 1576127400000,
686 | 1576127700000,
687 | 1576128000000,
688 | 1576128300000,
689 | 1576128600000,
690 | 1576128900000,
691 | 1576129200000,
692 | 1576129500000,
693 | 1576129800000,
694 | 1576130100000,
695 | 1576130400000,
696 | 1576130700000,
697 | 1576131000000,
698 | 1576131300000,
699 | 1576131600000,
700 | 1576131900000,
701 | 1576132200000,
702 | 1576132500000,
703 | 1576132800000,
704 | 1576133100000,
705 | 1576133400000,
706 | 1576133700000,
707 | 1576134000000,
708 | 1576134300000,
709 | 1576134600000,
710 | 1576134900000,
711 | 1576135200000,
712 | 1576135500000,
713 | 1576135800000,
714 | 1576136100000,
715 | 1576136400000,
716 | 1576136700000,
717 | 1576137000000,
718 | 1576137300000,
719 | 1576137600000,
720 | 1576137900000,
721 | 1576138200000,
722 | 1576138500000,
723 | 1576138800000,
724 | 1576139100000,
725 | 1576139400000,
726 | 1576139700000,
727 | 1576140000000,
728 | 1576140300000,
729 | 1576140600000,
730 | 1576140900000,
731 | 1576141200000,
732 | 1576141500000,
733 | 1576141800000,
734 | 1576142100000,
735 | 1576142400000,
736 | 1576142700000,
737 | 1576143000000,
738 | 1576143300000,
739 | 1576143600000,
740 | 1576143900000,
741 | 1576144200000,
742 | 1576144500000,
743 | 1576144800000,
744 | 1576145100000,
745 | 1576145400000,
746 | 1576145700000,
747 | 1576146000000,
748 | 1576146300000,
749 | 1576146600000,
750 | 1576146900000,
751 | 1576147200000,
752 | 1576147500000,
753 | 1576147800000,
754 | 1576148100000,
755 | 1576148400000,
756 | 1576148700000,
757 | 1576149000000,
758 | 1576149300000,
759 | 1576149600000,
760 | 1576149900000,
761 | 1576150200000,
762 | 1576150500000,
763 | 1576150800000,
764 | 1576151100000,
765 | 1576151400000,
766 | 1576151700000,
767 | 1576152000000,
768 | 1576152300000,
769 | 1576152600000,
770 | 1576152900000,
771 | 1576153200000,
772 | 1576153500000,
773 | 1576153800000,
774 | 1576154100000,
775 | 1576154400000,
776 | 1576154700000,
777 | 1576155000000,
778 | 1576155300000,
779 | 1576155600000,
780 | 1576155900000,
781 | 1576156200000,
782 | 1576156500000,
783 | 1576156800000,
784 | 1576157100000,
785 | 1576157400000,
786 | 1576157700000,
787 | 1576158000000,
788 | 1576158300000,
789 | 1576158600000,
790 | 1576158900000,
791 | 1576159200000,
792 | 1576159500000,
793 | 1576159800000,
794 | 1576160100000,
795 | 1576160400000,
796 | 1576160700000,
797 | 1576161000000,
798 | 1576161300000,
799 | 1576161600000,
800 | 1576161900000,
801 | 1576162200000,
802 | 1576162500000,
803 | 1576162800000,
804 | 1576163100000,
805 | 1576163400000,
806 | 1576163700000,
807 | 1576164000000,
808 | 1576164300000,
809 | 1576164600000,
810 | 1576164900000,
811 | 1576165200000,
812 | 1576165500000,
813 | 1576165800000,
814 | 1576166100000,
815 | 1576166400000,
816 | 1576166700000,
817 | 1576167000000,
818 | 1576167300000,
819 | 1576167600000,
820 | 1576167900000,
821 | 1576168200000,
822 | 1576168500000,
823 | 1576168800000,
824 | 1576169100000,
825 | 1576169400000,
826 | 1576169700000,
827 | 1576170000000,
828 | 1576170300000,
829 | 1576170600000,
830 | 1576170900000,
831 | 1576171200000,
832 | 1576171500000,
833 | 1576171800000,
834 | 1576172100000,
835 | 1576172400000,
836 | 1576172700000,
837 | 1576173000000,
838 | 1576173300000,
839 | 1576173600000,
840 | 1576173900000,
841 | 1576174200000,
842 | 1576174500000,
843 | 1576174800000,
844 | 1576175100000,
845 | 1576175400000,
846 | 1576175700000,
847 | 1576176000000,
848 | 1576176300000,
849 | 1576176600000,
850 | 1576176900000,
851 | 1576177200000,
852 | 1576177500000,
853 | 1576177800000,
854 | 1576178100000,
855 | 1576178400000,
856 | 1576178700000,
857 | 1576179000000,
858 | 1576179300000,
859 | 1576179600000,
860 | 1576179900000,
861 | 1576180200000,
862 | 1576180500000,
863 | 1576180800000,
864 | 1576181100000,
865 | 1576181400000,
866 | 1576181700000,
867 | 1576182000000,
868 | 1576182300000,
869 | 1576182600000,
870 | 1576182900000,
871 | 1576183200000,
872 | 1576183500000,
873 | 1576183800000,
874 | 1576184100000,
875 | 1576184400000,
876 | 1576184700000,
877 | 1576185000000,
878 | 1576185300000
879 | ],
880 | "value": [
881 | -1,
882 | 569,
883 | -1,
884 | 569,
885 | -1,
886 | 569,
887 | -1,
888 | 569,
889 | -1,
890 | 569,
891 | -1,
892 | -1,
893 | 569,
894 | -1,
895 | 569,
896 | -1,
897 | 569,
898 | -1,
899 | 569,
900 | -1,
901 | 569,
902 | -1,
903 | 569,
904 | -1,
905 | 569,
906 | -1,
907 | 569,
908 | -1,
909 | 569,
910 | -1,
911 | 569,
912 | -1,
913 | 569,
914 | -1,
915 | -1,
916 | 569,
917 | -1,
918 | 569,
919 | -1,
920 | 569,
921 | -1,
922 | 569,
923 | -1,
924 | 569,
925 | -1,
926 | 569,
927 | -1,
928 | 569,
929 | -1,
930 | 569,
931 | -1,
932 | 569,
933 | -1,
934 | 569,
935 | -1,
936 | 569,
937 | -1,
938 | 569,
939 | -1,
940 | 569,
941 | -1,
942 | 569,
943 | -1,
944 | -1,
945 | 569,
946 | -1,
947 | 569,
948 | -1,
949 | 569,
950 | -1,
951 | 569,
952 | -1,
953 | 569,
954 | -1,
955 | 569,
956 | -1,
957 | 569,
958 | -1,
959 | 569,
960 | -1,
961 | 569,
962 | -1,
963 | 569,
964 | -1,
965 | 569,
966 | -1,
967 | 569,
968 | -1,
969 | 569,
970 | -1,
971 | -1,
972 | 569,
973 | -1,
974 | 569,
975 | -1,
976 | 569,
977 | -1,
978 | 569,
979 | -1,
980 | 569,
981 | -1,
982 | 569,
983 | -1,
984 | 569,
985 | -1,
986 | 569,
987 | -1,
988 | 569,
989 | -1,
990 | 569,
991 | -1,
992 | 569,
993 | -1,
994 | 569,
995 | -1,
996 | -1,
997 | 569,
998 | -1,
999 | 569,
1000 | -1,
1001 | 569,
1002 | -1,
1003 | 569,
1004 | -1,
1005 | 569,
1006 | -1,
1007 | 569,
1008 | -1,
1009 | 569,
1010 | -1,
1011 | 569,
1012 | -1,
1013 | 569,
1014 | -1,
1015 | 569,
1016 | -1,
1017 | 569,
1018 | -1,
1019 | 569,
1020 | -1,
1021 | -1,
1022 | 569,
1023 | -1,
1024 | 569,
1025 | -1,
1026 | 569,
1027 | -1,
1028 | 569,
1029 | -1,
1030 | 569,
1031 | -1,
1032 | 569,
1033 | -1,
1034 | 569,
1035 | -1,
1036 | 569,
1037 | -1,
1038 | 569,
1039 | -1,
1040 | 569,
1041 | -1,
1042 | 569,
1043 | -1,
1044 | -1,
1045 | 569,
1046 | -1,
1047 | 569,
1048 | -1,
1049 | 569,
1050 | -1,
1051 | 569,
1052 | -1,
1053 | 569,
1054 | -1,
1055 | 569,
1056 | -1,
1057 | 569,
1058 | -1,
1059 | 569,
1060 | -1,
1061 | 569,
1062 | -1,
1063 | 569,
1064 | -1,
1065 | -1,
1066 | 569,
1067 | -1,
1068 | 569,
1069 | -1,
1070 | 569,
1071 | -1,
1072 | 569,
1073 | -1,
1074 | 569,
1075 | -1,
1076 | 569,
1077 | -1,
1078 | 569,
1079 | -1,
1080 | 569,
1081 | -1,
1082 | 569,
1083 | -1,
1084 | 569,
1085 | -1,
1086 | -1,
1087 | 569,
1088 | -1,
1089 | 569,
1090 | -1,
1091 | 569,
1092 | -1,
1093 | 569,
1094 | -1,
1095 | 569,
1096 | -1,
1097 | 569,
1098 | -1,
1099 | 569,
1100 | -1,
1101 | 569,
1102 | -1,
1103 | 569,
1104 | -1,
1105 | 569,
1106 | -1,
1107 | -1,
1108 | 569,
1109 | -1,
1110 | 569,
1111 | -1,
1112 | 569,
1113 | -1,
1114 | 569,
1115 | -1,
1116 | 569,
1117 | 569,
1118 | -1,
1119 | 569,
1120 | -1,
1121 | -1,
1122 | 569,
1123 | -1,
1124 | 569,
1125 | -1,
1126 | 569,
1127 | 569,
1128 | -1,
1129 | 569,
1130 | -1,
1131 | -1,
1132 | 569,
1133 | -1,
1134 | 569,
1135 | -1,
1136 | 569,
1137 | -1,
1138 | 569,
1139 | -1,
1140 | 569,
1141 | -1,
1142 | 569,
1143 | -1,
1144 | 569,
1145 | -1,
1146 | 569,
1147 | -1,
1148 | 569,
1149 | -1,
1150 | 569,
1151 | -1,
1152 | 569,
1153 | -1,
1154 | 569,
1155 | -1,
1156 | 569,
1157 | -1,
1158 | 569,
1159 | -1,
1160 | 569,
1161 | -1,
1162 | 569,
1163 | -1,
1164 | 569,
1165 | -1,
1166 | -1,
1167 | 569,
1168 | -1
1169 | ],
1170 | "indicativeValue": 272.6458333333333
1171 | }
1172 | }
1173 | }
1174 | ],
1175 | "continuationToken": 0
1176 | }
1177 |
--------------------------------------------------------------------------------
/lib/test/drv/drv.data.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | fi
5 | source ${WORKDIR}/drv.vrni.client
6 |
7 | printf '%s' $(<${WORKDIR}/data.json) | jq --tab .
8 |
--------------------------------------------------------------------------------
/lib/test/drv/drv.entities.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [ -z ${WORKDIR} ]; then
3 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
4 | WORKDIR=${BASH_REMATCH[1]}
5 | fi
6 | if [[ $0 == "bash" ]]; then
7 | WORKDIR="."
8 | fi
9 | fi
10 | STATEDIR="${WORKDIR}"
11 | source ${WORKDIR}/mod.core
12 |
13 | TOKEN=$(cat ${STATEDIR}/vrni.token.txt)
14 | BODY=$(<./entities.json)
15 | RESULT=$(curl -k -b "${STATEDIR}/vrni.cookies.txt" -X POST \
16 | -H 'accept: application/json' \
17 | -H 'content-type: application/json' \
18 | -H "x-vrni-csrf-token: $TOKEN" \
19 | -d "${BODY}" \
20 | "https://field-demo.vrni.cmbu.local/api/metrics/entities" \
21 | 2>/dev/null)
22 |
23 | #"https://field-demo.vrni.cmbu.local/api/config/objects" \
24 | #[{"modelKey":"10000:515:1018548286","metricNames":["flow.totalBytes.delta.summation.bytes","flow.totalBytesRate.rate.average.bitsPerSecond"],"indicativeValues":true,"startDate":1576099008489,"endDate":1576185408489,"defaultValue":-1}
25 |
26 | printf '%s' "${RESULT}" | jq --tab . >./data.json
27 | #printf '%s' "${RESULT}" | jq --tab . >${STATEDIR}/data.json
28 |
--------------------------------------------------------------------------------
/lib/test/drv/drv.objects.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [ -z ${WORKDIR} ]; then
3 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
4 | WORKDIR=${BASH_REMATCH[1]}
5 | fi
6 | if [[ $0 == "bash" ]]; then
7 | WORKDIR="."
8 | fi
9 | fi
10 | STATEDIR="${WORKDIR}"
11 | source ${WORKDIR}/mod.core
12 |
13 | printf "%s\n" "${0} : ${WORKDIR} : ${STATEDIR}"
14 |
15 | TOKEN=$(cat ${STATEDIR}/vrni.token.txt)
16 | BODY=$(<${STATEDIR}/result.json)
17 | RESULT=$(curl -k -b "${STATEDIR}/vrni.cookies.txt" -X POST \
18 | -H 'accept: application/json' \
19 | -H 'content-type: application/json' \
20 | -H "x-vrni-csrf-token: $TOKEN" \
21 | -d "${BODY}" \
22 | "https://field-demo.vrni.cmbu.local/api/config/objects" 2>/dev/null)
23 |
24 | printf '%s' "${RESULT}" | jq --tab . >${STATEDIR}/data.json
25 |
--------------------------------------------------------------------------------
/lib/test/drv/drv.result.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | fi
5 | source ${WORKDIR}/drv.vrni.client
6 |
7 | printf '%s' $(cat ${WORKDIR}/result.json) | jq --tab .
8 |
--------------------------------------------------------------------------------
/lib/test/drv/drv.vrni.client:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [ -z ${WORKDIR} ]; then
3 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
4 | WORKDIR=${BASH_REMATCH[1]}
5 | fi
6 | if [[ $0 == "bash" ]]; then
7 | WORKDIR="."
8 | fi
9 | fi
10 | if [ -z ${SDDCDIR} ]; then
11 | SDDCDIR=${WORKDIR}
12 | fi
13 | STATEDIR="${WORKDIR}/state"
14 | if [ ! -d ${STATEDIR} ]; then
15 | mkdir ${STATEDIR}
16 | fi
17 | source ${WORKDIR}/mod.core
18 |
19 | PARAMS=$(cat ${SDDCDIR}/sddc.parameters)
20 | DOMAIN=$(echo "${PARAMS}" | jq -r '.domain')
21 | SPEC=$(echo "${PARAMS}" | jq -r '.endpoints[] | select(.type=="vrni")')
22 | VRNIHOST=$(echo "$SPEC" | jq -r '.hostname')
23 | if [[ ! "$VRNIHOST" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
24 | if [[ ! "$VRNIHOST" =~ [.] ]]; then
25 | VRNIHOST+=".$DOMAIN" #if not an IP or FQDN, append domain
26 | fi
27 | fi
28 | VRNIUSER=$(echo "$SPEC" | jq -r '.username')
29 | VRNIPASS=$(echo "$SPEC" | jq -r '.password')
30 | VRNIONLINE=$(echo "$SPEC" | jq -r '.online')
31 | VRNISESSION="${STATEDIR}/vrni.token.txt"
32 | VRNIBASE="https://${VRNIHOST}/api/ni/"
33 |
34 | function vrniLogin {
35 | local URL="https://${VRNIHOST}/api/ni/auth/token"
36 | read -r -d '' VRNIBODY <<-CONFIG
37 | {
38 | "username": "${VRNIUSER}",
39 | "password": "${VRNIPASS}",
40 | "domain": {
41 | "domain_type": "LOCAL"
42 | }
43 | }
44 | CONFIG
45 | #local RESPONSE=$(curl -k -w "%{http_code}" -X POST \
46 | local RESPONSE=$(curl -k -c "${STATEDIR}/vrni.cookies.txt" -D "${STATEDIR}/vrni.headers.txt" -w "%{http_code}" -X POST \
47 | -H 'Content-Type: application/json' \
48 | -H 'Accept: application/json' \
49 | -d "$VRNIBODY" \
50 | "${URL}" 2>/dev/null)
51 | local RESULT=$(isSuccess "${RESPONSE}")
52 | local CODE=$(getCode "${RESPONSE}")
53 | if [[ $CODE =~ 2..$ ]]; then
54 | local TOKEN=$(echo $RESULT | jq -r '.token')
55 | printf "%s\n" "${TOKEN}"
56 | fi
57 | }
58 |
59 | function vrniSession {
60 | local SESSION=$VRNISESSION
61 | local ONLINE=$VRNIONLINE
62 | if [[ "$ONLINE" == "true" ]]; then
63 | local RUNFIND="$(find ${SESSION} -mmin -10 2>/dev/null)"
64 | if [[ -z ${RUNFIND} ]]; then
65 | printf "No valid session found, authenticating... " 1>&2
66 | local LOGIN=$(vrniLogin)
67 | if [[ -n ${LOGIN} ]]; then
68 | echo "${LOGIN}" >"$SESSION"
69 | fi
70 | fi
71 | fi
72 | printf "%s\n" "$(cat "${SESSION}" 2>/dev/null)"
73 | }
74 |
75 | function vrniPost {
76 | local URL=${1}
77 | local BODY=${2}
78 | if [[ "$VRNIONLINE" == "true" ]]; then
79 | RESPONSE=$(curl -k -w "%{http_code}" -X POST \
80 | -H "Content-Type: application/json" \
81 | -H 'Accept: application/json' \
82 | -H "Authorization: NetworkInsight $(cat ${VRNISESSION})" \
83 | -d "$BODY" \
84 | "${URL}" 2>/dev/null)
85 | RESULT=$(isSuccess "${RESPONSE}")
86 | else
87 | printf "[$(ccyan "OFFLINE")] - SUCCESS\n" 1>&2
88 | fi
89 | printf "%s\n" "${RESULT}" | jq --tab .
90 | }
91 |
92 | function vrniGet {
93 | local URL=${1}
94 | local BASE=${VRNIBASE}
95 | local ONLINE="${VRNIONLINE}"
96 | local STATE
97 | if [[ "$ONLINE" == "true" ]]; then
98 | local SUCCESS=$(vrniSession)
99 | local FILE=$(getFile "${URL}" "${BASE}")
100 | STATE="${STATEDIR}/vrni${FILE}"
101 |
102 | ### DEBUG ###
103 | curl -k --trace-ascii /dev/stdout -b "${STATEDIR}/vrni.cookies.txt" -D "${STATEDIR}/vrni.headers.txt" -w "%{http_code}" -X GET \
104 | -H 'Accept: application/json' \
105 | -H 'Origin: https://field-demo.vrni.cmbu.local' \
106 | -H 'x-vrni-csrf-token: RW6X9sZkHvNM+rJLFlEpaQ==' \
107 | "${URL}" 1>&2
108 | ### DEBUG ###
109 | #-H "Authorization: NetworkInsight $(cat ${VRNISESSION})" \
110 |
111 | #RESPONSE=$(curl -k -w "%{http_code}" -X GET \
112 | # -H "Content-Type: application/json" \
113 | # -H 'Accept: application/json' \
114 | # -H 'Origin: https://field-demo.vrni.cmbu.local' \
115 | # -H 'x-vrni-csrf-token: RW6X9sZkHvNM+rJLFlEpaQ==' \
116 | # -H "Authorization: NetworkInsight $(cat ${VRNISESSION})" \
117 | #"${URL}" 2>/dev/null)
118 | #RESULT=$(isSuccess "${RESPONSE}")
119 | else
120 | printf "[$(ccyan "OFFLINE")] - SUCCESS\n" 1>&2
121 | RESULT=$(cat "${URL}")
122 | STATE="${URL}"
123 | fi
124 | #printf "%s\n" "${RESULT}" | jq --tab . >"${STATE}"
125 | printf "%s\n" "${RESULT}" | jq --tab .
126 | }
127 |
128 | function buildURL {
129 | local ENDPOINT="${1}"
130 | local BASE="${VRNIBASE}"
131 | local STATE="${STATEDIR}"
132 | local ONLINE="${VRNIONLINE}"
133 | if [[ "$ONLINE" == "true" ]]; then
134 | local SUCCESS=$(vrniSession)
135 | if [[ -n ${SUCCESS} ]]; then
136 | URL="$BASE$ENDPOINT"
137 | else
138 | URL="" #failed to obtain valid session
139 | fi
140 | else
141 | local FILE=$(getFile "${ENDPOINT}")
142 | URL="${STATE}/vrni${FILE}"
143 | fi
144 | printf "$URL"
145 | }
146 |
--------------------------------------------------------------------------------
/lib/test/drv/entities.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "modelKey": "10000:515:1018548286",
4 | "metricNames": [
5 | "flow.totalBytes.delta.summation.bytes",
6 | "flow.totalBytesRate.rate.average.bitsPerSecond"
7 | ],
8 | "indicativeValues": true,
9 | "startDate": 1576099008489,
10 | "endDate": 1576185408489,
11 | "defaultValue": -1
12 | }
13 | ]
14 |
--------------------------------------------------------------------------------
/lib/test/drv/mod.core:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | # detect and resolve symlink
3 | if [[ -L $0 ]]; then
4 | if [[ $(readlink $0) =~ ^(.*)/([^/]+)$ ]]; then
5 | WORKDIR="${BASH_REMATCH[1]}"
6 | CALLED="${BASH_REMATCH[2]}"
7 | fi
8 | else
9 | if [[ $0 =~ ^(.*)/([^/]+)$ ]]; then
10 | WORKDIR="${BASH_REMATCH[1]}"
11 | CALLED="${BASH_REMATCH[2]}"
12 | fi
13 | fi
14 | if [ -z ${STATEDIR} ]; then
15 | STATEDIR="${WORKDIR}/state"
16 | fi
17 | #printf "0 ${0} state ${STATEDIR}\n" 1>&2
18 | if [ ! -d ${STATEDIR} ]; then
19 | mkdir ${STATEDIR}
20 | fi
21 |
22 | # detect available cmds
23 | commands() {
24 | #echo "-- [COMMANDS] --"
25 | printf "%s" "list"
26 | for FILE in ${WORKDIR}/cmd.*.sh; do
27 | if [[ $FILE =~ cmd[.](.+)[.]sh ]]; then
28 | printf " %s" "${BASH_REMATCH[1]}"
29 | fi
30 | done
31 | exit 1
32 | }
33 | if [[ -n "$1" && ${CALLED} == "mod.core" ]]; then
34 | case "${1}" in
35 | list) ## list commands
36 | commands
37 | ;;
38 | setup-params) ## output sddc.parameters
39 | cat ${WORKDIR}/sddc.parameters
40 | ;;
41 | setup-bash) ## output bash-cli
42 | cat ${WORKDIR}/bash-cli
43 | ;;
44 | *) ## execute command
45 | if [ -f "${WORKDIR}/cmd.${1}.sh" ]; then
46 | eval "${WORKDIR}/cmd.${1}.sh ${2} ${3} ${4}"
47 | fi
48 | ;;
49 | esac
50 | fi
51 |
52 | # get OSNAME
53 | OSNAME="$(uname -s)"
54 | case "${OSNAME}" in
55 | Linux*)
56 | #printf "HAHA you run a L:${OSNAME}\n" 1>&2
57 | ;;
58 | Darwin*)
59 | #printf "HAHA you run a D:${OSNAME}\n" 1>&2
60 | ;;
61 | esac
62 |
63 | # COLOURS
64 | #RED=$'\e[31;1m'
65 | #CYAN=$'\e[36;1m'
66 | #GREEN='\e[32;1m' # light green
67 | #ORANGE=$'\e[33;1m' # orange
68 | #BLUE=$'\e[34;1m' # light blue
69 | #NC=$'\e[31;00m'
70 |
71 | #NC='\033[0;00m' # no colour
72 | BLACK='\033[0;30m' # black
73 | RED='\033[0;31m' # red
74 | #GREEN='\033[0;32m' # orange
75 | #ORANGE='\033[0;33m' # orange
76 | BLUE='\033[0;34m' # blue
77 | PURPLE='\033[0;35m' # purple
78 | #CYAN='\033[0;36m' # cyan
79 |
80 | NC='\e[0;00m' # no colour
81 | GREEN='\e[0;32m' # orange
82 | ORANGE='\e[0;33m' # orange
83 | CYAN='\e[0;36m' # cyan
84 | #LIGHTGREY='\033[0;37m' # light grey
85 | #DARKGREY='\033[0;30m' # dark grey
86 | #LIGHTRED='\033[0;31m' # light red
87 | #LIGHTGREEN='\033[0;32m' # light green
88 | #YELLOW='\033[0;33m' # yellow
89 | #LIGHTBLUE='\033[0;34m' # light blue
90 | #LBLUE='\033[33;1m' ## test
91 | #WHITE='\033[0;37m' # white
92 |
93 | function corange {
94 | local STRING=${1}
95 | printf '%s' "${ORANGE}${STRING}${NC}"
96 | }
97 | function cgreen {
98 | local STRING=${1}
99 | printf '%s' "${GREEN}${STRING}${NC}"
100 | }
101 | function ccyan {
102 | local STRING=${1}
103 | printf '%s' "${CYAN}${STRING}${NC}"
104 | }
105 |
106 | function isSuccess {
107 | local STRING=${1}
108 | local SESSION=${2}
109 | local CODE=$(getCode "${STRING}")
110 | local VALID
111 | printf "[$(ccyan "${CODE}")] - " 1>&2
112 | case $CODE in
113 | 2[0-9][0-9])
114 | printf "SUCCESS\n" 1>&2
115 | VALID="1"
116 | ;;
117 | 400)
118 | printf "ERROR\n" 1>&2
119 | ;;
120 | 40[1-3])
121 | printf "ERROR-AUTH\n" 1>&2
122 | ;;
123 | 404)
124 | printf "ERROR-NOTFOUND\n" 1>&2
125 | ;;
126 | *)
127 | printf "ERROR\n" 1>&2
128 | ;;
129 | esac
130 | if [[ -z "${VALID}" && -f "${SESSION}" ]]; then
131 | rm "${SESSION}" 2>/dev/null
132 | fi
133 | local BODY=$(getBody "${STRING}")
134 | printf "%s\n" "${BODY}"
135 | }
136 |
137 | function getCode {
138 | local STRING=${1}
139 | if [[ $STRING =~ ^(.*)([0-9]{3})$ ]]; then
140 | local BODY=${BASH_REMATCH[1]}
141 | local CODE=${BASH_REMATCH[2]}
142 | fi
143 | printf "%s\n" "${CODE}"
144 | }
145 |
146 | function getBody {
147 | local STRING=${1}
148 | if [[ $STRING =~ ^(.*)([0-9]{3})$ ]]; then
149 | local BODY=${BASH_REMATCH[1]}
150 | local CODE=${BASH_REMATCH[2]}
151 | fi
152 | printf "%s\n" "${BODY}"
153 | }
154 |
155 | function getFile {
156 | local ENDPOINT=${1}
157 | local BASE=${2}
158 | local STATE
159 | if [[ -n $BASE ]]; then
160 | REGEX="^($BASE)"
161 | if [[ $ENDPOINT =~ $REGEX ]]; then
162 | ENDPOINT=${ENDPOINT#*"${BASH_REMATCH[1]}"}
163 | fi
164 | fi
165 | while [[ $ENDPOINT =~ ([^/]+) ]]; do
166 | ENDPOINT=${ENDPOINT#*"${BASH_REMATCH[1]}"}
167 | STATE+=".${BASH_REMATCH[1]}"
168 | done
169 | STATE+=".json"
170 | printf "%s" "${STATE}"
171 | }
172 |
173 | function getThumbprint {
174 | local HOST="${1}"
175 | local PAYLOAD=$(echo -n | openssl s_client -connect "${HOST}" 2>/dev/null)
176 | local PRINT=$(echo "$PAYLOAD" | openssl x509 -noout -fingerprint -sha256)
177 | local REGEX='^(.*)=(([0-9A-Fa-f]{2}[:])+([0-9A-Fa-f]{2}))$'
178 | if [[ $PRINT =~ $REGEX ]]; then
179 | local TYPE=${BASH_REMATCH[1]}
180 | local CODE=${BASH_REMATCH[2]}
181 | fi
182 | printf "%s\n" "${CODE}" | sed "s/\(.*\)/\L\1/g" | sed "s/://g"
183 | }
184 |
185 | function getCertificate {
186 | local HOST="${1}"
187 | local PAYLOAD=$(echo -n | openssl s_client -connect "${HOST}" 2>/dev/null)
188 | local RESULT=$(echo "${PAYLOAD}" | sed -e '1h;2,$H;$!d;g' -e 's/.*\(-----BEGIN\sCERTIFICATE-----.*-----END\sCERTIFICATE-----\).*/\1/g')
189 | printf "%s\n" "$RESULT" | sed ':a;N;$!ba;s/\n/\\\\n/g'
190 | }
191 |
192 | function buildTable {
193 | local INPUT="${1}" # change first entry to color, separate from data body
194 | read -r -d '' JQTABLE <<-CONFIG
195 | if (.[0]?) then
196 | [(
197 | [.[0] | to_entries[] | "<" + .key + ">"]
198 | ),(
199 | .[] | [to_entries[] | .value]
200 | )]
201 | else . end
202 | CONFIG
203 | local HEADER="1"
204 | echo "$INPUT" | jq -r "$JQTABLE | .[] | @tsv" | column -t -s $'\t' | while read -r LINE; do
205 | if [[ -n $HEADER ]]; then
206 | printf "${CYAN}${LINE}${NC}\n"
207 | HEADER=""
208 | else
209 | printf "$LINE\n";
210 | fi
211 | done
212 | }
213 |
214 | function buildTest {
215 | local INPUT="${1}" # change first entry to color, separate from data body
216 | read -r -d '' JQTABLE <<-CONFIG
217 | if (.[0]?) then
218 | [(
219 | [.[0] | to_entries[] | "${BLUE}<" + .key + ">${NC}"]
220 | ),(
221 | .[] | [to_entries[] | "${NC}" + .value + "${NC}"]
222 | )]
223 | else . end
224 | CONFIG
225 | BODY=$(echo "$INPUT" | jq -r "$JQTABLE | .[] | @tsv" | column -t -s $'\t')
226 | printf "${BODY}\n"
227 | }
228 |
229 | function buildNoColour {
230 | local INPUT="${1}" # change first entry to color, separate from data body
231 | read -r -d '' JQTABLE <<-CONFIG
232 | if (.[0]?) then
233 | [(
234 | [.[0] | to_entries[] | "<" + .key + ">"]
235 | ),(
236 | .[] | [to_entries[] | .value]
237 | )]
238 | else . end
239 | CONFIG
240 | BODY=$(echo "$INPUT" | jq -r "$JQTABLE | .[] | @tsv" | column -t -s $'\t')
241 | printf "${BODY}\n"
242 | }
243 |
244 | ## filter payload with string
245 | function filter {
246 | local PAYLOAD=${1}
247 | local STRING=${2}
248 | while [[ $STRING =~ ([^,]+) ]]; do
249 | local FILTER="${BASH_REMATCH[1]}"
250 | STRING=${STRING#*"${BASH_REMATCH[1]}"}
251 | local FIELD="name"
252 | local VALUE="."
253 | if [[ $FILTER =~ ([^:]+):([^:]*) ]]; then
254 | FIELD=${BASH_REMATCH[1]}
255 | VALUE=${BASH_REMATCH[2]}
256 | else
257 | VALUE="${FILTER}"
258 | fi
259 | read -r -d '' FILTERSPEC <<-CONFIG
260 | map(select(
261 | ."$FIELD" |
262 | if (. != null) then (. | tostring) else "" end
263 | | test("$VALUE";"i")
264 | ))
265 | CONFIG
266 | PAYLOAD=$(echo "$PAYLOAD" | jq -r "$FILTERSPEC")
267 | done
268 | printf "%s\n" "${PAYLOAD}" | jq --tab .
269 | }
270 |
271 | ## set current context
272 | function setContext {
273 | local INPUT="${1}"
274 | local ITEM="${2}"
275 | local STATE="${STATEDIR}/ctx.${ITEM}.json"
276 | local PAYLOAD=$(echo "$INPUT" | jq --tab '.[0]')
277 | if [[ -n "${PAYLOAD}" && "${PAYLOAD}" != null ]]; then
278 | printf "%s\n" "${PAYLOAD}" >"${STATE}"
279 | fi
280 | }
281 |
282 | ## get current context
283 | function getContext {
284 | local FILTER="${1}"
285 | if [[ -z $FILTER ]]; then
286 | FILTER="."
287 | fi
288 | echo "FILTER: ${FILTER}" 1>&2
289 | local PAYLOAD=$("${WORKDIR}"/cmd.context.list.sh "${FILTER}" json | jq '.[0]')
290 | if [[ ! "$PAYLOAD" == null ]]; then
291 | printf "%s\n" "${PAYLOAD}" | jq -r '.id'
292 | fi
293 | }
294 |
--------------------------------------------------------------------------------
/lib/test/drv/result.json:
--------------------------------------------------------------------------------
1 | {
2 | "requests": [
3 | {
4 | "modelKey": "10000:4:141732398"
5 | },
6 | {
7 | "modelKey": "10000:4:141732522"
8 | },
9 | {
10 | "modelKey": "10000:4:141734320"
11 | },
12 | {
13 | "modelKey": "10000:4:141735343"
14 | }
15 | ]
16 | }
17 |
--------------------------------------------------------------------------------
/lib/test/host.jq:
--------------------------------------------------------------------------------
1 | .data | if (. != null) then map({
2 | "modelKey": .modelKey,
3 | "name": .name,
4 | "powerState": .serverdataParent.runtime.powerState,
5 | "numCpus": .serverdataParent.numCpus,
6 | "cpuSockets": .serverdataParent.cpuSockets,
7 | "memoryMB": .serverdataParent.memoryMB,
8 | "numVms": .numVms
9 | }) else "" end
10 |
--------------------------------------------------------------------------------
/lib/test/login.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | STATEDIR="./drv"
4 | TOKEN=$(curl -k -X POST \
5 | -c "${STATEDIR}/vrni.cookies.txt" \
6 | https://field-demo.vrni.cmbu.local/api/auth/login \
7 | -H 'accept: application/json' \
8 | -H 'content-type: application/json' \
9 | -d '{"username":"demouser@cmbu.local","password":"demoVMware1!","tenantName":"field-demo.vrni.cmbu.local","vIDMURL":"","redirectURL":"","authenticationDomains":{"0":{"domainType":"LDAP","domain":"vmware.com","redirectUrl":""},"1":{"domainType":"LOCAL_DOMAIN","domain":"localdomain","redirectUrl":""}},"currentDomain":1,"domain":"localdomain","nDomains":2,"serverTimestamp":false,"loginFieldPlaceHolder":"Username"}' \
10 | 2>/dev/null | jq -r '.csrfToken')
11 |
12 | printf '%s' "${TOKEN}" >${STATEDIR}/vrni.token.txt
13 | printf '%s\n' "${TOKEN}" 1>&2
14 |
15 | #{"username":"demouser@cmbu.local","password":"demoVMware1!","tenantName":"field-demo.vrni.cmbu.local","vIDMURL":"","redirectURL":"","authenticationDomains":{"0":{"domainType":"LDAP","domain":"vmware.com","redirectUrl":""},"1":{"domainType":"LOCAL_DOMAIN","domain":"localdomain","redirectUrl":""}},"currentDomain":1,"domain":"localdomain","nDomains":2,"serverTimestamp":false,"loginFieldPlaceHolder":"Username"}
16 |
--------------------------------------------------------------------------------
/lib/test/mod.command:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/([^/]+)$ ]]; then ## offload to mod.header
3 | WORKDIR=${BASH_REMATCH[1]}
4 | FILE=${BASH_REMATCH[2]}
5 | if [[ ${FILE} =~ ^[^.]+[.](.+)[.]sh$ ]]; then
6 | TYPE=${BASH_REMATCH[1]}
7 | fi
8 | fi
9 | STATEDIR=${WORKDIR}/drv/state
10 | source ${WORKDIR}/drv/mod.core
11 |
12 | # build filter
13 | function cmd {
14 | local COMMAND=${1}
15 | case "${COMMAND}" in
16 | watch)
17 | watch -t -c -n 3 "${WORKDIR}/${FILE} 2>/dev/null"
18 | ;;
19 | json)
20 | local PAYLOAD=$(payload)
21 | setContext "${PAYLOAD}" "${TYPE}"
22 | echo "${PAYLOAD}" | jq --tab .
23 | ;;
24 | filter)
25 | local FILTER=${2}
26 | local PAYLOAD=$(filter "$(payload)" "${FILTER}")
27 | setContext "${PAYLOAD}" "${TYPE}"
28 | buildTable "${PAYLOAD}"
29 | ;;
30 | *)
31 | local PAYLOAD=$(payload)
32 | setContext "${PAYLOAD}" "${TYPE}"
33 | buildTable "${PAYLOAD}"
34 | ;;
35 | esac
36 | }
37 |
38 | function payload {
39 | local INPUT=$(eval $(drv "${TYPE}")) # link to drv
40 | local PAYLOAD=$(echo "${INPUT}" | jq -r "$(run)")
41 | printf "${PAYLOAD}"
42 | }
43 |
44 | function drv {
45 | local DRIVER=${1}
46 | printf "${WORKDIR}/drv/drv.${DRIVER}.sh"
47 | }
48 |
--------------------------------------------------------------------------------
/lib/test/new.jq:
--------------------------------------------------------------------------------
1 | ."4" |
2 | (."_metric" | keys[]),
3 | (."_denorm" | keys[])
4 |
--------------------------------------------------------------------------------
/lib/test/object.type.txt:
--------------------------------------------------------------------------------
1 |
2 | # list all object types
3 | https://field-demo.vrni.cmbu.local/api/model/objectTypes?=
4 |
5 | # get fields of object
6 |
7 |
--------------------------------------------------------------------------------
/lib/test/read.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | TOKEN=$(cat vrni.token.txt)
4 | #curl -k --trace-ascii /dev/stdout -X GET \
5 | curl -k -X GET \
6 | -b "vrni.cookies.txt" \
7 | 'https://field-demo.vrni.cmbu.local/api/model/properties?objectType=1' \
8 | -H 'accept: application/json, text/javascript, */*; q=0.01' \
9 | -H 'cache-control: no-cache' \
10 | -H 'dnt: 1' \
11 | -H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36' \
12 | -H 'x-requested-with: XMLHttpRequest' \
13 | -H "x-vrni-csrf-token: $TOKEN"
14 |
--------------------------------------------------------------------------------
/lib/test/sddc.parameters:
--------------------------------------------------------------------------------
1 | {
2 | "dns": "172.16.0.1",
3 | "domain": "lab",
4 | "endpoints": [
5 | {
6 | "type": "vrni",
7 | "hostname": "demo.vrni.local",
8 | "username": "demo",
9 | "password": "demo",
10 | "online": "true"
11 | }
12 | ]
13 | }
14 |
--------------------------------------------------------------------------------
/lib/test/vmvm/vm-vm-model.txt:
--------------------------------------------------------------------------------
1 | https://field-demo.vrni.cmbu.local/api/config/graph?graphLevel=L2_UNDERLAY_OVERLAY&graphType=VM_TO_VM_TOPOLOGY2&listOfObjects=10000%3A1%3A1748993961&listOfObjects=10000%3A1%3A1748994023&includeUnderlay=true&time=1576031880876
2 |
--------------------------------------------------------------------------------
/lib/test/workflow.txt:
--------------------------------------------------------------------------------
1 | # search for results to obtain modelKey
2 | https://field-demo.vrni.cmbu.local/api/search/query?searchString=host×tamp=1576046206507&timeRangeString=%20at%20Now%20&includeObjects=false&includeFacets=true&includeMetrics=false&includeEvents=false&startIndex=0&maxItemCount=10&dateTimeZone=%2B11%3A00&sourceString=USER&includeModelKeyOnly=false
3 |
4 | https://field-demo.vrni.cmbu.local/api/search/query?searchString=host&includeObjects=false&includeModelKeyOnly=false
5 |
6 | # post to config/objects with JSON body of {"requests":[{"modelKey":"10000:4:141736118"}]}
7 | https://field-demo.vrni.cmbu.local/api/config/objects
8 |
--------------------------------------------------------------------------------
/lib/vrni.application.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | TOKEN=$(cat vrni.token.txt)
4 | URL='https://10.196.164.25/api/ni/groups/applications?size=10'
5 |
6 | RESPONSE=$(curl -k -X GET --header 'Accept: application/json' \
7 | --header "Authorization: NetworkInsight ${TOKEN}" \
8 | "${URL}" 2>/dev/null)
9 |
10 | printf "${RESPONSE}" | jq --tab .
11 |
12 | APPID=$(printf "${RESPONSE}" | jq -r '.results[0].entity_id')
13 |
14 | #printf "${APPID}"
15 |
--------------------------------------------------------------------------------
/lib/vrni.application.tiers.get.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | APPID="${1}"
4 | TOKEN=$(cat vrni.token.txt)
5 | URL="https://10.196.164.25/api/ni/groups/applications/${APPID}/tiers"
6 |
7 | RESPONSE=$(curl -k -X GET --header 'Accept: application/json' \
8 | --header "Authorization: NetworkInsight ${TOKEN}" \
9 | "${URL}" 2>/dev/null)
10 |
11 | printf "${RESPONSE}" | jq --tab .
12 |
--------------------------------------------------------------------------------
/lib/vrni.login.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | read -r -d '' BBODY <<-CONFIG
4 | {
5 | "username": "demouser@cmbu.local",
6 | "password": "demoVMware1!",
7 | "domain": {
8 | "domain_type": "LOCAL"
9 | }
10 | }
11 | CONFIG
12 | read -r -d '' BODY <<-CONFIG
13 | {
14 | "username": "aobersnel@vmware.com",
15 | "password": "WanObi323#@#",
16 | "domain": {
17 | "domain_type": "LDAP",
18 | "value": "vmware.com"
19 | }
20 | }
21 | CONFIG
22 |
23 | URL='https://field-demo.vrni.cmbu.local/api/ni/auth/token'
24 |
25 | RESPONSE=$(curl -k -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' \
26 | -d "${BODY}" \
27 | "${URL}" 2>/dev/null)
28 |
29 | printf "${RESPONSE}" | jq --tab . 1>&2
30 | printf "${RESPONSE}" | jq -r '.token' > vrni.token.txt
31 |
--------------------------------------------------------------------------------
/lib/vrni.token.txt:
--------------------------------------------------------------------------------
1 | uglJlnqCNyQlK1MjFyrpDA==
2 |
--------------------------------------------------------------------------------
/mapping.md:
--------------------------------------------------------------------------------
1 | ### Need to work out mapping workflow
2 | ### Turn into a script
3 |
4 | # pick a VM
5 | # look at flows to and from VM
6 | # group by other VMs
7 | # work out total sum of traffic
8 | # work out top N talkers to and from VM
9 | # include top N in application group
10 |
11 |
--------------------------------------------------------------------------------
/metrics/cmd:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/([^/]+)$ ]]; then ## offload to mod.header
3 | WORKDIR=${BASH_REMATCH[1]}
4 | FILE=${BASH_REMATCH[2]}
5 | if [[ ${FILE} =~ ^[^.]+[.](.+)[.]sh$ ]]; then
6 | TYPE=${BASH_REMATCH[1]}
7 | fi
8 | fi
9 | STATEDIR=${WORKDIR}/drv/state
10 | JQDIR=${WORKDIR}/jq
11 | source ${WORKDIR}/drv/mod.core
12 |
13 | # build filter
14 | function cmd {
15 | local COMMAND=${1}
16 | case "${COMMAND}" in
17 | watch)
18 | watch -t -c -n 3 "${WORKDIR}/${FILE} 2>/dev/null"
19 | ;;
20 | json)
21 | local PAYLOAD=$(payload)
22 | setContext "${PAYLOAD}" "${TYPE}"
23 | echo "${PAYLOAD}" | jq --tab .
24 | ;;
25 | filter)
26 | local FILTER=${2}
27 | local PAYLOAD=$(filter "$(payload)" "${FILTER}")
28 | setContext "${PAYLOAD}" "${TYPE}"
29 | buildTable "${PAYLOAD}"
30 | ;;
31 | *)
32 | local PAYLOAD=$(payload)
33 | setContext "${PAYLOAD}" "${TYPE}"
34 | buildTable "${PAYLOAD}"
35 | ;;
36 | esac
37 | }
38 |
39 | function payload {
40 | local INPUT=$(eval $(drv "${TYPE}")) # link to drv
41 | local PAYLOAD=$(echo "${INPUT}" | jq -r "$(jqspec)")
42 | printf "${PAYLOAD}"
43 | }
44 |
45 | function drv {
46 | local DRIVER=${1}
47 | printf "${WORKDIR}/drv/drv.${DRIVER}.sh"
48 | }
49 |
50 | function jqspec {
51 | printf '%s' "$(<${JQDIR}/host.jq)"
52 | }
53 |
54 | ## cmd
55 | cmd "${@}"
56 |
--------------------------------------------------------------------------------
/metrics/cmd.data.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $(readlink -f $0) =~ ^(.*)/([^/]+)$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | fi
5 | printf "%s\n" "${WORKDIR}"
6 | source ${WORKDIR}/mod.command
7 |
8 | function run {
9 | printf '%s' "$(<${JQDIR}/host.jq)"
10 | }
11 |
12 | ## cmd
13 | cmd "${@}"
14 |
--------------------------------------------------------------------------------
/metrics/cmd.result.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/([^/]+)$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | fi
5 | source ${WORKDIR}/mod.command
6 |
7 | function run {
8 | read -r -d '' SPEC <<-CONFIG
9 | . | if (. != null) then map({
10 | "modelKey": .modelKey,
11 | "name": .name
12 | }) else "" end
13 | CONFIG
14 | printf "${SPEC}"
15 | }
16 |
17 | ## cmd
18 | cmd "${@}"
19 |
--------------------------------------------------------------------------------
/metrics/completions.sh:
--------------------------------------------------------------------------------
1 | ## api for query completions
2 |
3 | https://field-demo.vrni.cmbu.local/api/search/completions?partialQuery=hosts+where+name+&fullQuery=hosts+where+name+&maxCompletions=70
4 |
--------------------------------------------------------------------------------
/metrics/drv.search.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | urlencode() {
4 | # urlencode
5 | old_lc_collate=$LC_COLLATE
6 | LC_COLLATE=C
7 | local length="${#1}"
8 | for (( i = 0; i < length; i++ )); do
9 | local c="${1:i:1}"
10 | case $c in
11 | [a-zA-Z0-9.~_-]) printf "$c" ;;
12 | *) printf '%%%02X' "'$c" ;;
13 | esac
14 | done
15 | LC_COLLATE=$old_lc_collate
16 | }
17 |
18 | urldecode() {
19 | # urldecode
20 | local url_encoded="${1//+/ }"
21 | printf '%b' "${url_encoded//%/\\x}"
22 | }
23 |
24 | SEARCH="hosts+where+VM+Count+%3E+10"
25 | #SEARCH=${1}
26 | STATEDIR="."
27 | TOKEN=$(<${STATEDIR}/vrni.token.txt)
28 | QUERY=$(urlencode "${SEARCH}")
29 | RESULT=$(curl -k -X GET \
30 | -b "{STATEDIR}/vrni.cookies.txt" \
31 | -H 'accept: application/json' \
32 | -H "x-vrni-csrf-token: $TOKEN" \
33 | "https://field-demo.vrni.cmbu.org/api/search/query?searchString=${QUERY}&includeObjects=false&includeModelKeyOnly=false&startIndex=0&maxItemCount=10" \
34 | 2>/dev/null)
35 |
36 | read -r -d '' SPEC <<-CONFIG
37 | .resultList | if (. != null) then {
38 | "requests": map(
39 | .searchContext | {
40 | "modelKey": .modelKey
41 | })
42 | } else "" end
43 | CONFIG
44 |
45 | printf '%s' "${RESULT}" | jq --tab "${SPEC}"
46 | printf '%s' "${RESULT}" | jq --tab "${SPEC}" >${STATEDIR}/result.json
47 |
48 | #./drv/drv.objects.list.sh
49 |
50 | #'https://field-demo.vrni.cmbu.local/api/search/query?searchString=host&includeObjects=false&includeFacets=true&includeMetrics=false&includeEvents=false&includeModelKeyOnly=false&startIndex=0&maxItemCount=10'
51 | #'https://field-demo.vrni.cmbu.local/api/search/query?searchString=host&includeObjects=true&includeModelKeyOnly=false'
52 |
53 | #printf '%s' "${RESULT}" | jq --tab .
54 |
--------------------------------------------------------------------------------
/metrics/drv.vrni.client:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [ -z ${WORKDIR} ]; then
3 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
4 | WORKDIR=${BASH_REMATCH[1]}
5 | fi
6 | if [[ $0 == "bash" ]]; then
7 | WORKDIR="."
8 | fi
9 | fi
10 | if [ -z ${SDDCDIR} ]; then
11 | SDDCDIR=${WORKDIR}
12 | fi
13 | if [ -z ${STATEDIR} ]; then
14 | STATEDIR="${WORKDIR}/state"
15 | fi
16 | if [ ! -d ${STATEDIR} ]; then
17 | mkdir ${STATEDIR}
18 | fi
19 | source ${WORKDIR}/mod.core
20 |
21 | PARAMS=$(cat ${SDDCDIR}/sddc.parameters)
22 | DOMAIN=$(echo "${PARAMS}" | jq -r '.domain')
23 | SPEC=$(echo "${PARAMS}" | jq -r '.endpoints[] | select(.type=="vrni")')
24 | VRNIHOST=$(echo "$SPEC" | jq -r '.hostname')
25 | if [[ ! "$VRNIHOST" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
26 | if [[ ! "$VRNIHOST" =~ [.] ]]; then
27 | VRNIHOST+=".$DOMAIN" #if not an IP or FQDN, append domain
28 | fi
29 | fi
30 | VRNIUSER=$(echo "$SPEC" | jq -r '.username')
31 | VRNIPASS=$(echo "$SPEC" | jq -r '.password')
32 | VRNIONLINE=$(echo "$SPEC" | jq -r '.online')
33 | VRNISESSION="${STATEDIR}/vrni.token.txt"
34 | VRNIBASE="https://${VRNIHOST}/api/ni/"
35 |
36 | function vrniLogin {
37 | local URL="https://${VRNIHOST}/api/ni/auth/token"
38 | read -r -d '' VRNIBODY <<-CONFIG
39 | {
40 | "username": "${VRNIUSER}",
41 | "password": "${VRNIPASS}",
42 | "domain": {
43 | "domain_type": "LDAP",
44 | "value": "vmware.com"
45 | }
46 | }
47 | CONFIG
48 | #local RESPONSE=$(curl -k -w "%{http_code}" -X POST \
49 | local RESPONSE=$(curl -k -c "${STATEDIR}/vrni.cookies.txt" -D "${STATEDIR}/vrni.headers.txt" -w "%{http_code}" -X POST \
50 | -H 'Content-Type: application/json' \
51 | -H 'Accept: application/json' \
52 | -d "$VRNIBODY" \
53 | "${URL}" 2>/dev/null)
54 | local RESULT=$(isSuccess "${RESPONSE}")
55 | local CODE=$(getCode "${RESPONSE}")
56 | if [[ $CODE =~ 2..$ ]]; then
57 | local TOKEN=$(echo $RESULT | jq -r '.token')
58 | printf "%s\n" "${TOKEN}"
59 | fi
60 | }
61 |
62 | function vrniSession {
63 | local SESSION=$VRNISESSION
64 | local ONLINE=$VRNIONLINE
65 | if [[ "$ONLINE" == "true" ]]; then
66 | local RUNFIND="$(find ${SESSION} -mmin -10 2>/dev/null)"
67 | if [[ -z ${RUNFIND} ]]; then
68 | printf "No valid session found, authenticating... " 1>&2
69 | local LOGIN=$(vrniLogin)
70 | if [[ -n ${LOGIN} ]]; then
71 | echo "${LOGIN}" >"$SESSION"
72 | fi
73 | fi
74 | fi
75 | printf "%s\n" "$(cat "${SESSION}" 2>/dev/null)"
76 | }
77 |
78 | function vrniPost {
79 | local URL=${1}
80 | local BODY=${2}
81 | if [[ "$VRNIONLINE" == "true" ]]; then
82 | RESPONSE=$(curl -k -w "%{http_code}" -X POST \
83 | -H "Content-Type: application/json" \
84 | -H 'Accept: application/json' \
85 | -H "Authorization: NetworkInsight $(cat ${VRNISESSION})" \
86 | -d "$BODY" \
87 | "${URL}" 2>/dev/null)
88 | RESULT=$(isSuccess "${RESPONSE}")
89 | else
90 | printf "[$(ccyan "OFFLINE")] - SUCCESS\n" 1>&2
91 | fi
92 | printf "%s\n" "${RESULT}" | jq --tab .
93 | }
94 |
95 | function vrniGet {
96 | local URL=${1}
97 | local BASE=${VRNIBASE}
98 | local ONLINE="${VRNIONLINE}"
99 | local STATE
100 | if [[ "$ONLINE" == "true" ]]; then
101 | local SUCCESS=$(vrniSession)
102 | local FILE=$(getFile "${URL}" "${BASE}")
103 | STATE="${STATEDIR}/vrni${FILE}"
104 |
105 | ### DEBUG ###
106 | curl -k --trace-ascii /dev/stdout -b "${STATEDIR}/vrni.cookies.txt" -D "${STATEDIR}/vrni.headers.txt" -w "%{http_code}" -X GET \
107 | -H 'Accept: application/json' \
108 | -H 'Origin: https://field-demo.vrni.cmbu.local' \
109 | -H 'x-vrni-csrf-token: RW6X9sZkHvNM+rJLFlEpaQ==' \
110 | "${URL}" 1>&2
111 | ### DEBUG ###
112 | #-H "Authorization: NetworkInsight $(cat ${VRNISESSION})" \
113 |
114 | #RESPONSE=$(curl -k -w "%{http_code}" -X GET \
115 | # -H "Content-Type: application/json" \
116 | # -H 'Accept: application/json' \
117 | # -H 'Origin: https://field-demo.vrni.cmbu.local' \
118 | # -H 'x-vrni-csrf-token: RW6X9sZkHvNM+rJLFlEpaQ==' \
119 | # -H "Authorization: NetworkInsight $(cat ${VRNISESSION})" \
120 | #"${URL}" 2>/dev/null)
121 | #RESULT=$(isSuccess "${RESPONSE}")
122 | else
123 | printf "[$(ccyan "OFFLINE")] - SUCCESS\n" 1>&2
124 | RESULT=$(cat "${URL}")
125 | STATE="${URL}"
126 | fi
127 | #printf "%s\n" "${RESULT}" | jq --tab . >"${STATE}"
128 | printf "%s\n" "${RESULT}" | jq --tab .
129 | }
130 |
131 | function buildURL {
132 | local ENDPOINT="${1}"
133 | local BASE="${VRNIBASE}"
134 | local STATE="${STATEDIR}"
135 | local ONLINE="${VRNIONLINE}"
136 | if [[ "$ONLINE" == "true" ]]; then
137 | local SUCCESS=$(vrniSession)
138 | if [[ -n ${SUCCESS} ]]; then
139 | URL="$BASE$ENDPOINT"
140 | else
141 | URL="" #failed to obtain valid session
142 | fi
143 | else
144 | local FILE=$(getFile "${ENDPOINT}")
145 | URL="${STATE}/vrni${FILE}"
146 | fi
147 | printf "$URL"
148 | }
149 |
--------------------------------------------------------------------------------
/metrics/drv/drv.data.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | printf "%s\n" "DRIVER: ${WORKDIR} : ${STATEDIR} : ${PARENT}" 1>&2
4 |
5 | if [[ $(readlink -f $0) =~ ^(.*)/[^/]+$ ]]; then
6 | printf "%s\n" "MOO"
7 | source ${BASH_REMATCH[1]}/mod.core
8 | fi
9 |
10 | printf "%s\n" "DRIVER: ${WORKDIR} : ${STATEDIR} : ${PARENT}" 1>&2
11 |
12 | #printf '%s' $(<${STATEDIR}/data.json) | jq --tab .
13 |
--------------------------------------------------------------------------------
/metrics/drv/drv.metrics.get.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | fi
5 | source ${WORKDIR}/drv.vrni.client
6 |
7 | # inputs
8 | #ITEM="schema/Flow/metrics"
9 | #ITEM="entities/flows/10000:515:826709463"
10 | ITEM="entities/flows/10000:515:569626449"
11 |
12 | # run
13 | run() {
14 | URL=$(buildURL "${ITEM}")
15 | if [[ -n "${URL}" ]]; then
16 | printf "[$(cgreen "INFO")]: vrni [$(cgreen "list")] ${ITEM} [$(cgreen "${URL}")]... " 1>&2
17 | vrniGet "${URL}"
18 | fi
19 | }
20 | run
21 |
22 |
--------------------------------------------------------------------------------
/metrics/drv/drv.objects.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [ -z ${WORKDIR} ]; then
3 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
4 | WORKDIR=${BASH_REMATCH[1]}
5 | fi
6 | if [[ $0 == "bash" ]]; then
7 | WORKDIR="."
8 | fi
9 | fi
10 | source ${WORKDIR}/mod.core
11 |
12 | #printf "%s\n" "${0} : ${WORKDIR} : ${STATEDIR}"
13 |
14 | TOKEN=$(cat ${STATEDIR}/vrni.token.txt)
15 | BODY=$(<${STATEDIR}/result.json)
16 | RESULT=$(curl -k -b "${STATEDIR}/vrni.cookies.txt" -X POST \
17 | -H 'accept: application/json' \
18 | -H 'content-type: application/json' \
19 | -H "x-vrni-csrf-token: $TOKEN" \
20 | -d "${BODY}" \
21 | "https://field-demo.vrni.cmbu.local/api/config/objects" 2>/dev/null)
22 |
23 | printf '%s' "${RESULT}" | jq --tab . >${STATEDIR}/data.json
24 |
--------------------------------------------------------------------------------
/metrics/drv/drv.result.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | fi
5 | source ${WORKDIR}/drv.vrni.client
6 |
7 | printf '%s' $(cat ${WORKDIR}/result.json) | jq --tab .
8 |
--------------------------------------------------------------------------------
/metrics/drv/drv.vrni.client:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [ -z ${WORKDIR} ]; then
3 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
4 | WORKDIR=${BASH_REMATCH[1]}
5 | fi
6 | if [[ $0 == "bash" ]]; then
7 | WORKDIR="."
8 | fi
9 | fi
10 | if [ -z ${SDDCDIR} ]; then
11 | SDDCDIR=${WORKDIR}
12 | fi
13 | STATEDIR="${WORKDIR}/state"
14 | if [ ! -d ${STATEDIR} ]; then
15 | mkdir ${STATEDIR}
16 | fi
17 | source ${WORKDIR}/mod.core
18 |
19 | PARAMS=$(cat ${SDDCDIR}/sddc.parameters)
20 | DOMAIN=$(echo "${PARAMS}" | jq -r '.domain')
21 | SPEC=$(echo "${PARAMS}" | jq -r '.endpoints[] | select(.type=="vrni")')
22 | VRNIHOST=$(echo "$SPEC" | jq -r '.hostname')
23 | if [[ ! "$VRNIHOST" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
24 | if [[ ! "$VRNIHOST" =~ [.] ]]; then
25 | VRNIHOST+=".$DOMAIN" #if not an IP or FQDN, append domain
26 | fi
27 | fi
28 | VRNIUSER=$(echo "$SPEC" | jq -r '.username')
29 | VRNIPASS=$(echo "$SPEC" | jq -r '.password')
30 | VRNIONLINE=$(echo "$SPEC" | jq -r '.online')
31 | VRNISESSION="${STATEDIR}/vrni.token.txt"
32 | VRNIBASE="https://${VRNIHOST}/api/ni/"
33 |
34 | function vrniLogin {
35 | local URL="https://${VRNIHOST}/api/ni/auth/token"
36 | read -r -d '' VRNIBODY <<-CONFIG
37 | {
38 | "username": "${VRNIUSER}",
39 | "password": "${VRNIPASS}",
40 | "domain": {
41 | "domain_type": "LDAP",
42 | "value": "vmware.com"
43 | }
44 | }
45 | CONFIG
46 | #local RESPONSE=$(curl -k -w "%{http_code}" -X POST \
47 | local RESPONSE=$(curl -k -c "${STATEDIR}/vrni.cookies.txt" -D "${STATEDIR}/vrni.headers.txt" -w "%{http_code}" -X POST \
48 | -H 'Content-Type: application/json' \
49 | -H 'Accept: application/json' \
50 | -d "${VRNIBODY}" \
51 | "${URL}" 2>/dev/null)
52 | local RESULT=$(isSuccess "${RESPONSE}")
53 | local CODE=$(getCode "${RESPONSE}")
54 | if [[ $CODE =~ 2..$ ]]; then
55 | local TOKEN=$(echo $RESULT | jq -r '.token')
56 | printf "%s\n" "${TOKEN}"
57 | #else
58 | # printf "%s\n" "${VRNIHOST}" 1>&2
59 | fi
60 | }
61 |
62 | function vrniSession {
63 | local SESSION=$VRNISESSION
64 | local ONLINE=$VRNIONLINE
65 | if [[ "$ONLINE" == "true" ]]; then
66 | local RUNFIND="$(find ${SESSION} -mmin -10 2>/dev/null)"
67 | if [[ -z ${RUNFIND} ]]; then
68 | printf "No valid session found, authenticating... " 1>&2
69 | local LOGIN=$(vrniLogin)
70 | if [[ -n ${LOGIN} ]]; then
71 | echo "${LOGIN}" >"$SESSION"
72 | fi
73 | fi
74 | fi
75 | printf "%s\n" "$(cat "${SESSION}" 2>/dev/null)"
76 | }
77 |
78 | function vrniPost {
79 | local URL=${1}
80 | local BODY=${2}
81 | if [[ "$VRNIONLINE" == "true" ]]; then
82 | RESPONSE=$(curl -k -w "%{http_code}" -X POST \
83 | -H "Content-Type: application/json" \
84 | -H 'Accept: application/json' \
85 | -H "Authorization: NetworkInsight $(cat ${VRNISESSION})" \
86 | -d "$BODY" \
87 | "${URL}" 2>/dev/null)
88 | RESULT=$(isSuccess "${RESPONSE}")
89 | else
90 | printf "[$(ccyan "OFFLINE")] - SUCCESS\n" 1>&2
91 | fi
92 | printf "%s\n" "${RESULT}" | jq --tab .
93 | }
94 |
95 | function vrniGet {
96 | local URL=${1}
97 | local BASE=${VRNIBASE}
98 | local ONLINE="${VRNIONLINE}"
99 | local STATE
100 | if [[ "$ONLINE" == "true" ]]; then
101 | local SUCCESS=$(vrniSession)
102 | local FILE=$(getFile "${URL}" "${BASE}")
103 | STATE="${STATEDIR}/vrni${FILE}"
104 |
105 | ### DEBUG ###
106 | #curl -k --trace-ascii /dev/stdout -b "${STATEDIR}/vrni.cookies.txt" -D "${STATEDIR}/vrni.headers.txt" -w "%{http_code}" -X GET \
107 | # -H 'Accept: application/json' \
108 | # -H 'Origin: https://field-demo.vrni.cmbu.local' \
109 | # -H "Authorization: NetworkInsight $(cat ${VRNISESSION})" \
110 | #"${URL}" 1>&2
111 | ### DEBUG ###
112 | # -H 'x-vrni-csrf-token: RW6X9sZkHvNM+rJLFlEpaQ==' \
113 |
114 | RESPONSE=$(curl -k -w "%{http_code}" -X GET \
115 | -H 'Accept: application/json' \
116 | -H "Authorization: NetworkInsight $(cat ${VRNISESSION})" \
117 | "${URL}" 2>/dev/null)
118 | # -H 'Origin: https://field-demo.vrni.cmbu.local' \
119 | RESULT=$(isSuccess "${RESPONSE}")
120 | else
121 | printf "[$(ccyan "OFFLINE")] - SUCCESS\n" 1>&2
122 | RESULT=$(cat "${URL}")
123 | STATE="${URL}"
124 | fi
125 | #printf "%s\n" "${RESULT}" | jq --tab . >"${STATE}"
126 | printf "%s\n" "${RESULT}" | jq --tab .
127 | }
128 |
129 | function buildURL {
130 | local ENDPOINT="${1}"
131 | local BASE="${VRNIBASE}"
132 | local STATE="${STATEDIR}"
133 | local ONLINE="${VRNIONLINE}"
134 | if [[ "$ONLINE" == "true" ]]; then
135 | local SUCCESS=$(vrniSession)
136 | if [[ -n ${SUCCESS} ]]; then
137 | URL="$BASE$ENDPOINT"
138 | else
139 | URL="" #failed to obtain valid session
140 | fi
141 | else
142 | local FILE=$(getFile "${ENDPOINT}")
143 | URL="${STATE}/vrni${FILE}"
144 | fi
145 | printf "$URL"
146 | }
147 |
--------------------------------------------------------------------------------
/metrics/drv/mod.core:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | printf "%s\n" "BEFORE ${WORKDIR} : ${STATEDIR} : ${PARENT}"
3 |
4 | if [[ -n ${WORKDIR} ]]; then
5 | PARENT=${WORKDIR}
6 | else
7 | PARENT="."
8 | fi
9 | if [[ $(readlink -f $0) =~ ^(.*)/([^/]+)$ ]]; then
10 | WORKDIR="${BASH_REMATCH[1]}"
11 | CALLED="${BASH_REMATCH[2]}"
12 | fi
13 | if [ -z ${STATEDIR} ]; then
14 | STATEDIR="${PARENT}/state"
15 | fi
16 | if [ ! -d ${STATEDIR} ]; then
17 | mkdir ${STATEDIR}
18 | fi
19 |
20 | printf "%s\n" "AFTER ${WORKDIR} : ${STATEDIR} : ${PARENT}"
21 |
22 | # detect available cmds
23 | commands() {
24 | #echo "-- [COMMANDS] --"
25 | printf "%s" "list"
26 | for FILE in ${WORKDIR}/cmd.*.sh; do
27 | if [[ $FILE =~ cmd[.](.+)[.]sh ]]; then
28 | printf " %s" "${BASH_REMATCH[1]}"
29 | fi
30 | done
31 | exit 1
32 | }
33 | if [[ -n "$1" && ${CALLED} == "mod.core" ]]; then
34 | case "${1}" in
35 | list) ## list commands
36 | commands
37 | ;;
38 | setup-params) ## output sddc.parameters
39 | cat ${WORKDIR}/sddc.parameters
40 | ;;
41 | setup-bash) ## output bash-cli
42 | cat ${WORKDIR}/bash-cli
43 | ;;
44 | *) ## execute command
45 | if [ -f "${WORKDIR}/cmd.${1}.sh" ]; then
46 | eval "${WORKDIR}/cmd.${1}.sh ${2} ${3} ${4}"
47 | fi
48 | ;;
49 | esac
50 | fi
51 |
52 | # get OSNAME
53 | OSNAME="$(uname -s)"
54 | case "${OSNAME}" in
55 | Linux*)
56 | #printf "HAHA you run a L:${OSNAME}\n" 1>&2
57 | ;;
58 | Darwin*)
59 | #printf "HAHA you run a D:${OSNAME}\n" 1>&2
60 | ;;
61 | esac
62 |
63 | # COLOURS
64 | #RED=$'\e[31;1m'
65 | #CYAN=$'\e[36;1m'
66 | #GREEN='\e[32;1m' # light green
67 | #ORANGE=$'\e[33;1m' # orange
68 | #BLUE=$'\e[34;1m' # light blue
69 | #NC=$'\e[31;00m'
70 |
71 | #NC='\033[0;00m' # no colour
72 | BLACK='\033[0;30m' # black
73 | RED='\033[0;31m' # red
74 | #GREEN='\033[0;32m' # orange
75 | #ORANGE='\033[0;33m' # orange
76 | BLUE='\033[0;34m' # blue
77 | PURPLE='\033[0;35m' # purple
78 | #CYAN='\033[0;36m' # cyan
79 |
80 | NC='\e[0;00m' # no colour
81 | GREEN='\e[0;32m' # orange
82 | ORANGE='\e[0;33m' # orange
83 | CYAN='\e[0;36m' # cyan
84 | #LIGHTGREY='\033[0;37m' # light grey
85 | #DARKGREY='\033[0;30m' # dark grey
86 | #LIGHTRED='\033[0;31m' # light red
87 | #LIGHTGREEN='\033[0;32m' # light green
88 | #YELLOW='\033[0;33m' # yellow
89 | #LIGHTBLUE='\033[0;34m' # light blue
90 | #LBLUE='\033[33;1m' ## test
91 | #WHITE='\033[0;37m' # white
92 |
93 | function corange {
94 | local STRING=${1}
95 | printf '%s' "${ORANGE}${STRING}${NC}"
96 | }
97 | function cgreen {
98 | local STRING=${1}
99 | printf '%s' "${GREEN}${STRING}${NC}"
100 | }
101 | function ccyan {
102 | local STRING=${1}
103 | printf '%s' "${CYAN}${STRING}${NC}"
104 | }
105 |
106 | function isSuccess {
107 | local STRING=${1}
108 | local SESSION=${2}
109 | local CODE=$(getCode "${STRING}")
110 | local VALID
111 | printf "[$(ccyan "${CODE}")] - " 1>&2
112 | case $CODE in
113 | 2[0-9][0-9])
114 | printf "SUCCESS\n" 1>&2
115 | VALID="1"
116 | ;;
117 | 400)
118 | printf "ERROR\n" 1>&2
119 | ;;
120 | 40[1-3])
121 | printf "ERROR-AUTH\n" 1>&2
122 | ;;
123 | 404)
124 | printf "ERROR-NOTFOUND\n" 1>&2
125 | ;;
126 | *)
127 | printf "ERROR\n" 1>&2
128 | ;;
129 | esac
130 | if [[ -z "${VALID}" && -f "${SESSION}" ]]; then
131 | rm "${SESSION}" 2>/dev/null
132 | fi
133 | local BODY=$(getBody "${STRING}")
134 | printf "%s\n" "${BODY}"
135 | }
136 |
137 | function getCode {
138 | local STRING=${1}
139 | if [[ $STRING =~ ^(.*)([0-9]{3})$ ]]; then
140 | local BODY=${BASH_REMATCH[1]}
141 | local CODE=${BASH_REMATCH[2]}
142 | fi
143 | printf "%s\n" "${CODE}"
144 | }
145 |
146 | function getBody {
147 | local STRING=${1}
148 | if [[ $STRING =~ ^(.*)([0-9]{3})$ ]]; then
149 | local BODY=${BASH_REMATCH[1]}
150 | local CODE=${BASH_REMATCH[2]}
151 | fi
152 | printf "%s\n" "${BODY}"
153 | }
154 |
155 | function getFile {
156 | local ENDPOINT=${1}
157 | local BASE=${2}
158 | local STATE
159 | if [[ -n $BASE ]]; then
160 | REGEX="^($BASE)"
161 | if [[ $ENDPOINT =~ $REGEX ]]; then
162 | ENDPOINT=${ENDPOINT#*"${BASH_REMATCH[1]}"}
163 | fi
164 | fi
165 | while [[ $ENDPOINT =~ ([^/]+) ]]; do
166 | ENDPOINT=${ENDPOINT#*"${BASH_REMATCH[1]}"}
167 | STATE+=".${BASH_REMATCH[1]}"
168 | done
169 | STATE+=".json"
170 | printf "%s" "${STATE}"
171 | }
172 |
173 | function getThumbprint {
174 | local HOST="${1}"
175 | local PAYLOAD=$(echo -n | openssl s_client -connect "${HOST}" 2>/dev/null)
176 | local PRINT=$(echo "$PAYLOAD" | openssl x509 -noout -fingerprint -sha256)
177 | local REGEX='^(.*)=(([0-9A-Fa-f]{2}[:])+([0-9A-Fa-f]{2}))$'
178 | if [[ $PRINT =~ $REGEX ]]; then
179 | local TYPE=${BASH_REMATCH[1]}
180 | local CODE=${BASH_REMATCH[2]}
181 | fi
182 | printf "%s\n" "${CODE}" | sed "s/\(.*\)/\L\1/g" | sed "s/://g"
183 | }
184 |
185 | function getCertificate {
186 | local HOST="${1}"
187 | local PAYLOAD=$(echo -n | openssl s_client -connect "${HOST}" 2>/dev/null)
188 | local RESULT=$(echo "${PAYLOAD}" | sed -e '1h;2,$H;$!d;g' -e 's/.*\(-----BEGIN\sCERTIFICATE-----.*-----END\sCERTIFICATE-----\).*/\1/g')
189 | printf "%s\n" "$RESULT" | sed ':a;N;$!ba;s/\n/\\\\n/g'
190 | }
191 |
192 | function buildTable {
193 | local INPUT="${1}" # change first entry to color, separate from data body
194 | read -r -d '' JQTABLE <<-CONFIG
195 | if (.[0]?) then
196 | [(
197 | [.[0] | to_entries[] | "<" + .key + ">"]
198 | ),(
199 | .[] | [to_entries[] | .value]
200 | )]
201 | else . end
202 | CONFIG
203 | local HEADER="1"
204 | echo "$INPUT" | jq -r "$JQTABLE | .[] | @tsv" | column -t -s $'\t' | while read -r LINE; do
205 | if [[ -n $HEADER ]]; then
206 | printf "${CYAN}${LINE}${NC}\n"
207 | HEADER=""
208 | else
209 | printf "$LINE\n";
210 | fi
211 | done
212 | }
213 |
214 | function buildTest {
215 | local INPUT="${1}" # change first entry to color, separate from data body
216 | read -r -d '' JQTABLE <<-CONFIG
217 | if (.[0]?) then
218 | [(
219 | [.[0] | to_entries[] | "${BLUE}<" + .key + ">${NC}"]
220 | ),(
221 | .[] | [to_entries[] | "${NC}" + .value + "${NC}"]
222 | )]
223 | else . end
224 | CONFIG
225 | BODY=$(echo "$INPUT" | jq -r "$JQTABLE | .[] | @tsv" | column -t -s $'\t')
226 | printf "${BODY}\n"
227 | }
228 |
229 | function buildNoColour {
230 | local INPUT="${1}" # change first entry to color, separate from data body
231 | read -r -d '' JQTABLE <<-CONFIG
232 | if (.[0]?) then
233 | [(
234 | [.[0] | to_entries[] | "<" + .key + ">"]
235 | ),(
236 | .[] | [to_entries[] | .value]
237 | )]
238 | else . end
239 | CONFIG
240 | BODY=$(echo "$INPUT" | jq -r "$JQTABLE | .[] | @tsv" | column -t -s $'\t')
241 | printf "${BODY}\n"
242 | }
243 |
244 | ## filter payload with string
245 | function filter {
246 | local PAYLOAD=${1}
247 | local STRING=${2}
248 | while [[ $STRING =~ ([^,]+) ]]; do
249 | local FILTER="${BASH_REMATCH[1]}"
250 | STRING=${STRING#*"${BASH_REMATCH[1]}"}
251 | local FIELD="name"
252 | local VALUE="."
253 | if [[ $FILTER =~ ([^:]+):([^:]*) ]]; then
254 | FIELD=${BASH_REMATCH[1]}
255 | VALUE=${BASH_REMATCH[2]}
256 | else
257 | VALUE="${FILTER}"
258 | fi
259 | read -r -d '' FILTERSPEC <<-CONFIG
260 | map(select(
261 | ."$FIELD" |
262 | if (. != null) then (. | tostring) else "" end
263 | | test("$VALUE";"i")
264 | ))
265 | CONFIG
266 | PAYLOAD=$(echo "$PAYLOAD" | jq -r "$FILTERSPEC")
267 | done
268 | printf "%s\n" "${PAYLOAD}" | jq --tab .
269 | }
270 |
271 | ## set current context
272 | function setContext {
273 | local INPUT="${1}"
274 | local ITEM="${2}"
275 | local STATE="${STATEDIR}/ctx.${ITEM}.json"
276 | local PAYLOAD=$(echo "$INPUT" | jq --tab '.[0]')
277 | if [[ -n "${PAYLOAD}" && "${PAYLOAD}" != null ]]; then
278 | printf "%s\n" "${PAYLOAD}" >"${STATE}"
279 | fi
280 | }
281 |
282 | ## get current context
283 | function getContext {
284 | local FILTER="${1}"
285 | if [[ -z $FILTER ]]; then
286 | FILTER="."
287 | fi
288 | echo "FILTER: ${FILTER}" 1>&2
289 | local PAYLOAD=$("${WORKDIR}"/cmd.context.list.sh "${FILTER}" json | jq '.[0]')
290 | if [[ ! "$PAYLOAD" == null ]]; then
291 | printf "%s\n" "${PAYLOAD}" | jq -r '.id'
292 | fi
293 | }
294 |
--------------------------------------------------------------------------------
/metrics/drv/result.json:
--------------------------------------------------------------------------------
1 | {
2 | "requests": [
3 | {
4 | "modelKey": "10000:4:141732398"
5 | },
6 | {
7 | "modelKey": "10000:4:141732522"
8 | },
9 | {
10 | "modelKey": "10000:4:141734320"
11 | },
12 | {
13 | "modelKey": "10000:4:141735343"
14 | }
15 | ]
16 | }
17 |
--------------------------------------------------------------------------------
/metrics/drv/sddc.parameters:
--------------------------------------------------------------------------------
1 | {
2 | "dns": "172.16.0.1",
3 | "domain": "lab",
4 | "endpoints": [
5 | {
6 | "type": "vrni",
7 | "hostname": "field-demo.vrni.cmbu.org",
8 | "username": "aobersnel@vmware.com",
9 | "password": "WanObi323#@#",
10 | "online": "true"
11 | }
12 | ]
13 | }
14 |
--------------------------------------------------------------------------------
/metrics/jq/host.jq:
--------------------------------------------------------------------------------
1 | .data | if (. != null) then map({
2 | "modelKey": .modelKey,
3 | "name": .name,
4 | "powerState": .serverdataParent.runtime.powerState,
5 | "numCpus": .serverdataParent.numCpus,
6 | "cpuSockets": .serverdataParent.cpuSockets,
7 | "memoryMB": .serverdataParent.memoryMB,
8 | "numVms": .numVms
9 | }) else "" end
10 |
--------------------------------------------------------------------------------
/metrics/login.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | read -r -d '' BBODY <<-CONFIG
4 | {
5 | "username": "demouser@cmbu.local",
6 | "password": "demoVMware1!",
7 | "domain": {
8 | "domain_type": "LOCAL"
9 | }
10 | }
11 | CONFIG
12 | read -r -d '' BODY <<-CONFIG
13 | {
14 | "username": "aobersnel@vmware.com",
15 | "password": "WanObi323#@#",
16 | "domain": {
17 | "domain_type": "LDAP",
18 | "value": "vmware.com"
19 | }
20 | }
21 | CONFIG
22 |
23 | URL='https://field-demo.vrni.cmbu.org/api/ni/auth/token'
24 |
25 | RESPONSE=$(curl -k -X POST \
26 | -c "./vrni.cookies.txt" \
27 | -H 'Content-Type: application/json' \
28 | -H 'Accept: application/json' \
29 | -d "${BODY}" \
30 | "${URL}" 2>/dev/null)
31 |
32 | printf "${RESPONSE}" | jq --tab . 1>&2
33 | printf "${RESPONSE}" | jq -r '.token' > vrni.token.txt
34 |
--------------------------------------------------------------------------------
/metrics/mod.command:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $(readlink -f $0) =~ ^(.*)/([^/]+)$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | FILE=${BASH_REMATCH[2]}
5 | if [[ ${FILE} =~ ^[^.]+[.](.+)[.]sh$ ]]; then
6 | TYPE=${BASH_REMATCH[1]}
7 | fi
8 | fi
9 | STATEDIR=${WORKDIR}/state
10 | JQDIR=${WORKDIR}/jq
11 | source ${WORKDIR}/drv/mod.core
12 |
13 | # build filter
14 | function cmd {
15 | local COMMAND=${1}
16 | case "${COMMAND}" in
17 | watch)
18 | watch -t -c -n 3 "${WORKDIR}/${FILE} 2>/dev/null"
19 | ;;
20 | json)
21 | local PAYLOAD=$(payload)
22 | setContext "${PAYLOAD}" "${TYPE}"
23 | echo "${PAYLOAD}" | jq --tab .
24 | ;;
25 | filter)
26 | local FILTER=${2}
27 | local PAYLOAD=$(filter "$(payload)" "${FILTER}")
28 | setContext "${PAYLOAD}" "${TYPE}"
29 | buildTable "${PAYLOAD}"
30 | ;;
31 | *)
32 | local PAYLOAD=$(payload)
33 | setContext "${PAYLOAD}" "${TYPE}"
34 | buildTable "${PAYLOAD}"
35 | ;;
36 | esac
37 | }
38 |
39 | function payload {
40 | local INPUT=$(eval $(drv "${TYPE}")) # link to drv
41 | local PAYLOAD=$(echo "${INPUT}" | jq -r "$(run)")
42 | printf "${PAYLOAD}"
43 | }
44 |
45 | function drv {
46 | local DRIVER=${1}
47 | printf "${WORKDIR}/drv/drv.${DRIVER}.sh"
48 | }
49 |
--------------------------------------------------------------------------------
/metrics/old.login.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | read -r -d '' LOGIN <<-CONFIG
4 | {
5 | "username": "aobersnel@vmware.com",
6 | "password": "WanObi323#@#",
7 | "domain": {
8 | "domain_type": "LDAP",
9 | "value": "vmware.com"
10 | }
11 | }
12 | CONFIG
13 | STATEDIR="./state"
14 | TOKEN=$(curl -k -X POST \
15 | -c "${STATEDIR}/vrni.cookies.txt" \
16 | https://field-demo.vrni.cmbu.local/api/auth/login \
17 | -H 'accept: application/json' \
18 | -H 'content-type: application/json' \
19 | -d "${BODY}"
20 | 2>/dev/null | jq -r '.csrfToken')
21 |
22 | printf '%s' "${TOKEN}" >${STATEDIR}/vrni.token.txt
23 | printf '%s\n' "${TOKEN}" 1>&2
24 |
25 | #{"username":"demouser@cmbu.local","password":"demoVMware1!","tenantName":"field-demo.vrni.cmbu.local","vIDMURL":"","redirectURL":"","authenticationDomains":{"0":{"domainType":"LDAP","domain":"vmware.com","redirectUrl":""},"1":{"domainType":"LOCAL_DOMAIN","domain":"localdomain","redirectUrl":""}},"currentDomain":1,"domain":"localdomain","nDomains":2,"serverTimestamp":false,"loginFieldPlaceHolder":"Username"}
26 |
--------------------------------------------------------------------------------
/metrics/result.json:
--------------------------------------------------------------------------------
1 | ""
2 |
--------------------------------------------------------------------------------
/metrics/sddc.parameters:
--------------------------------------------------------------------------------
1 | {
2 | "dns": "172.16.0.1",
3 | "domain": "lab",
4 | "endpoints": [
5 | {
6 | "type": "vrni",
7 | "hostname": "field-demo.vrni.cmbu.local",
8 | "username": "demouser@cmbu.local",
9 | "password": "demoVMware1!",
10 | "online": "true"
11 | }
12 | ]
13 | }
14 |
--------------------------------------------------------------------------------
/metrics/vrni.cookies.txt:
--------------------------------------------------------------------------------
1 | # Netscape HTTP Cookie File
2 | # https://curl.haxx.se/docs/http-cookies.html
3 | # This file was generated by libcurl! Edit at your own risk.
4 |
5 | #HttpOnly_field-demo.vrni.cmbu.org FALSE / TRUE 0 VRNI-JSESSIONID 4867c3d9-938b-4a7e-87d5-239274c84958
6 |
--------------------------------------------------------------------------------
/metrics/vrni.token.txt:
--------------------------------------------------------------------------------
1 | wzuJlS7F8NzsUXKlKI7FLg==
2 |
--------------------------------------------------------------------------------
/new/cmd:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/([^/]+)$ ]]; then ## offload to mod.header
3 | WORKDIR=${BASH_REMATCH[1]}
4 | FILE=${BASH_REMATCH[2]}
5 | if [[ ${FILE} =~ ^[^.]+[.](.+)[.]sh$ ]]; then
6 | TYPE=${BASH_REMATCH[1]}
7 | fi
8 | fi
9 | STATEDIR=${WORKDIR}/drv/state
10 | JQDIR=${WORKDIR}/jq
11 | source ${WORKDIR}/drv/mod.core
12 |
13 | # build filter
14 | function cmd {
15 | local COMMAND=${1}
16 | case "${COMMAND}" in
17 | watch)
18 | watch -t -c -n 3 "${WORKDIR}/${FILE} 2>/dev/null"
19 | ;;
20 | json)
21 | local PAYLOAD=$(payload)
22 | setContext "${PAYLOAD}" "${TYPE}"
23 | echo "${PAYLOAD}" | jq --tab .
24 | ;;
25 | filter)
26 | local FILTER=${2}
27 | local PAYLOAD=$(filter "$(payload)" "${FILTER}")
28 | setContext "${PAYLOAD}" "${TYPE}"
29 | buildTable "${PAYLOAD}"
30 | ;;
31 | *)
32 | local PAYLOAD=$(payload)
33 | setContext "${PAYLOAD}" "${TYPE}"
34 | buildTable "${PAYLOAD}"
35 | ;;
36 | esac
37 | }
38 |
39 | function payload {
40 | local INPUT=$(eval $(drv "${TYPE}")) # link to drv
41 | local PAYLOAD=$(echo "${INPUT}" | jq -r "$(jqspec)")
42 | printf "${PAYLOAD}"
43 | }
44 |
45 | function drv {
46 | local DRIVER=${1}
47 | printf "${WORKDIR}/drv/drv.${DRIVER}.sh"
48 | }
49 |
50 | function jqspec {
51 | printf '%s' "$(<${JQDIR}/host.jq)"
52 | }
53 |
54 | ## cmd
55 | cmd "${@}"
56 |
--------------------------------------------------------------------------------
/new/cmd.data.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $(readlink -f $0) =~ ^(.*)/([^/]+)$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | fi
5 | printf "%s\n" "${WORKDIR}"
6 | source ${WORKDIR}/mod.command
7 |
8 | function run {
9 | printf '%s' "$(<${JQDIR}/host.jq)"
10 | }
11 |
12 | ## cmd
13 | cmd "${@}"
14 |
--------------------------------------------------------------------------------
/new/cmd.result.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/([^/]+)$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | fi
5 | source ${WORKDIR}/mod.command
6 |
7 | function run {
8 | read -r -d '' SPEC <<-CONFIG
9 | . | if (. != null) then map({
10 | "modelKey": .modelKey,
11 | "name": .name
12 | }) else "" end
13 | CONFIG
14 | printf "${SPEC}"
15 | }
16 |
17 | ## cmd
18 | cmd "${@}"
19 |
--------------------------------------------------------------------------------
/new/completions.sh:
--------------------------------------------------------------------------------
1 | ## api for query completions
2 |
3 | https://field-demo.vrni.cmbu.local/api/search/completions?partialQuery=hosts+where+name+&fullQuery=hosts+where+name+&maxCompletions=70
4 |
--------------------------------------------------------------------------------
/new/drv.search.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | urlencode() {
4 | # urlencode
5 | old_lc_collate=$LC_COLLATE
6 | LC_COLLATE=C
7 | local length="${#1}"
8 | for (( i = 0; i < length; i++ )); do
9 | local c="${1:i:1}"
10 | case $c in
11 | [a-zA-Z0-9.~_-]) printf "$c" ;;
12 | *) printf '%%%02X' "'$c" ;;
13 | esac
14 | done
15 | LC_COLLATE=$old_lc_collate
16 | }
17 |
18 | urldecode() {
19 | # urldecode
20 | local url_encoded="${1//+/ }"
21 | printf '%b' "${url_encoded//%/\\x}"
22 | }
23 |
24 | SEARCH="hosts+where+VM+Count+%3E+10"
25 | #SEARCH=${1}
26 | STATEDIR="."
27 | TOKEN=$(<${STATEDIR}/vrni.token.txt)
28 | QUERY=$(urlencode "${SEARCH}")
29 | RESULT=$(curl -k -X GET \
30 | -b "{STATEDIR}/vrni.cookies.txt" \
31 | -H 'accept: application/json' \
32 | -H "x-vrni-csrf-token: $TOKEN" \
33 | "https://field-demo.vrni.cmbu.org/api/search/query?searchString=${QUERY}&includeObjects=false&includeModelKeyOnly=false&startIndex=0&maxItemCount=10" \
34 | 2>/dev/null)
35 |
36 | read -r -d '' SPEC <<-CONFIG
37 | .resultList | if (. != null) then {
38 | "requests": map(
39 | .searchContext | {
40 | "modelKey": .modelKey
41 | })
42 | } else "" end
43 | CONFIG
44 |
45 | printf '%s' "${RESULT}" | jq --tab "${SPEC}"
46 | printf '%s' "${RESULT}" | jq --tab "${SPEC}" >${STATEDIR}/result.json
47 |
48 | #./drv/drv.objects.list.sh
49 |
50 | #'https://field-demo.vrni.cmbu.local/api/search/query?searchString=host&includeObjects=false&includeFacets=true&includeMetrics=false&includeEvents=false&includeModelKeyOnly=false&startIndex=0&maxItemCount=10'
51 | #'https://field-demo.vrni.cmbu.local/api/search/query?searchString=host&includeObjects=true&includeModelKeyOnly=false'
52 |
53 | #printf '%s' "${RESULT}" | jq --tab .
54 |
--------------------------------------------------------------------------------
/new/drv.vrni.client:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [ -z ${WORKDIR} ]; then
3 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
4 | WORKDIR=${BASH_REMATCH[1]}
5 | fi
6 | if [[ $0 == "bash" ]]; then
7 | WORKDIR="."
8 | fi
9 | fi
10 | if [ -z ${SDDCDIR} ]; then
11 | SDDCDIR=${WORKDIR}
12 | fi
13 | if [ -z ${STATEDIR} ]; then
14 | STATEDIR="${WORKDIR}/state"
15 | fi
16 | if [ ! -d ${STATEDIR} ]; then
17 | mkdir ${STATEDIR}
18 | fi
19 | source ${WORKDIR}/mod.core
20 |
21 | PARAMS=$(cat ${SDDCDIR}/sddc.parameters)
22 | DOMAIN=$(echo "${PARAMS}" | jq -r '.domain')
23 | SPEC=$(echo "${PARAMS}" | jq -r '.endpoints[] | select(.type=="vrni")')
24 | VRNIHOST=$(echo "$SPEC" | jq -r '.hostname')
25 | if [[ ! "$VRNIHOST" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
26 | if [[ ! "$VRNIHOST" =~ [.] ]]; then
27 | VRNIHOST+=".$DOMAIN" #if not an IP or FQDN, append domain
28 | fi
29 | fi
30 | VRNIUSER=$(echo "$SPEC" | jq -r '.username')
31 | VRNIPASS=$(echo "$SPEC" | jq -r '.password')
32 | VRNIONLINE=$(echo "$SPEC" | jq -r '.online')
33 | VRNISESSION="${STATEDIR}/vrni.token.txt"
34 | VRNIBASE="https://${VRNIHOST}/api/ni/"
35 |
36 | function vrniLogin {
37 | local URL="https://${VRNIHOST}/api/ni/auth/token"
38 | read -r -d '' VRNIBODY <<-CONFIG
39 | {
40 | "username": "${VRNIUSER}",
41 | "password": "${VRNIPASS}",
42 | "domain": {
43 | "domain_type": "LOCAL"
44 | }
45 | }
46 | CONFIG
47 | #local RESPONSE=$(curl -k -w "%{http_code}" -X POST \
48 | local RESPONSE=$(curl -k -c "${STATEDIR}/vrni.cookies.txt" -D "${STATEDIR}/vrni.headers.txt" -w "%{http_code}" -X POST \
49 | -H 'Content-Type: application/json' \
50 | -H 'Accept: application/json' \
51 | -d "$VRNIBODY" \
52 | "${URL}" 2>/dev/null)
53 | local RESULT=$(isSuccess "${RESPONSE}")
54 | local CODE=$(getCode "${RESPONSE}")
55 | if [[ $CODE =~ 2..$ ]]; then
56 | local TOKEN=$(echo $RESULT | jq -r '.token')
57 | printf "%s\n" "${TOKEN}"
58 | fi
59 | }
60 |
61 | function vrniSession {
62 | local SESSION=$VRNISESSION
63 | local ONLINE=$VRNIONLINE
64 | if [[ "$ONLINE" == "true" ]]; then
65 | local RUNFIND="$(find ${SESSION} -mmin -10 2>/dev/null)"
66 | if [[ -z ${RUNFIND} ]]; then
67 | printf "No valid session found, authenticating... " 1>&2
68 | local LOGIN=$(vrniLogin)
69 | if [[ -n ${LOGIN} ]]; then
70 | echo "${LOGIN}" >"$SESSION"
71 | fi
72 | fi
73 | fi
74 | printf "%s\n" "$(cat "${SESSION}" 2>/dev/null)"
75 | }
76 |
77 | function vrniPost {
78 | local URL=${1}
79 | local BODY=${2}
80 | if [[ "$VRNIONLINE" == "true" ]]; then
81 | RESPONSE=$(curl -k -w "%{http_code}" -X POST \
82 | -H "Content-Type: application/json" \
83 | -H 'Accept: application/json' \
84 | -H "Authorization: NetworkInsight $(cat ${VRNISESSION})" \
85 | -d "$BODY" \
86 | "${URL}" 2>/dev/null)
87 | RESULT=$(isSuccess "${RESPONSE}")
88 | else
89 | printf "[$(ccyan "OFFLINE")] - SUCCESS\n" 1>&2
90 | fi
91 | printf "%s\n" "${RESULT}" | jq --tab .
92 | }
93 |
94 | function vrniGet {
95 | local URL=${1}
96 | local BASE=${VRNIBASE}
97 | local ONLINE="${VRNIONLINE}"
98 | local STATE
99 | if [[ "$ONLINE" == "true" ]]; then
100 | local SUCCESS=$(vrniSession)
101 | local FILE=$(getFile "${URL}" "${BASE}")
102 | STATE="${STATEDIR}/vrni${FILE}"
103 |
104 | ### DEBUG ###
105 | curl -k --trace-ascii /dev/stdout -b "${STATEDIR}/vrni.cookies.txt" -D "${STATEDIR}/vrni.headers.txt" -w "%{http_code}" -X GET \
106 | -H 'Accept: application/json' \
107 | -H 'Origin: https://field-demo.vrni.cmbu.local' \
108 | -H 'x-vrni-csrf-token: RW6X9sZkHvNM+rJLFlEpaQ==' \
109 | "${URL}" 1>&2
110 | ### DEBUG ###
111 | #-H "Authorization: NetworkInsight $(cat ${VRNISESSION})" \
112 |
113 | #RESPONSE=$(curl -k -w "%{http_code}" -X GET \
114 | # -H "Content-Type: application/json" \
115 | # -H 'Accept: application/json' \
116 | # -H 'Origin: https://field-demo.vrni.cmbu.local' \
117 | # -H 'x-vrni-csrf-token: RW6X9sZkHvNM+rJLFlEpaQ==' \
118 | # -H "Authorization: NetworkInsight $(cat ${VRNISESSION})" \
119 | #"${URL}" 2>/dev/null)
120 | #RESULT=$(isSuccess "${RESPONSE}")
121 | else
122 | printf "[$(ccyan "OFFLINE")] - SUCCESS\n" 1>&2
123 | RESULT=$(cat "${URL}")
124 | STATE="${URL}"
125 | fi
126 | #printf "%s\n" "${RESULT}" | jq --tab . >"${STATE}"
127 | printf "%s\n" "${RESULT}" | jq --tab .
128 | }
129 |
130 | function buildURL {
131 | local ENDPOINT="${1}"
132 | local BASE="${VRNIBASE}"
133 | local STATE="${STATEDIR}"
134 | local ONLINE="${VRNIONLINE}"
135 | if [[ "$ONLINE" == "true" ]]; then
136 | local SUCCESS=$(vrniSession)
137 | if [[ -n ${SUCCESS} ]]; then
138 | URL="$BASE$ENDPOINT"
139 | else
140 | URL="" #failed to obtain valid session
141 | fi
142 | else
143 | local FILE=$(getFile "${ENDPOINT}")
144 | URL="${STATE}/vrni${FILE}"
145 | fi
146 | printf "$URL"
147 | }
148 |
--------------------------------------------------------------------------------
/new/drv/drv.data.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | printf "%s\n" "DRIVER: ${WORKDIR} : ${STATEDIR} : ${PARENT}" 1>&2
4 |
5 | if [[ $(readlink -f $0) =~ ^(.*)/[^/]+$ ]]; then
6 | printf "%s\n" "MOO"
7 | source ${BASH_REMATCH[1]}/mod.core
8 | fi
9 |
10 | printf "%s\n" "DRIVER: ${WORKDIR} : ${STATEDIR} : ${PARENT}" 1>&2
11 |
12 | #printf '%s' $(<${STATEDIR}/data.json) | jq --tab .
13 |
--------------------------------------------------------------------------------
/new/drv/drv.objects.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [ -z ${WORKDIR} ]; then
3 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
4 | WORKDIR=${BASH_REMATCH[1]}
5 | fi
6 | if [[ $0 == "bash" ]]; then
7 | WORKDIR="."
8 | fi
9 | fi
10 | source ${WORKDIR}/mod.core
11 |
12 | #printf "%s\n" "${0} : ${WORKDIR} : ${STATEDIR}"
13 |
14 | TOKEN=$(cat ${STATEDIR}/vrni.token.txt)
15 | BODY=$(<${STATEDIR}/result.json)
16 | RESULT=$(curl -k -b "${STATEDIR}/vrni.cookies.txt" -X POST \
17 | -H 'accept: application/json' \
18 | -H 'content-type: application/json' \
19 | -H "x-vrni-csrf-token: $TOKEN" \
20 | -d "${BODY}" \
21 | "https://field-demo.vrni.cmbu.local/api/config/objects" 2>/dev/null)
22 |
23 | printf '%s' "${RESULT}" | jq --tab . >${STATEDIR}/data.json
24 |
--------------------------------------------------------------------------------
/new/drv/drv.result.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | fi
5 | source ${WORKDIR}/drv.vrni.client
6 |
7 | printf '%s' $(cat ${WORKDIR}/result.json) | jq --tab .
8 |
--------------------------------------------------------------------------------
/new/drv/drv.vrni.client:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [ -z ${WORKDIR} ]; then
3 | if [[ $0 =~ ^(.*)/[^/]+$ ]]; then
4 | WORKDIR=${BASH_REMATCH[1]}
5 | fi
6 | if [[ $0 == "bash" ]]; then
7 | WORKDIR="."
8 | fi
9 | fi
10 | if [ -z ${SDDCDIR} ]; then
11 | SDDCDIR=${WORKDIR}
12 | fi
13 | STATEDIR="${WORKDIR}/state"
14 | if [ ! -d ${STATEDIR} ]; then
15 | mkdir ${STATEDIR}
16 | fi
17 | source ${WORKDIR}/mod.core
18 |
19 | PARAMS=$(cat ${SDDCDIR}/sddc.parameters)
20 | DOMAIN=$(echo "${PARAMS}" | jq -r '.domain')
21 | SPEC=$(echo "${PARAMS}" | jq -r '.endpoints[] | select(.type=="vrni")')
22 | VRNIHOST=$(echo "$SPEC" | jq -r '.hostname')
23 | if [[ ! "$VRNIHOST" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
24 | if [[ ! "$VRNIHOST" =~ [.] ]]; then
25 | VRNIHOST+=".$DOMAIN" #if not an IP or FQDN, append domain
26 | fi
27 | fi
28 | VRNIUSER=$(echo "$SPEC" | jq -r '.username')
29 | VRNIPASS=$(echo "$SPEC" | jq -r '.password')
30 | VRNIONLINE=$(echo "$SPEC" | jq -r '.online')
31 | VRNISESSION="${STATEDIR}/vrni.token.txt"
32 | VRNIBASE="https://${VRNIHOST}/api/ni/"
33 |
34 | function vrniLogin {
35 | local URL="https://${VRNIHOST}/api/ni/auth/token"
36 | read -r -d '' VRNIBODY <<-CONFIG
37 | {
38 | "username": "${VRNIUSER}",
39 | "password": "${VRNIPASS}",
40 | "domain": {
41 | "domain_type": "LDAP"
42 | "value": "vmware.com"
43 | }
44 | }
45 | CONFIG
46 | #local RESPONSE=$(curl -k -w "%{http_code}" -X POST \
47 | local RESPONSE=$(curl -k -c "${STATEDIR}/vrni.cookies.txt" -D "${STATEDIR}/vrni.headers.txt" -w "%{http_code}" -X POST \
48 | -H 'Content-Type: application/json' \
49 | -H 'Accept: application/json' \
50 | -d "$VRNIBODY" \
51 | "${URL}" 2>/dev/null)
52 | local RESULT=$(isSuccess "${RESPONSE}")
53 | local CODE=$(getCode "${RESPONSE}")
54 | if [[ $CODE =~ 2..$ ]]; then
55 | local TOKEN=$(echo $RESULT | jq -r '.token')
56 | printf "%s\n" "${TOKEN}"
57 | fi
58 | }
59 |
60 | function vrniSession {
61 | local SESSION=$VRNISESSION
62 | local ONLINE=$VRNIONLINE
63 | if [[ "$ONLINE" == "true" ]]; then
64 | local RUNFIND="$(find ${SESSION} -mmin -10 2>/dev/null)"
65 | if [[ -z ${RUNFIND} ]]; then
66 | printf "No valid session found, authenticating... " 1>&2
67 | local LOGIN=$(vrniLogin)
68 | if [[ -n ${LOGIN} ]]; then
69 | echo "${LOGIN}" >"$SESSION"
70 | fi
71 | fi
72 | fi
73 | printf "%s\n" "$(cat "${SESSION}" 2>/dev/null)"
74 | }
75 |
76 | function vrniPost {
77 | local URL=${1}
78 | local BODY=${2}
79 | if [[ "$VRNIONLINE" == "true" ]]; then
80 | RESPONSE=$(curl -k -w "%{http_code}" -X POST \
81 | -H "Content-Type: application/json" \
82 | -H 'Accept: application/json' \
83 | -H "Authorization: NetworkInsight $(cat ${VRNISESSION})" \
84 | -d "$BODY" \
85 | "${URL}" 2>/dev/null)
86 | RESULT=$(isSuccess "${RESPONSE}")
87 | else
88 | printf "[$(ccyan "OFFLINE")] - SUCCESS\n" 1>&2
89 | fi
90 | printf "%s\n" "${RESULT}" | jq --tab .
91 | }
92 |
93 | function vrniGet {
94 | local URL=${1}
95 | local BASE=${VRNIBASE}
96 | local ONLINE="${VRNIONLINE}"
97 | local STATE
98 | if [[ "$ONLINE" == "true" ]]; then
99 | local SUCCESS=$(vrniSession)
100 | local FILE=$(getFile "${URL}" "${BASE}")
101 | STATE="${STATEDIR}/vrni${FILE}"
102 |
103 | ### DEBUG ###
104 | curl -k --trace-ascii /dev/stdout -b "${STATEDIR}/vrni.cookies.txt" -D "${STATEDIR}/vrni.headers.txt" -w "%{http_code}" -X GET \
105 | -H 'Accept: application/json' \
106 | -H 'Origin: https://field-demo.vrni.cmbu.local' \
107 | -H 'x-vrni-csrf-token: RW6X9sZkHvNM+rJLFlEpaQ==' \
108 | "${URL}" 1>&2
109 | ### DEBUG ###
110 | #-H "Authorization: NetworkInsight $(cat ${VRNISESSION})" \
111 |
112 | #RESPONSE=$(curl -k -w "%{http_code}" -X GET \
113 | # -H "Content-Type: application/json" \
114 | # -H 'Accept: application/json' \
115 | # -H 'Origin: https://field-demo.vrni.cmbu.local' \
116 | # -H 'x-vrni-csrf-token: RW6X9sZkHvNM+rJLFlEpaQ==' \
117 | # -H "Authorization: NetworkInsight $(cat ${VRNISESSION})" \
118 | #"${URL}" 2>/dev/null)
119 | #RESULT=$(isSuccess "${RESPONSE}")
120 | else
121 | printf "[$(ccyan "OFFLINE")] - SUCCESS\n" 1>&2
122 | RESULT=$(cat "${URL}")
123 | STATE="${URL}"
124 | fi
125 | #printf "%s\n" "${RESULT}" | jq --tab . >"${STATE}"
126 | printf "%s\n" "${RESULT}" | jq --tab .
127 | }
128 |
129 | function buildURL {
130 | local ENDPOINT="${1}"
131 | local BASE="${VRNIBASE}"
132 | local STATE="${STATEDIR}"
133 | local ONLINE="${VRNIONLINE}"
134 | if [[ "$ONLINE" == "true" ]]; then
135 | local SUCCESS=$(vrniSession)
136 | if [[ -n ${SUCCESS} ]]; then
137 | URL="$BASE$ENDPOINT"
138 | else
139 | URL="" #failed to obtain valid session
140 | fi
141 | else
142 | local FILE=$(getFile "${ENDPOINT}")
143 | URL="${STATE}/vrni${FILE}"
144 | fi
145 | printf "$URL"
146 | }
147 |
--------------------------------------------------------------------------------
/new/drv/mod.core:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | printf "%s\n" "BEFORE ${WORKDIR} : ${STATEDIR} : ${PARENT}"
3 |
4 | if [[ -n ${WORKDIR} ]]; then
5 | PARENT=${WORKDIR}
6 | else
7 | PARENT="."
8 | fi
9 | if [[ $(readlink -f $0) =~ ^(.*)/([^/]+)$ ]]; then
10 | WORKDIR="${BASH_REMATCH[1]}"
11 | CALLED="${BASH_REMATCH[2]}"
12 | fi
13 | if [ -z ${STATEDIR} ]; then
14 | STATEDIR="${PARENT}/state"
15 | fi
16 | if [ ! -d ${STATEDIR} ]; then
17 | mkdir ${STATEDIR}
18 | fi
19 |
20 | printf "%s\n" "AFTER ${WORKDIR} : ${STATEDIR} : ${PARENT}"
21 |
22 | # detect available cmds
23 | commands() {
24 | #echo "-- [COMMANDS] --"
25 | printf "%s" "list"
26 | for FILE in ${WORKDIR}/cmd.*.sh; do
27 | if [[ $FILE =~ cmd[.](.+)[.]sh ]]; then
28 | printf " %s" "${BASH_REMATCH[1]}"
29 | fi
30 | done
31 | exit 1
32 | }
33 | if [[ -n "$1" && ${CALLED} == "mod.core" ]]; then
34 | case "${1}" in
35 | list) ## list commands
36 | commands
37 | ;;
38 | setup-params) ## output sddc.parameters
39 | cat ${WORKDIR}/sddc.parameters
40 | ;;
41 | setup-bash) ## output bash-cli
42 | cat ${WORKDIR}/bash-cli
43 | ;;
44 | *) ## execute command
45 | if [ -f "${WORKDIR}/cmd.${1}.sh" ]; then
46 | eval "${WORKDIR}/cmd.${1}.sh ${2} ${3} ${4}"
47 | fi
48 | ;;
49 | esac
50 | fi
51 |
52 | # get OSNAME
53 | OSNAME="$(uname -s)"
54 | case "${OSNAME}" in
55 | Linux*)
56 | #printf "HAHA you run a L:${OSNAME}\n" 1>&2
57 | ;;
58 | Darwin*)
59 | #printf "HAHA you run a D:${OSNAME}\n" 1>&2
60 | ;;
61 | esac
62 |
63 | # COLOURS
64 | #RED=$'\e[31;1m'
65 | #CYAN=$'\e[36;1m'
66 | #GREEN='\e[32;1m' # light green
67 | #ORANGE=$'\e[33;1m' # orange
68 | #BLUE=$'\e[34;1m' # light blue
69 | #NC=$'\e[31;00m'
70 |
71 | #NC='\033[0;00m' # no colour
72 | BLACK='\033[0;30m' # black
73 | RED='\033[0;31m' # red
74 | #GREEN='\033[0;32m' # orange
75 | #ORANGE='\033[0;33m' # orange
76 | BLUE='\033[0;34m' # blue
77 | PURPLE='\033[0;35m' # purple
78 | #CYAN='\033[0;36m' # cyan
79 |
80 | NC='\e[0;00m' # no colour
81 | GREEN='\e[0;32m' # orange
82 | ORANGE='\e[0;33m' # orange
83 | CYAN='\e[0;36m' # cyan
84 | #LIGHTGREY='\033[0;37m' # light grey
85 | #DARKGREY='\033[0;30m' # dark grey
86 | #LIGHTRED='\033[0;31m' # light red
87 | #LIGHTGREEN='\033[0;32m' # light green
88 | #YELLOW='\033[0;33m' # yellow
89 | #LIGHTBLUE='\033[0;34m' # light blue
90 | #LBLUE='\033[33;1m' ## test
91 | #WHITE='\033[0;37m' # white
92 |
93 | function corange {
94 | local STRING=${1}
95 | printf '%s' "${ORANGE}${STRING}${NC}"
96 | }
97 | function cgreen {
98 | local STRING=${1}
99 | printf '%s' "${GREEN}${STRING}${NC}"
100 | }
101 | function ccyan {
102 | local STRING=${1}
103 | printf '%s' "${CYAN}${STRING}${NC}"
104 | }
105 |
106 | function isSuccess {
107 | local STRING=${1}
108 | local SESSION=${2}
109 | local CODE=$(getCode "${STRING}")
110 | local VALID
111 | printf "[$(ccyan "${CODE}")] - " 1>&2
112 | case $CODE in
113 | 2[0-9][0-9])
114 | printf "SUCCESS\n" 1>&2
115 | VALID="1"
116 | ;;
117 | 400)
118 | printf "ERROR\n" 1>&2
119 | ;;
120 | 40[1-3])
121 | printf "ERROR-AUTH\n" 1>&2
122 | ;;
123 | 404)
124 | printf "ERROR-NOTFOUND\n" 1>&2
125 | ;;
126 | *)
127 | printf "ERROR\n" 1>&2
128 | ;;
129 | esac
130 | if [[ -z "${VALID}" && -f "${SESSION}" ]]; then
131 | rm "${SESSION}" 2>/dev/null
132 | fi
133 | local BODY=$(getBody "${STRING}")
134 | printf "%s\n" "${BODY}"
135 | }
136 |
137 | function getCode {
138 | local STRING=${1}
139 | if [[ $STRING =~ ^(.*)([0-9]{3})$ ]]; then
140 | local BODY=${BASH_REMATCH[1]}
141 | local CODE=${BASH_REMATCH[2]}
142 | fi
143 | printf "%s\n" "${CODE}"
144 | }
145 |
146 | function getBody {
147 | local STRING=${1}
148 | if [[ $STRING =~ ^(.*)([0-9]{3})$ ]]; then
149 | local BODY=${BASH_REMATCH[1]}
150 | local CODE=${BASH_REMATCH[2]}
151 | fi
152 | printf "%s\n" "${BODY}"
153 | }
154 |
155 | function getFile {
156 | local ENDPOINT=${1}
157 | local BASE=${2}
158 | local STATE
159 | if [[ -n $BASE ]]; then
160 | REGEX="^($BASE)"
161 | if [[ $ENDPOINT =~ $REGEX ]]; then
162 | ENDPOINT=${ENDPOINT#*"${BASH_REMATCH[1]}"}
163 | fi
164 | fi
165 | while [[ $ENDPOINT =~ ([^/]+) ]]; do
166 | ENDPOINT=${ENDPOINT#*"${BASH_REMATCH[1]}"}
167 | STATE+=".${BASH_REMATCH[1]}"
168 | done
169 | STATE+=".json"
170 | printf "%s" "${STATE}"
171 | }
172 |
173 | function getThumbprint {
174 | local HOST="${1}"
175 | local PAYLOAD=$(echo -n | openssl s_client -connect "${HOST}" 2>/dev/null)
176 | local PRINT=$(echo "$PAYLOAD" | openssl x509 -noout -fingerprint -sha256)
177 | local REGEX='^(.*)=(([0-9A-Fa-f]{2}[:])+([0-9A-Fa-f]{2}))$'
178 | if [[ $PRINT =~ $REGEX ]]; then
179 | local TYPE=${BASH_REMATCH[1]}
180 | local CODE=${BASH_REMATCH[2]}
181 | fi
182 | printf "%s\n" "${CODE}" | sed "s/\(.*\)/\L\1/g" | sed "s/://g"
183 | }
184 |
185 | function getCertificate {
186 | local HOST="${1}"
187 | local PAYLOAD=$(echo -n | openssl s_client -connect "${HOST}" 2>/dev/null)
188 | local RESULT=$(echo "${PAYLOAD}" | sed -e '1h;2,$H;$!d;g' -e 's/.*\(-----BEGIN\sCERTIFICATE-----.*-----END\sCERTIFICATE-----\).*/\1/g')
189 | printf "%s\n" "$RESULT" | sed ':a;N;$!ba;s/\n/\\\\n/g'
190 | }
191 |
192 | function buildTable {
193 | local INPUT="${1}" # change first entry to color, separate from data body
194 | read -r -d '' JQTABLE <<-CONFIG
195 | if (.[0]?) then
196 | [(
197 | [.[0] | to_entries[] | "<" + .key + ">"]
198 | ),(
199 | .[] | [to_entries[] | .value]
200 | )]
201 | else . end
202 | CONFIG
203 | local HEADER="1"
204 | echo "$INPUT" | jq -r "$JQTABLE | .[] | @tsv" | column -t -s $'\t' | while read -r LINE; do
205 | if [[ -n $HEADER ]]; then
206 | printf "${CYAN}${LINE}${NC}\n"
207 | HEADER=""
208 | else
209 | printf "$LINE\n";
210 | fi
211 | done
212 | }
213 |
214 | function buildTest {
215 | local INPUT="${1}" # change first entry to color, separate from data body
216 | read -r -d '' JQTABLE <<-CONFIG
217 | if (.[0]?) then
218 | [(
219 | [.[0] | to_entries[] | "${BLUE}<" + .key + ">${NC}"]
220 | ),(
221 | .[] | [to_entries[] | "${NC}" + .value + "${NC}"]
222 | )]
223 | else . end
224 | CONFIG
225 | BODY=$(echo "$INPUT" | jq -r "$JQTABLE | .[] | @tsv" | column -t -s $'\t')
226 | printf "${BODY}\n"
227 | }
228 |
229 | function buildNoColour {
230 | local INPUT="${1}" # change first entry to color, separate from data body
231 | read -r -d '' JQTABLE <<-CONFIG
232 | if (.[0]?) then
233 | [(
234 | [.[0] | to_entries[] | "<" + .key + ">"]
235 | ),(
236 | .[] | [to_entries[] | .value]
237 | )]
238 | else . end
239 | CONFIG
240 | BODY=$(echo "$INPUT" | jq -r "$JQTABLE | .[] | @tsv" | column -t -s $'\t')
241 | printf "${BODY}\n"
242 | }
243 |
244 | ## filter payload with string
245 | function filter {
246 | local PAYLOAD=${1}
247 | local STRING=${2}
248 | while [[ $STRING =~ ([^,]+) ]]; do
249 | local FILTER="${BASH_REMATCH[1]}"
250 | STRING=${STRING#*"${BASH_REMATCH[1]}"}
251 | local FIELD="name"
252 | local VALUE="."
253 | if [[ $FILTER =~ ([^:]+):([^:]*) ]]; then
254 | FIELD=${BASH_REMATCH[1]}
255 | VALUE=${BASH_REMATCH[2]}
256 | else
257 | VALUE="${FILTER}"
258 | fi
259 | read -r -d '' FILTERSPEC <<-CONFIG
260 | map(select(
261 | ."$FIELD" |
262 | if (. != null) then (. | tostring) else "" end
263 | | test("$VALUE";"i")
264 | ))
265 | CONFIG
266 | PAYLOAD=$(echo "$PAYLOAD" | jq -r "$FILTERSPEC")
267 | done
268 | printf "%s\n" "${PAYLOAD}" | jq --tab .
269 | }
270 |
271 | ## set current context
272 | function setContext {
273 | local INPUT="${1}"
274 | local ITEM="${2}"
275 | local STATE="${STATEDIR}/ctx.${ITEM}.json"
276 | local PAYLOAD=$(echo "$INPUT" | jq --tab '.[0]')
277 | if [[ -n "${PAYLOAD}" && "${PAYLOAD}" != null ]]; then
278 | printf "%s\n" "${PAYLOAD}" >"${STATE}"
279 | fi
280 | }
281 |
282 | ## get current context
283 | function getContext {
284 | local FILTER="${1}"
285 | if [[ -z $FILTER ]]; then
286 | FILTER="."
287 | fi
288 | echo "FILTER: ${FILTER}" 1>&2
289 | local PAYLOAD=$("${WORKDIR}"/cmd.context.list.sh "${FILTER}" json | jq '.[0]')
290 | if [[ ! "$PAYLOAD" == null ]]; then
291 | printf "%s\n" "${PAYLOAD}" | jq -r '.id'
292 | fi
293 | }
294 |
--------------------------------------------------------------------------------
/new/drv/result.json:
--------------------------------------------------------------------------------
1 | {
2 | "requests": [
3 | {
4 | "modelKey": "10000:4:141732398"
5 | },
6 | {
7 | "modelKey": "10000:4:141732522"
8 | },
9 | {
10 | "modelKey": "10000:4:141734320"
11 | },
12 | {
13 | "modelKey": "10000:4:141735343"
14 | }
15 | ]
16 | }
17 |
--------------------------------------------------------------------------------
/new/drv/sddc.parameters:
--------------------------------------------------------------------------------
1 | {
2 | "dns": "172.16.0.1",
3 | "domain": "lab",
4 | "endpoints": [
5 | {
6 | "type": "vrni",
7 | "hostname": "demo.vrni.local",
8 | "username": "demo",
9 | "password": "demo",
10 | "online": "true"
11 | }
12 | ]
13 | }
14 |
--------------------------------------------------------------------------------
/new/drv/vrni.token.txt:
--------------------------------------------------------------------------------
1 | CTXYA5k33lsQ0QleUvrCNQ==
2 |
--------------------------------------------------------------------------------
/new/jq/host.jq:
--------------------------------------------------------------------------------
1 | .data | if (. != null) then map({
2 | "modelKey": .modelKey,
3 | "name": .name,
4 | "powerState": .serverdataParent.runtime.powerState,
5 | "numCpus": .serverdataParent.numCpus,
6 | "cpuSockets": .serverdataParent.cpuSockets,
7 | "memoryMB": .serverdataParent.memoryMB,
8 | "numVms": .numVms
9 | }) else "" end
10 |
--------------------------------------------------------------------------------
/new/login.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | read -r -d '' BBODY <<-CONFIG
4 | {
5 | "username": "demouser@cmbu.local",
6 | "password": "demoVMware1!",
7 | "domain": {
8 | "domain_type": "LOCAL"
9 | }
10 | }
11 | CONFIG
12 | read -r -d '' BODY <<-CONFIG
13 | {
14 | "username": "aobersnel@vmware.com",
15 | "password": "WanObi323#@#",
16 | "domain": {
17 | "domain_type": "LDAP",
18 | "value": "vmware.com"
19 | }
20 | }
21 | CONFIG
22 |
23 | URL='https://field-demo.vrni.cmbu.org/api/ni/auth/token'
24 |
25 | RESPONSE=$(curl -k -X POST \
26 | -c "./vrni.cookies.txt" \
27 | -H 'Content-Type: application/json' \
28 | -H 'Accept: application/json' \
29 | -d "${BODY}" \
30 | "${URL}" 2>/dev/null)
31 |
32 | printf "${RESPONSE}" | jq --tab . 1>&2
33 | printf "${RESPONSE}" | jq -r '.token' > vrni.token.txt
34 |
--------------------------------------------------------------------------------
/new/mod.command:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $(readlink -f $0) =~ ^(.*)/([^/]+)$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | FILE=${BASH_REMATCH[2]}
5 | if [[ ${FILE} =~ ^[^.]+[.](.+)[.]sh$ ]]; then
6 | TYPE=${BASH_REMATCH[1]}
7 | fi
8 | fi
9 | STATEDIR=${WORKDIR}/state
10 | JQDIR=${WORKDIR}/jq
11 | source ${WORKDIR}/drv/mod.core
12 |
13 | # build filter
14 | function cmd {
15 | local COMMAND=${1}
16 | case "${COMMAND}" in
17 | watch)
18 | watch -t -c -n 3 "${WORKDIR}/${FILE} 2>/dev/null"
19 | ;;
20 | json)
21 | local PAYLOAD=$(payload)
22 | setContext "${PAYLOAD}" "${TYPE}"
23 | echo "${PAYLOAD}" | jq --tab .
24 | ;;
25 | filter)
26 | local FILTER=${2}
27 | local PAYLOAD=$(filter "$(payload)" "${FILTER}")
28 | setContext "${PAYLOAD}" "${TYPE}"
29 | buildTable "${PAYLOAD}"
30 | ;;
31 | *)
32 | local PAYLOAD=$(payload)
33 | setContext "${PAYLOAD}" "${TYPE}"
34 | buildTable "${PAYLOAD}"
35 | ;;
36 | esac
37 | }
38 |
39 | function payload {
40 | local INPUT=$(eval $(drv "${TYPE}")) # link to drv
41 | local PAYLOAD=$(echo "${INPUT}" | jq -r "$(run)")
42 | printf "${PAYLOAD}"
43 | }
44 |
45 | function drv {
46 | local DRIVER=${1}
47 | printf "${WORKDIR}/drv/drv.${DRIVER}.sh"
48 | }
49 |
--------------------------------------------------------------------------------
/new/old.login.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | read -r -d '' LOGIN <<-CONFIG
4 | {
5 | "username": "aobersnel@vmware.com",
6 | "password": "WanObi323#@#",
7 | "domain": {
8 | "domain_type": "LDAP",
9 | "value": "vmware.com"
10 | }
11 | }
12 | CONFIG
13 | STATEDIR="./state"
14 | TOKEN=$(curl -k -X POST \
15 | -c "${STATEDIR}/vrni.cookies.txt" \
16 | https://field-demo.vrni.cmbu.local/api/auth/login \
17 | -H 'accept: application/json' \
18 | -H 'content-type: application/json' \
19 | -d "${BODY}"
20 | 2>/dev/null | jq -r '.csrfToken')
21 |
22 | printf '%s' "${TOKEN}" >${STATEDIR}/vrni.token.txt
23 | printf '%s\n' "${TOKEN}" 1>&2
24 |
25 | #{"username":"demouser@cmbu.local","password":"demoVMware1!","tenantName":"field-demo.vrni.cmbu.local","vIDMURL":"","redirectURL":"","authenticationDomains":{"0":{"domainType":"LDAP","domain":"vmware.com","redirectUrl":""},"1":{"domainType":"LOCAL_DOMAIN","domain":"localdomain","redirectUrl":""}},"currentDomain":1,"domain":"localdomain","nDomains":2,"serverTimestamp":false,"loginFieldPlaceHolder":"Username"}
26 |
--------------------------------------------------------------------------------
/new/result.json:
--------------------------------------------------------------------------------
1 | ""
2 |
--------------------------------------------------------------------------------
/new/sddc.parameters:
--------------------------------------------------------------------------------
1 | {
2 | "dns": "172.16.0.1",
3 | "domain": "lab",
4 | "endpoints": [
5 | {
6 | "type": "vrni",
7 | "hostname": "demo.vrni.local",
8 | "username": "demo",
9 | "password": "demo",
10 | "online": "true"
11 | }
12 | ]
13 | }
14 |
--------------------------------------------------------------------------------
/new/vrni.cookies.txt:
--------------------------------------------------------------------------------
1 | # Netscape HTTP Cookie File
2 | # https://curl.haxx.se/docs/http-cookies.html
3 | # This file was generated by libcurl! Edit at your own risk.
4 |
5 | #HttpOnly_field-demo.vrni.cmbu.org FALSE / TRUE 0 VRNI-JSESSIONID b62afc04-22b0-486d-b680-5575fb0463f7
6 |
--------------------------------------------------------------------------------
/new/vrni.token.txt:
--------------------------------------------------------------------------------
1 | AFwkZAIxaIXkYMJUITjj4Q==
2 |
--------------------------------------------------------------------------------
/test.md:
--------------------------------------------------------------------------------
1 | # vRealize Network Insight - Table of Contents
2 |
3 | 1. [Trial Process](#overview)
4 | 2. [Useful Queries](#queries)
5 | 3. [Import/Export Applications](#applications)
6 |
7 | ## Test 1 {#overview}
8 | ## Test 2
9 | ## Test 3
10 | Revisit
11 |
12 | Migration Grouping and Traffic Hairpinning{
13 | outline: 2px dotted blue;
14 | }
15 |
16 | In his beard lived three cardinals.
17 |
18 | #### A blue heading
19 | {: .blue}
20 |
21 | Roses are \textcolor{red}{red}, violets are \textcolor{blue}{blue}.
22 |
23 | -  `#f03c15`
24 | -  `#c5f015`
25 | -  `#1589F0`
26 |
27 | ```diff
28 | - text in red
29 | + text in green
30 | ! text in orange
31 | # text in gray
32 | @@ text in purple (and bold)@@
33 | git clone https://apnex.io/vrni
34 | cli test
35 | ```
36 |
--------------------------------------------------------------------------------
/test/cmd.test.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $(readlink -f $0) =~ ^(.*)/([^/]+)$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | fi
5 | source ${WORKDIR}/mod.command
6 |
7 | function run {
8 | local TYPE="$(cat ${STATEDIR}/query.json | jq -r '.queryResultSemanticsContext.objectType.objectType')"
9 | local LCASE=$(echo "${TYPE}" | tr '[:upper:]' '[:lower:]')
10 | printf '%s' "$(<${JQDIR}/${LCASE}.jq)"
11 | }
12 |
13 | ## cmd
14 | cmd "${@}"
15 |
--------------------------------------------------------------------------------
/test/cmd.vm.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $(readlink -f $0) =~ ^(.*)/([^/]+)$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | fi
5 | source ${WORKDIR}/mod.command
6 |
7 | function run {
8 | printf '%s' "$(<${JQDIR}/vm.jq)"
9 | }
10 |
11 | ## cmd
12 | cmd "${@}"
13 |
--------------------------------------------------------------------------------
/test/drv.complete.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | urlencode() {
4 | # urlencode
5 | old_lc_collate=$LC_COLLATE
6 | LC_COLLATE=C
7 | local length="${#1}"
8 | for (( i = 0; i < length; i++ )); do
9 | local c="${1:i:1}"
10 | case $c in
11 | [a-zA-Z0-9.~_-]) printf "$c" ;;
12 | *) printf '%%%02X' "'$c" ;;
13 | esac
14 | done
15 | LC_COLLATE=$old_lc_collate
16 | }
17 |
18 | urldecode() {
19 | # urldecode
20 | local url_encoded="${1//+/ }"
21 | printf '%b' "${url_encoded//%/\\x}"
22 | }
23 |
24 | SEARCH=${1}
25 | STATEDIR="./state"
26 | TOKEN=$(<${STATEDIR}/vrni.token.txt)
27 | QUERY=$(urlencode "${SEARCH}")
28 | #searchString=hosts+where+VM+Count+%3E+10
29 | RESULT=$(curl -k -b "${STATEDIR}/vrni.cookies.txt" -X GET \
30 | -H 'accept: application/json' \
31 | -H "x-vrni-csrf-token: $TOKEN" \
32 | "https://field-demo.vrni.cmbu.local/api/search/completions?partialQuery=${QUERY}&fullQuery=${QUERY}&maxCompletions=70" \
33 | 2>/dev/null)
34 |
35 | read -r -d '' SPEC <<-CONFIG
36 | .data.partialQueryCompletions.completionsByType
37 | .resultList | if (. != null) then {
38 | "requests": map(
39 | .searchContext | {
40 | "modelKey": .modelKey
41 | })
42 | } else "" end
43 | CONFIG
44 |
45 | #printf '%s' "${RESULT}" | jq --tab "${SPEC}" >${STATEDIR}/result.json
46 | printf '%s' "${RESULT}" | jq --tab .
47 |
48 | #./drv/drv.objects.list.sh
49 |
--------------------------------------------------------------------------------
/test/drv.search.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | urlencode() {
4 | # urlencode
5 | old_lc_collate=$LC_COLLATE
6 | LC_COLLATE=C
7 | local length="${#1}"
8 | for (( i = 0; i < length; i++ )); do
9 | local c="${1:i:1}"
10 | case $c in
11 | [a-zA-Z0-9.~_-]) printf "$c" ;;
12 | *) printf '%%%02X' "'$c" ;;
13 | esac
14 | done
15 | LC_COLLATE=$old_lc_collate
16 | }
17 |
18 | urldecode() {
19 | # urldecode
20 | local url_encoded="${1//+/ }"
21 | printf '%b' "${url_encoded//%/\\x}"
22 | }
23 |
24 | SEARCH=${1}
25 | STATEDIR="./state"
26 | TOKEN=$(<${STATEDIR}/vrni.token.txt)
27 | QUERY=$(urlencode "${SEARCH}")
28 | #searchString=hosts+where+VM+Count+%3E+10
29 | RESULT=$(curl -k -b "${STATEDIR}/vrni.cookies.txt" -X GET \
30 | -H 'accept: application/json' \
31 | -H "x-vrni-csrf-token: $TOKEN" \
32 | "https://field-demo.vrni.cmbu.local/api/search/query?searchString=${QUERY}&includeObjects=false&includeFacets=true&includeMetrics=true&includeModelKeyOnly=false&startIndex=0&maxItemCount=10" \
33 | 2>/dev/null)
34 |
35 | read -r -d '' SPEC <<-CONFIG
36 | .resultList | if (. != null) then {
37 | "requests": map(
38 | .searchContext | {
39 | "modelKey": .modelKey
40 | })
41 | } else "" end
42 | CONFIG
43 |
44 | printf '%s' "${RESULT}" | jq --tab "${SPEC}" >${STATEDIR}/result.json
45 | printf '%s' "${RESULT}" | jq --tab . >${STATEDIR}/query.json
46 |
47 | ./drv/drv.objects.list.sh
48 |
49 | #'https://field-demo.vrni.cmbu.local/api/search/query?searchString=host&includeObjects=false&includeFacets=true&includeMetrics=false&includeEvents=false&includeModelKeyOnly=false&startIndex=0&maxItemCount=10'
50 | #'https://field-demo.vrni.cmbu.local/api/search/query?searchString=host&includeObjects=true&includeModelKeyOnly=false'
51 |
52 | #printf '%s' "${RESULT}" | jq --tab .
53 |
--------------------------------------------------------------------------------
/test/drv/drv.host.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $(readlink -f $0) =~ ^(.*)/[^/]+$ ]]; then
3 | source ${BASH_REMATCH[1]}/mod.core
4 | fi
5 |
6 | printf '%s' $(<${STATEDIR}/data.json) | jq --tab .
7 |
--------------------------------------------------------------------------------
/test/drv/drv.objects.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $(readlink -f $0) =~ ^(.*)/[^/]+$ ]]; then
3 | source ${BASH_REMATCH[1]}/mod.core
4 | fi
5 |
6 | TOKEN=$(<${STATEDIR}/vrni.token.txt)
7 | BODY=$(<${STATEDIR}/result.json)
8 | #BODY=$(<./test.json)
9 | RESULT=$(curl -k -b "${STATEDIR}/vrni.cookies.txt" -X POST \
10 | -H 'accept: application/json' \
11 | -H 'content-type: application/json' \
12 | -H "x-vrni-csrf-token: $TOKEN" \
13 | -d "${BODY}" \
14 | "https://field-demo.vrni.cmbu.local/api/config/objects" 2>/dev/null)
15 |
16 | printf '%s' "${RESULT}" | jq --tab . >${STATEDIR}/data.json
17 |
--------------------------------------------------------------------------------
/test/drv/drv.test.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $(readlink -f $0) =~ ^(.*)/[^/]+$ ]]; then
3 | source ${BASH_REMATCH[1]}/mod.core
4 | fi
5 |
6 | printf '%s' $(<${STATEDIR}/data.json) | jq --tab .
7 |
--------------------------------------------------------------------------------
/test/drv/drv.vm.list.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $(readlink -f $0) =~ ^(.*)/[^/]+$ ]]; then
3 | source ${BASH_REMATCH[1]}/mod.core
4 | fi
5 |
6 | printf '%s' $(<${STATEDIR}/data.json) | jq --tab .
7 |
--------------------------------------------------------------------------------
/test/drv/link.cmd:
--------------------------------------------------------------------------------
1 | /home/apnex/vmware/lab/nuc/vrni/test
--------------------------------------------------------------------------------
/test/drv/mod.core:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | #printf "%s\n" "-- ${STATEDIR}"
3 | if [[ $(readlink -f $0) =~ ^(.*)/([^/]+)$ ]]; then
4 | WORKDIR="${BASH_REMATCH[1]}"
5 | CALLED="${BASH_REMATCH[2]}"
6 | fi
7 | if [[ -f ${WORKDIR}/link.cmd ]]; then
8 | PARENT=$(<${WORKDIR}/link.cmd)
9 | STATEDIR="${PARENT}/state"
10 | else
11 | STATEDIR="${WORKDIR}/state"
12 | fi
13 | if [ ! -d ${STATEDIR} ]; then
14 | mkdir ${STATEDIR}
15 | fi
16 |
17 | # detect available cmds
18 | commands() {
19 | #echo "-- [COMMANDS] --"
20 | printf "%s" "list"
21 | for FILE in ${WORKDIR}/cmd.*.sh; do
22 | if [[ $FILE =~ cmd[.](.+)[.]sh ]]; then
23 | printf " %s" "${BASH_REMATCH[1]}"
24 | fi
25 | done
26 | exit 1
27 | }
28 | if [[ -n "$1" && ${CALLED} == "mod.core" ]]; then
29 | case "${1}" in
30 | list) ## list commands
31 | commands
32 | ;;
33 | setup-params) ## output sddc.parameters
34 | cat ${WORKDIR}/sddc.parameters
35 | ;;
36 | setup-bash) ## output bash-cli
37 | cat ${WORKDIR}/bash-cli
38 | ;;
39 | *) ## execute command
40 | if [ -f "${WORKDIR}/cmd.${1}.sh" ]; then
41 | eval "${WORKDIR}/cmd.${1}.sh ${2} ${3} ${4}"
42 | fi
43 | ;;
44 | esac
45 | fi
46 |
47 | # get OSNAME
48 | OSNAME="$(uname -s)"
49 | case "${OSNAME}" in
50 | Linux*)
51 | #printf "HAHA you run a L:${OSNAME}\n" 1>&2
52 | ;;
53 | Darwin*)
54 | #printf "HAHA you run a D:${OSNAME}\n" 1>&2
55 | ;;
56 | esac
57 |
58 | # COLOURS
59 | #RED=$'\e[31;1m'
60 | #CYAN=$'\e[36;1m'
61 | #GREEN='\e[32;1m' # light green
62 | #ORANGE=$'\e[33;1m' # orange
63 | #BLUE=$'\e[34;1m' # light blue
64 | #NC=$'\e[31;00m'
65 |
66 | #NC='\033[0;00m' # no colour
67 | BLACK='\033[0;30m' # black
68 | RED='\033[0;31m' # red
69 | #GREEN='\033[0;32m' # orange
70 | #ORANGE='\033[0;33m' # orange
71 | BLUE='\033[0;34m' # blue
72 | PURPLE='\033[0;35m' # purple
73 | #CYAN='\033[0;36m' # cyan
74 |
75 | NC='\e[0;00m' # no colour
76 | GREEN='\e[0;32m' # orange
77 | ORANGE='\e[0;33m' # orange
78 | CYAN='\e[0;36m' # cyan
79 | #LIGHTGREY='\033[0;37m' # light grey
80 | #DARKGREY='\033[0;30m' # dark grey
81 | #LIGHTRED='\033[0;31m' # light red
82 | #LIGHTGREEN='\033[0;32m' # light green
83 | #YELLOW='\033[0;33m' # yellow
84 | #LIGHTBLUE='\033[0;34m' # light blue
85 | #LBLUE='\033[33;1m' ## test
86 | #WHITE='\033[0;37m' # white
87 |
88 | function corange {
89 | local STRING=${1}
90 | printf '%s' "${ORANGE}${STRING}${NC}"
91 | }
92 | function cgreen {
93 | local STRING=${1}
94 | printf '%s' "${GREEN}${STRING}${NC}"
95 | }
96 | function ccyan {
97 | local STRING=${1}
98 | printf '%s' "${CYAN}${STRING}${NC}"
99 | }
100 |
101 | function isSuccess {
102 | local STRING=${1}
103 | local SESSION=${2}
104 | local CODE=$(getCode "${STRING}")
105 | local VALID
106 | printf "[$(ccyan "${CODE}")] - " 1>&2
107 | case $CODE in
108 | 2[0-9][0-9])
109 | printf "SUCCESS\n" 1>&2
110 | VALID="1"
111 | ;;
112 | 400)
113 | printf "ERROR\n" 1>&2
114 | ;;
115 | 40[1-3])
116 | printf "ERROR-AUTH\n" 1>&2
117 | ;;
118 | 404)
119 | printf "ERROR-NOTFOUND\n" 1>&2
120 | ;;
121 | *)
122 | printf "ERROR\n" 1>&2
123 | ;;
124 | esac
125 | if [[ -z "${VALID}" && -f "${SESSION}" ]]; then
126 | rm "${SESSION}" 2>/dev/null
127 | fi
128 | local BODY=$(getBody "${STRING}")
129 | printf "%s\n" "${BODY}"
130 | }
131 |
132 | function getCode {
133 | local STRING=${1}
134 | if [[ $STRING =~ ^(.*)([0-9]{3})$ ]]; then
135 | local BODY=${BASH_REMATCH[1]}
136 | local CODE=${BASH_REMATCH[2]}
137 | fi
138 | printf "%s\n" "${CODE}"
139 | }
140 |
141 | function getBody {
142 | local STRING=${1}
143 | if [[ $STRING =~ ^(.*)([0-9]{3})$ ]]; then
144 | local BODY=${BASH_REMATCH[1]}
145 | local CODE=${BASH_REMATCH[2]}
146 | fi
147 | printf "%s\n" "${BODY}"
148 | }
149 |
150 | function getFile {
151 | local ENDPOINT=${1}
152 | local BASE=${2}
153 | local STATE
154 | if [[ -n $BASE ]]; then
155 | REGEX="^($BASE)"
156 | if [[ $ENDPOINT =~ $REGEX ]]; then
157 | ENDPOINT=${ENDPOINT#*"${BASH_REMATCH[1]}"}
158 | fi
159 | fi
160 | while [[ $ENDPOINT =~ ([^/]+) ]]; do
161 | ENDPOINT=${ENDPOINT#*"${BASH_REMATCH[1]}"}
162 | STATE+=".${BASH_REMATCH[1]}"
163 | done
164 | STATE+=".json"
165 | printf "%s" "${STATE}"
166 | }
167 |
168 | function getThumbprint {
169 | local HOST="${1}"
170 | local PAYLOAD=$(echo -n | openssl s_client -connect "${HOST}" 2>/dev/null)
171 | local PRINT=$(echo "$PAYLOAD" | openssl x509 -noout -fingerprint -sha256)
172 | local REGEX='^(.*)=(([0-9A-Fa-f]{2}[:])+([0-9A-Fa-f]{2}))$'
173 | if [[ $PRINT =~ $REGEX ]]; then
174 | local TYPE=${BASH_REMATCH[1]}
175 | local CODE=${BASH_REMATCH[2]}
176 | fi
177 | printf "%s\n" "${CODE}" | sed "s/\(.*\)/\L\1/g" | sed "s/://g"
178 | }
179 |
180 | function getCertificate {
181 | local HOST="${1}"
182 | local PAYLOAD=$(echo -n | openssl s_client -connect "${HOST}" 2>/dev/null)
183 | local RESULT=$(echo "${PAYLOAD}" | sed -e '1h;2,$H;$!d;g' -e 's/.*\(-----BEGIN\sCERTIFICATE-----.*-----END\sCERTIFICATE-----\).*/\1/g')
184 | printf "%s\n" "$RESULT" | sed ':a;N;$!ba;s/\n/\\\\n/g'
185 | }
186 |
187 | function buildTable {
188 | local INPUT="${1}" # change first entry to color, separate from data body
189 | read -r -d '' JQTABLE <<-CONFIG
190 | if (.[0]?) then
191 | [(
192 | [.[0] | to_entries[] | "<" + .key + ">"]
193 | ),(
194 | .[] | [to_entries[] | .value]
195 | )]
196 | else . end
197 | CONFIG
198 | local HEADER="1"
199 | echo "$INPUT" | jq -r "$JQTABLE | .[] | @tsv" | column -t -s $'\t' | while read -r LINE; do
200 | if [[ -n $HEADER ]]; then
201 | printf "${CYAN}${LINE}${NC}\n"
202 | HEADER=""
203 | else
204 | printf "$LINE\n";
205 | fi
206 | done
207 | }
208 |
209 | function buildTest {
210 | local INPUT="${1}" # change first entry to color, separate from data body
211 | read -r -d '' JQTABLE <<-CONFIG
212 | if (.[0]?) then
213 | [(
214 | [.[0] | to_entries[] | "${BLUE}<" + .key + ">${NC}"]
215 | ),(
216 | .[] | [to_entries[] | "${NC}" + .value + "${NC}"]
217 | )]
218 | else . end
219 | CONFIG
220 | BODY=$(echo "$INPUT" | jq -r "$JQTABLE | .[] | @tsv" | column -t -s $'\t')
221 | printf "${BODY}\n"
222 | }
223 |
224 | function buildNoColour {
225 | local INPUT="${1}" # change first entry to color, separate from data body
226 | read -r -d '' JQTABLE <<-CONFIG
227 | if (.[0]?) then
228 | [(
229 | [.[0] | to_entries[] | "<" + .key + ">"]
230 | ),(
231 | .[] | [to_entries[] | .value]
232 | )]
233 | else . end
234 | CONFIG
235 | BODY=$(echo "$INPUT" | jq -r "$JQTABLE | .[] | @tsv" | column -t -s $'\t')
236 | printf "${BODY}\n"
237 | }
238 |
239 | ## filter payload with string
240 | function filter {
241 | local PAYLOAD=${1}
242 | local STRING=${2}
243 | while [[ $STRING =~ ([^,]+) ]]; do
244 | local FILTER="${BASH_REMATCH[1]}"
245 | STRING=${STRING#*"${BASH_REMATCH[1]}"}
246 | local FIELD="name"
247 | local VALUE="."
248 | if [[ $FILTER =~ ([^:]+):([^:]*) ]]; then
249 | FIELD=${BASH_REMATCH[1]}
250 | VALUE=${BASH_REMATCH[2]}
251 | else
252 | VALUE="${FILTER}"
253 | fi
254 | read -r -d '' FILTERSPEC <<-CONFIG
255 | map(select(
256 | ."$FIELD" |
257 | if (. != null) then (. | tostring) else "" end
258 | | test("$VALUE";"i")
259 | ))
260 | CONFIG
261 | PAYLOAD=$(echo "$PAYLOAD" | jq -r "$FILTERSPEC")
262 | done
263 | printf "%s\n" "${PAYLOAD}" | jq --tab .
264 | }
265 |
266 | ## set current context
267 | function setContext {
268 | local INPUT="${1}"
269 | local ITEM="${2}"
270 | local STATE="${STATEDIR}/ctx.${ITEM}.json"
271 | local PAYLOAD=$(echo "$INPUT" | jq --tab '.[0]')
272 | if [[ -n "${PAYLOAD}" && "${PAYLOAD}" != null ]]; then
273 | printf "%s\n" "${PAYLOAD}" >"${STATE}"
274 | fi
275 | }
276 |
277 | ## get current context
278 | function getContext {
279 | local FILTER="${1}"
280 | if [[ -z $FILTER ]]; then
281 | FILTER="."
282 | fi
283 | echo "FILTER: ${FILTER}" 1>&2
284 | local PAYLOAD=$("${WORKDIR}"/cmd.context.list.sh "${FILTER}" json | jq '.[0]')
285 | if [[ ! "$PAYLOAD" == null ]]; then
286 | printf "%s\n" "${PAYLOAD}" | jq -r '.id'
287 | fi
288 | }
289 |
--------------------------------------------------------------------------------
/test/drv/test.json:
--------------------------------------------------------------------------------
1 | {
2 | "requests": [
3 | {
4 | "modelKey": "10000:515:1018548286"
5 | },
6 | {
7 | "modelKey": "10000:515:20539333"
8 | }
9 | ]
10 | }
11 |
--------------------------------------------------------------------------------
/test/jq/cluster.jq:
--------------------------------------------------------------------------------
1 | .data | if (. != null) then map({
2 | "modelKey": .modelKey,
3 | "name": .name,
4 | "totalCpu": .totalCpu,
5 | "totalMemory": .totalMemory,
6 | "numCpuCores": .numCpuCores,
7 | "numHosts": .numHosts,
8 | "numDatastores": .numDatastores
9 | }) else "" end
10 |
--------------------------------------------------------------------------------
/test/jq/flow_info.jq:
--------------------------------------------------------------------------------
1 | .data | if (. != null) then map({
2 | "modelKey": .modelKey,
3 | "name": .name,
4 | "srcIpEntity": .srcIpEntity.name,
5 | "dstIPEntity": .dstIPEntity.name,
6 | "protocol": .protocol,
7 | "port": .port.display
8 | }) else "" end
9 |
--------------------------------------------------------------------------------
/test/jq/generic_vm.jq:
--------------------------------------------------------------------------------
1 | .data | if (. != null) then map({
2 | "modelKey": .modelKey,
3 | "name": .name,
4 | "powerState": .serverdataParent.runtime.powerState,
5 | "numCpus": .serverdataParent.numCpus,
6 | "osFullName": .serverdataParent.osFullName,
7 | "memoryMB": .serverdataParent.memoryMB
8 | }) else "" end
9 |
--------------------------------------------------------------------------------
/test/jq/host.jq:
--------------------------------------------------------------------------------
1 | .data | if (. != null) then map({
2 | "modelKey": .modelKey,
3 | "name": .name,
4 | "powerState": .serverdataParent.runtime.powerState,
5 | "numCpus": .serverdataParent.numCpus,
6 | "cpuSockets": .serverdataParent.cpuSockets,
7 | "memoryMB": .serverdataParent.memoryMB,
8 | "numVms": .numVms
9 | }) else "" end
10 |
--------------------------------------------------------------------------------
/test/jq/vm.jq:
--------------------------------------------------------------------------------
1 | .data | if (. != null) then map({
2 | "modelKey": .modelKey,
3 | "name": .name,
4 | "powerState": .serverdataParent.runtime.powerState,
5 | "numCpus": .serverdataParent.numCpus,
6 | "osFullName": .serverdataParent.osFullName,
7 | "memoryMB": .serverdataParent.memoryMB
8 | }) else "" end
9 |
--------------------------------------------------------------------------------
/test/login.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | STATEDIR="./state"
4 | TOKEN=$(curl -k -X POST \
5 | -c "${STATEDIR}/vrni.cookies.txt" \
6 | https://field-demo.vrni.cmbu.local/api/auth/login \
7 | -H 'accept: application/json' \
8 | -H 'content-type: application/json' \
9 | -d '{"username":"demouser@cmbu.local","password":"demoVMware1!","tenantName":"field-demo.vrni.cmbu.local","vIDMURL":"","redirectURL":"","authenticationDomains":{"0":{"domainType":"LDAP","domain":"vmware.com","redirectUrl":""},"1":{"domainType":"LOCAL_DOMAIN","domain":"localdomain","redirectUrl":""}},"currentDomain":1,"domain":"localdomain","nDomains":2,"serverTimestamp":false,"loginFieldPlaceHolder":"Username"}' \
10 | 2>/dev/null | jq -r '.csrfToken')
11 |
12 | printf '%s' "${TOKEN}" >${STATEDIR}/vrni.token.txt
13 | printf '%s\n' "${TOKEN}" 1>&2
14 |
15 | #{"username":"demouser@cmbu.local","password":"demoVMware1!","tenantName":"field-demo.vrni.cmbu.local","vIDMURL":"","redirectURL":"","authenticationDomains":{"0":{"domainType":"LDAP","domain":"vmware.com","redirectUrl":""},"1":{"domainType":"LOCAL_DOMAIN","domain":"localdomain","redirectUrl":""}},"currentDomain":1,"domain":"localdomain","nDomains":2,"serverTimestamp":false,"loginFieldPlaceHolder":"Username"}
16 |
--------------------------------------------------------------------------------
/test/mod.command:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [[ $(readlink -f $0) =~ ^(.*)/([^/]+)$ ]]; then
3 | WORKDIR=${BASH_REMATCH[1]}
4 | FILE=${BASH_REMATCH[2]}
5 | if [[ ${FILE} =~ ^[^.]+[.](.+)[.]sh$ ]]; then
6 | TYPE=${BASH_REMATCH[1]}
7 | fi
8 | fi
9 | STATEDIR=${WORKDIR}/state
10 | JQDIR=${WORKDIR}/jq
11 | DRVDIR=${WORKDIR}/drv
12 | printf '%s' "${WORKDIR}" >${DRVDIR}/link.cmd
13 | source ${DRVDIR}/mod.core
14 |
15 | # build filter
16 | function cmd {
17 | local COMMAND=${1}
18 | case "${COMMAND}" in
19 | watch)
20 | watch -t -c -n 3 "${WORKDIR}/${FILE} 2>/dev/null"
21 | ;;
22 | json)
23 | local PAYLOAD=$(payload)
24 | setContext "${PAYLOAD}" "${TYPE}"
25 | echo "${PAYLOAD}" | jq --tab .
26 | ;;
27 | filter)
28 | local FILTER=${2}
29 | local PAYLOAD=$(filter "$(payload)" "${FILTER}")
30 | setContext "${PAYLOAD}" "${TYPE}"
31 | buildTable "${PAYLOAD}"
32 | ;;
33 | *)
34 | local PAYLOAD=$(payload)
35 | setContext "${PAYLOAD}" "${TYPE}"
36 | buildTable "${PAYLOAD}"
37 | ;;
38 | esac
39 | }
40 |
41 | function payload {
42 | local INPUT=$(eval $(drv "${TYPE}")) # link to drv
43 | local MOO="MOO"
44 | #local INPUT=$(${WORKDIR}/drv/drv.data.list.sh)
45 | local PAYLOAD=$(echo "${INPUT}" | jq -r "$(run)")
46 | printf "${PAYLOAD}"
47 | }
48 |
49 | function drv {
50 | local DRIVER=${1}
51 | printf "${WORKDIR}/drv/drv.${DRIVER}.sh"
52 | }
53 |
--------------------------------------------------------------------------------
/test/sddc.parameters:
--------------------------------------------------------------------------------
1 | {
2 | "dns": "172.16.0.1",
3 | "domain": "lab",
4 | "endpoints": [
5 | {
6 | "type": "vrni",
7 | "hostname": "demo.vrni.local",
8 | "username": "demo",
9 | "password": "demo",
10 | "online": "true"
11 | }
12 | ]
13 | }
14 |
--------------------------------------------------------------------------------
/test/test.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | ./drv.complete.sh "hos" | jq '.data.partialQueryCompletions.completionsByType.ENTITY_TYPE[] | .completion'
4 |
--------------------------------------------------------------------------------