Forum Discussion
- Mike_MonizProfessor
You would likely need to write a custom DataSource but sounds doable. Perhaps clone VMware_vCenter_VMStatus and modify the groovy code to query mounted media and connected state. You can also try asking LM support if they have anything unofficial or tips.
- Michael_BakerNeophyte2 minutes ago, Michael Rodrigues said:
@Michael Baker you will need to toggle it to "Public" in the "My Repository" tab of the Exchange for others to download it.
We default everything to "Private" to avoid accidental publish.Done!
- Michael_BakerNeophyte
Round 2 this is much faster:
<?xml version="1.0" encoding="UTF-8" ?> <feed version="1.0" hasPendingRequests="false" > <company></company> <status>200</status> <errmsg>OK</errmsg> <interval>0</interval> <entry type="predatasource"> <version>1641510208</version> <name>VMware_vCenter_Check_If_ISO_Mounted</name> <displayedas>VMWAre VM Check If ISO Mounted</displayedas> <description>Detect possible CVE</description> <collector>batchscript</collector> <hasMultiInstances>true</hasMultiInstances> <useWildValueAsUniqueIdentifier>false</useWildValueAsUniqueIdentifier> <schedule>120</schedule> <appliesTo>system.virtualization =~ "VMware ESX vcenter"</appliesTo> <wildcardauto>true</wildcardauto> <wildcardpersist>false</wildcardpersist> <wildcardlinuxscript>ad_script</wildcardlinuxscript> <wildcardlinuxcmdline>type="embeded" </wildcardlinuxcmdline> <wildcardwinscript>ad_script</wildcardwinscript> <wildcardwincmdline>type="embeded" </wildcardwincmdline> <wildcardgroovyscript>/******************************************************************************* * © 2007-2019 - LogicMonitor, Inc. All rights reserved. ******************************************************************************/ import com.vmware.vim25.*; import com.vmware.vim25.mo.*; import java.security.cert.*; import org.apache.http.auth.*; import org.apache.http.conn.ssl.*; import org.apache.http.impl.client.*; import org.apache.http.util.EntityUtils; import org.apache.http.client.methods.HttpGet; import com.santaba.agent.groovyapi.esx.ESX import groovy.json.JsonSlurper; def host = hostProps.get("system.hostname") def user = hostProps.get("esx.user"); def pass = hostProps.get("esx.pass"); def addr = hostProps.get("esx.url") ?: "https://${host}/sdk"; def keyNamespace = hostProps.get(hostProps.get("topo.namespace", ""), "") def keyBlacklist = hostProps.get("topo.blacklist", "").tokenize(",") // Open a connection to the vSphere API, get a service instance and root folder def svc = new ESX(); svc.open(addr, user, pass, 10 * 1000); // timeout in 10 seconds def si = svc.getServiceInstance(); def rootFolder = si.getRootFolder(); // Get VMs def vms = new InventoryNavigator(rootFolder).searchManagedEntities("VirtualMachine"); // Get ESX Hosts def hostsystems = new InventoryNavigator(rootFolder).searchManagedEntities("HostSystem") // iterate over vms vms.each { vm -> // Get AD info def wildvalue = vm.MOR.val; def wildalias = vm.name; def config = vm.config.hardware.device for(dev in config) { if(dev instanceof com.vmware.vim25.VirtualCdrom) { if(dev.backing instanceof com.vmware.vim25.VirtualCdromIsoBackingInfo) { if(dev.connectable.connected) { println "${wildvalue}##${wildalias}"; } } } } } return 0 </wildcardgroovyscript> <wildcardschedule>60</wildcardschedule> <wildcarddisable>false</wildcarddisable> <wildcarddeleteinactive>false</wildcarddeleteinactive> <agdmethod>none</agdmethod> <agdparams></agdparams> <group></group> <tags>application,vsphere,virtualization,vm,vmware</tags> <technology>:: replaces old ESX_VM_Status :: - define esx.user and esx.pass for authentication - optionally override vSphere API URL with esx.url property - optionally enable vSphere Tags -> instance level properties by setting esx.tags to "true" (vCenter only) - url-encode ILPs that are strings in AD script</technology> <adlist><![CDATA[{"agdmethod":"none","method":"ad_script","agdparams":"","id":0,"filters":[],"params":{"type":"embeded","groovyscript":"/*******************************************************************************\n * © 2007-2019 - LogicMonitor, Inc. All rights reserved.\n ******************************************************************************/\n\nimport com.vmware.vim25.*;\nimport com.vmware.vim25.mo.*;\nimport java.security.cert.*;\nimport org.apache.http.auth.*;\nimport org.apache.http.conn.ssl.*;\nimport org.apache.http.impl.client.*;\nimport org.apache.http.util.EntityUtils;\nimport org.apache.http.client.methods.HttpGet;\nimport com.santaba.agent.groovyapi.esx.ESX\nimport groovy.json.JsonSlurper;\n\ndef host = hostProps.get(\"system.hostname\")\ndef user = hostProps.get(\"esx.user\");\ndef pass = hostProps.get(\"esx.pass\");\ndef addr = hostProps.get(\"esx.url\") ?: \"https://${host}/sdk\";\ndef keyNamespace = hostProps.get(hostProps.get(\"topo.namespace\", \"\"), \"\")\ndef keyBlacklist = hostProps.get(\"topo.blacklist\", \"\").tokenize(\",\")\n\n// Open a connection to the vSphere API, get a service instance and root folder\n\ndef svc = new ESX();\nsvc.open(addr, user, pass, 10 * 1000); // timeout in 10 seconds\n\ndef si = svc.getServiceInstance();\ndef rootFolder = si.getRootFolder();\n\n// Get VMs\ndef vms = new InventoryNavigator(rootFolder).searchManagedEntities(\"VirtualMachine\");\n\n// Get ESX Hosts\ndef hostsystems = new InventoryNavigator(rootFolder).searchManagedEntities(\"HostSystem\")\n\n// iterate over vms\nvms.each { vm ->\n\n // Get AD info\n def wildvalue = vm.MOR.val;\n def wildalias = vm.name;\n def config = vm.config.hardware.device\n for(dev in config)\n {\n if(dev instanceof com.vmware.vim25.VirtualCdrom) {\n if(dev.backing instanceof com.vmware.vim25.VirtualCdromIsoBackingInfo) {\n if(dev.connectable.connected) {\n println \"${wildvalue}##${wildalias}\";\n }\n }\n }\n }\n}\n\nreturn 0\n"}}]]></adlist> <schemaVersion>2</schemaVersion> <dataSourceType>1</dataSourceType> <attributes> <attribute> <name>scripttype</name> <value>embed</value> <comment></comment> </attribute> <attribute> <name>scriptgroovy</name> <value>import com.vmware.vim25.mo.*; import com.santaba.agent.groovyapi.esx.ESX; def host = hostProps.get("system.hostname") def user = hostProps.get("esx.user"); def pass = hostProps.get("esx.pass"); def addr = hostProps.get("esx.url") ?: "https://${host}/sdk"; def svc = new ESX(); svc.open(addr, user, pass, 10 * 1000); // timeout in 10 seconds def si = svc.getServiceInstance(); def rootFolder = si.getRootFolder(); def vms = new InventoryNavigator(rootFolder).searchManagedEntities("VirtualMachine"); vms.each { vm -> def wildvalue = vm.MOR.val; def config = vm.config.hardware.device for(dev in config) { if(dev instanceof com.vmware.vim25.VirtualCdrom) { if(dev.backing instanceof com.vmware.vim25.VirtualCdromIsoBackingInfo) { if(dev.connectable.connected) { println "${wildvalue}.isoconnected=1"; } } } } } return 0;</value> <comment></comment> </attribute> <attribute> <name>windowsscript</name> <value></value> <comment></comment> </attribute> <attribute> <name>linuxscript</name> <value></value> <comment></comment> </attribute> <attribute> <name>windowscmdline</name> <value></value> <comment></comment> </attribute> <attribute> <name>linuxcmdline</name> <value></value> <comment></comment> </attribute> <attribute> <name>eridetectioninterval</name> <value>60</value> <comment></comment> </attribute> <attribute> <name>eriscripttype</name> <value>embeded</value> <comment></comment> </attribute> <attribute> <name>eriscriptgroovy</name> <value>import com.santaba.agent.util.esx.EsxVcService import com.vmware.vim25.VirtualDisk import com.vmware.vim25.mo.Folder import com.vmware.vim25.mo.InventoryNavigator import com.vmware.vim25.mo.ManagedEntity import com.vmware.vim25.VirtualEthernetCard import com.vmware.vim25.VirtualDevice import groovy.json.JsonSlurper import org.apache.http.auth.AuthScope import org.apache.http.auth.UsernamePasswordCredentials import org.apache.http.client.methods.HttpGet import org.apache.http.conn.ssl.AllowAllHostnameVerifier import org.apache.http.conn.ssl.SSLContexts import org.apache.http.conn.ssl.TrustStrategy import org.apache.http.impl.client.BasicCredentialsProvider import org.apache.http.impl.client.HttpClients import org.apache.http.impl.client.LaxRedirectStrategy import org.apache.http.util.EntityUtils import java.security.cert.CertificateException import java.security.cert.X509Certificate def host = hostProps.get("system.hostname") def user = hostProps.get("esx.user"); def pass = hostProps.get("esx.pass"); def custom_url = hostProps.get("esx.url"); def vmMorVal = instanceProps.get("wildvalue"); def vmName = instanceProps.get("wildalias"); def eri = host+"--"+vmMorVal; def ExternalResourceIDs = [eri] // Open a connection to the vSphere API, get a service instance and root folder def url = custom_url ?: String.format("https://%s/sdk", host); def svc = EsxVcService.connect(url, user, pass, 10 * 1000); // timeout in 10 seconds def si = svc.getServiceInstance(); def rootFolder = si.getRootFolder(); ManagedEntity[] vms; // Get VMs vms = new InventoryNavigator(rootFolder).searchManagedEntities("VirtualMachine"); // iterate over vms vms.each { vm -> // Get AD info def aVMMorVal = vm.MOR.val def aVMName = vm.name if(aVMMorVal == vmMorVal) { for (VirtualDevice vd : vm.getConfig().getHardware().getDevice()) { try { if (vd instanceof VirtualEthernetCard) { VirtualEthernetCard vEth = (VirtualEthernetCard) vd; ExternalResourceIDs += vEth.macAddress; } } catch (Exception e) { } } } } println "predef.externalResourceID=" + ExternalResourceIDs.join(","); println "predef.externalResourceType=" + "VirtualMachine" return 0;</value> <comment></comment> </attribute> <attribute> <name>eriwinscript</name> <value></value> <comment></comment> </attribute> <attribute> <name>erilinuxscript</name> <value></value> <comment></comment> </attribute> <attribute> <name>eriwincmdline</name> <value></value> <comment></comment> </attribute> <attribute> <name>erilinuxcmdline</name> <value></value> <comment></comment> </attribute> </attributes> <datapoints> <datapoint> <name>isoconnected</name> <dataType>7</dataType> <type>2</type> <postprocessormethod>namevalue</postprocessormethod> <postprocessorparam>isconnected</postprocessorparam> <usevalue>output</usevalue> <alertexpr></alertexpr> <alertmissing>1</alertmissing> <alertsubject></alertsubject> <alertbody></alertbody> <enableanomalyalertsuppression></enableanomalyalertsuppression> <adadvsettingenabled>false</adadvsettingenabled> <warnadadvsetting></warnadadvsetting> <erroradadvsetting></erroradadvsetting> <criticaladadvsetting></criticaladadvsetting> <description></description> <maxvalue>1</maxvalue> <minvalue>0</minvalue> <userparam1></userparam1> <userparam2></userparam2> <userparam3></userparam3> <iscomposite>false</iscomposite> <rpn></rpn> <alertTransitionIval>0</alertTransitionIval> <alertClearTransitionIval>0</alertClearTransitionIval> </datapoint> </datapoints> <graphs> </graphs> <overviewgraphs> </overviewgraphs> <scripts> </scripts> </entry> </feed>
- Mike_RodriguesProduct Manager
Awesome turnaround @Michael Baker. If you publish that to the Exchange I can put it through Security Review for you.
- Michael_BakerNeophyteJust now, Michael Rodrigues said:
Awesome turnaround @Michael Baker. If you publish that to the Exchange I can put it through Security Review for you.
Minor bigfix then I will push we have sooo many VC's doing it by hand would be nasty
- Michael_BakerNeophyte
Done G3Y49X
- Mike_RodriguesProduct Manager
Great! It's passed Security Review.
- Mike_RodriguesProduct Manager
@Michael Baker you will need to toggle it to "Public" in the "My Repository" tab of the Exchange for others to download it.
We default everything to "Private" to avoid accidental publish. @Michael Baker and @Michael Rodrigues - you guys are great! Asked a question and just a few hours later had a script and it was even in the vetted Exchange list - Thanks!
- Anonymous
Would be good to bundle a TopoSource with this so that VMs can be mapped to ISOs.
Related Content
- 8 months ago
- 8 months ago