Joe Williams

  • Content Count

  • Joined

  • Last visited

  • Days Won


Community Reputation

5 Neutral

About Joe Williams

  • Rank
    Community Whiz Kid

Recent Profile Visitors

798 profile views
  1. It would be nice to be able to clone dashboards via the API. I have an onboarding system I wrote for some of our technicians that creates folders and collector groups and sets specific properties that are required for our ticketing system. It also creates use roles with the specific permissions, etc.... One of the items I want to be able to do is have a Default Dashboard group and list out the dashboards in there. Allowing them to chose which ones they want. For the record I tried to be cheeky and used Developer Tools to see what was being done to clone a dashboard and I can't even use that to get it working. Comes up with 'HTTP Status 415 – Unsupported Media Type'.
  2. Not sure I like this idea. This could be handled in your ticketing system. All alerts have a specific LMID. Send that as well with the ticket create and if the incident is still open/active child or don't create at all.
  3. I am writing a Groovy DataSource for covering some items that aren't there by default for Nimble. I am having issues getting the data to appear properly under the instances I would think it should. Active Discovery is this and it works as expected. import com.santaba.agent.groovyapi.expect.Expect; import com.santaba.agent.groovyapi.snmp.Snmp; import com.santaba.agent.groovyapi.http.*; import com.santaba.agent.groovyapi.jmx.*; import org.xbill.DNS.*; hostname = hostProps.get("system.hostname"); nimuser=hostProps.get("nim.user"); nimpass=hostProps.get("nim.pass"); cli =, nimuser,nimpass) cli.send("ctrlr --list \n\r") cli.expect(/-----/) cli.expect("Nimble OS") commandOutput=cli.before() //We only want the output from after the first header row to end of the command (when the prompt is back) commandOutput.eachLine { if (!(it =~ /-----/) && !(it =~ /Name\s*State\s*Hostname /)) { //ignore table header if (it.startsWith("A") || it.startsWith("B")) { tokens = it.split(); //println it //print tokens[0]; //println "\r\n" controller = tokens[0] controllername = tokens[2] println controller+"##"+controllername } } } cli.send("exit \n\r") cli.expectClose() I then have the below for the main part of the script. It is currently just a POC. I am not grabbing everything I want yet. When I test the script I get back what I want, but no matter what, the instances for the fans do not show up under the Controllers. import com.santaba.agent.groovyapi.expect.Expect; import com.santaba.agent.groovyapi.snmp.Snmp; import com.santaba.agent.groovyapi.http.*; import com.santaba.agent.groovyapi.jmx.*; import org.xbill.DNS.*; hostname = hostProps.get("system.hostname"); nimuser=hostProps.get("nim.user"); nimpass=hostProps.get("nim.pass"); arraydesc = "##WILDALIAS##"; cli =, nimuser,nimpass) cli.send("ctrlr --info ##WILDVALUE## \n\r") cli.expect("Name: ") cli.expect("Nimble OS") commandOutput=cli.before() commandOutput.eachLine // { instance_index, it -> { // println it; if (it.startsWith("\tpower-supply")) { nametokens = it.split(" at "); psname = nametokens[0]; psname = psname.trim(); psname = psname.replace("\t", ""); psdescr = nametokens[1]; psdescr = psdescr.split(":"); psdescr = psdescr[0]; tokens = it.split(": "); psstate = tokens[1]; psstate = psstate.trim(); psstate = psstate.replace("\t", ""); if (psstate == "ok") { psstate = "0"; } else { psstate = "1"; } // println psname+" - "+psdescr+" - "+psstate; } if (it.startsWith("\tfan")) { fannamestoken = it.split(" at "); fanname = fannamestoken[0]; fanname = fanname.trim(); fanname = fanname.replace("\t", ""); fandescr = fannamestoken[1]; fandescr = fandescr.split(" of"); fandescr = fandescr[0]; fandescr = fandescr.trim(); fandescr = fandescr.replace("\t",""); fanstate = it.split(","); fanstate = fanstate[0]; fanstate = fanstate.split(": "); fanstate = fanstate[1]; fanstate = fanstate.trim(); fanstate = fanstate.replace("\t", ""); if (fanstate == "ok") { fanstate = "0"; } else { fanstate = "1"; } fanspeed = it.split("speed: "); fanspeed = fanspeed[1]; fanspeed = fanspeed.trim(); fanspeed = fanspeed.replace("\t", ""); fanspeed = fanspeed.replace("rpm", "") //println fanname+" - "+fandescr+" - "+fanstate+" - "+fanspeed; println "${arraydesc}##${fanname}######" println "auto.nimble_array_fan_description=${fandescr}" println "auto.nimble_array_grouptype=fan" println "${arraydesc}##${fanname}######.Status=${fanstate}"; } } cli.send("exit \n\r") cli.expectClose() When I test the script and choose say the A controller I get this as the output. LabNimble02-A##fan1###### auto.nimble_array_fan_description=front auto.nimble_array_grouptype=fan LabNimble02-A##fan1######.Status=0 LabNimble02-A##fan2###### auto.nimble_array_fan_description=front auto.nimble_array_grouptype=fan LabNimble02-A##fan2######.Status=0 LabNimble02-A##fan3###### auto.nimble_array_fan_description=rear auto.nimble_array_grouptype=fan LabNimble02-A##fan3######.Status=0 LabNimble02-A##fan4###### auto.nimble_array_fan_description=rear auto.nimble_array_grouptype=fan LabNimble02-A##fan4######.Status=0
  4. This is the way I will end up probably going, but was hoping I didn't have to go through all of that. I just wanted to simply clone it.
  5. This is a good idea. I would also tag on and say can we do it for a collector group? So that way when a new collector is added to a specific group, it just inherits the schedule?
  6. Ultimately I will be using PHP, but the above example/code was from Postman. Attached is a screenshot of Postman.
  7. Well I got all excited, until I read your edit. I guess I will just do it the hard way, dump the base groups with their properties and use PHP to loop through.
  8. Is there a way to clone a dashboard group? I am automating our onboard procedure for customers and this is one of the last steps. Currently I have a form that will automatically create a collector group, resource group, user role, etc.... But I can't seem to clone a dashboard group. I tried to do the sneaky backdoor way and use developer tools to show me the rest calls, but I keep getting back 415 Unsupported Media Type My Postman attempts look like this. {{url}}/dashboard/groups/18/asyncclone?recursive=true { "name": "TestCustomer1", "description": "", "parentId": "1", "widgetTokens": [ { "name": "CompanyName", "value": "TestCustomer1" }, { "name": "defaultResourceGroup", "value": "BaseGroup/Onboarding/TestCustomer1" } ] } Where 18 is the ID of the default dashboards group.
  9. There is not a built in way. You would have to write an extension to your browser or use something like GreaseMonkey or UserScripts.
  10. We set a property on each customer folder to pass a code to our helpdesk software. If this property isn't set, a ticket can't be created. So we put a default catch all property on the root folder. I am attempting to write a rest report so we can see which folders don't have the property set themselves. $queryParams = '?fields=customProperties,name,id&size=1000&sort=fullPath&filter=fullPath~Customers,,customProperties.value:DefaultCODE'; My first attempt was match what folders have the default code applied to them. This didn't work, I am guessing because the property isn't truly applied to the folder as it is inherited. So how do I find folders that don't have the property directly applied to it?
  11. We are onboarding a customer currently that is using Cohesity. The default Linux SNMP datasources pick up CPU, Disks, Interfaces and Memory.
  12. I am writing a custom datasource for a temperature monitor. We want to alert on if the temperature falls to high or to low. I figured limit would be what we want. This is what I have so far, no matter what it returns 0 tho. I have adjusted the numbers so Temperature falls outside and inside the range and it always returns 0. if(limit(Temperature, 46, 60), 0, 1) Is my understanding of this wrong? Eventually I would chain this to return different numbers based on Error and Critical thresholds, but can't get this even started lol.
  13. As a MSP this would be nice considering we have to name things like ESXI01 - CustomerName.
  14. We see the issue when we attempt to get aggregate bandwidth across a customers environment. We also see it when we attempt to show VM status. Even if we filter it to Error and Critical it will say the 2k limit.
  15. SYSLOG is another where we have this issue. We have received 1000s of duplicate alerts in the span of minutes. We had to create special escalation chains just to throttle it properly when it does it.