├── .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' "$(&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](https://via.placeholder.com/15/f03c15/000000?text=+) `#f03c15` 24 | - ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `#c5f015` 25 | - ![#FFFFFF](https://via.placeholder.com/15/1589F0/000000?text=+) `#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 | --------------------------------------------------------------------------------