Port WMI to linux collectors
Many of the WMI property sources could easily be done with wmic on Linux, look at MSSQL property source this simply looks for the SQL instances ect with WMI this can easily be done on Linux reducing the need for a Windows based collector I have included sample Groovy code and a link to a static compiled wmic to make life easier to test. wmic can be found here https://assets.nagios.com/downloads/nagiosxi/agents/wmic_1.3.16_static_64bit.tar.gz if needed I can jump on a session with your team and show it working on our Linux collectors.
Thoughts would be have the WMI class check what the underlying OS is on the collector to determine which method to use?
<span class="pln">def queryAll</span><span class="pun">(</span><span class="pln">host</span><span class="pun">,</span><span class="pln"> query</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
def map </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[]</span><span class="pln">
def wmi_user </span><span class="pun">=</span><span class="pln"> hostProps</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">"wmi.user"</span><span class="pun">)</span><span class="pln">
def wmi_pass </span><span class="pun">=</span><span class="pln"> hostProps</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">"wmi.pass"</span><span class="pun">)</span><span class="pln">
def wmi_domain </span><span class="pun">=</span><span class="pln"> hostProps</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">"wmi.domain"</span><span class="pun">)</span><span class="pln">
def command </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"/usr/local/bin/wmic"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"-U"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"${wmi_domain}/${wmi_user}%${wmi_pass}"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"//${host}"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"${query}"</span><span class="pun">].</span><span class="pln">execute</span><span class="pun">().</span><span class="pln">text</span><span class="pun">.</span><span class="pln">split</span><span class="pun">(</span><span class="str">"\n"</span><span class="pun">)</span><span class="pln">
command</span><span class="pun">.</span><span class="pln">each </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">if</span><span class="pun">(!</span><span class="pln">it</span><span class="pun">.</span><span class="pln">contains</span><span class="pun">(</span><span class="str">"CLASS:"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
mappings </span><span class="pun">=</span><span class="pln"> it</span><span class="pun">.</span><span class="pln">tokenize</span><span class="pun">(</span><span class="str">"|"</span><span class="pun">)</span><span class="pln">
key </span><span class="pun">=</span><span class="pln"> mappings</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="lit">0</span><span class="pun">)</span><span class="pln">
value </span><span class="pun">=</span><span class="pln"> mappings</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="lit">1</span><span class="pun">)</span><span class="pln">
map </span><span class="pun"><<</span><span class="pln"> </span><span class="pun">[</span><span class="str">"DISPLAYNAME"</span><span class="pun">:</span><span class="pln">key</span><span class="pun">,</span><span class="str">"NAME"</span><span class="pun">:</span><span class="pln">value</span><span class="pun">]</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> map
</span><span class="pun">}</span>
Michael Baker
Posted 5 years ago·Last reply 3 years ago
6 comments
LM User
·3 years agoThat may be, but Microsoft has released officially supported Powershell for Linux. They’ll probably go that route. @Michael Rodrigues , thoughts?
Joe Williams
·3 years agoFrom what i hear this is pretty close to or already in beta for PowerShell. Likely only a matter of time before WMI happens.
WinRM is in beta from what I have heard.
michaeld
·3 years agoMoving away from WMI to WinRM would be the more forward looking path.
LM User
·3 years agoFrom what i hear this is pretty close to or already in beta for PowerShell. Likely only a matter of time before WMI happens.
Rik
·3 years agoHi Michael,
you might want to take a look at this recently release WMI open source library:
https://github.com/cesbit/aiowmi
If you have any questions with regards to this library feel free to reach out.
Michael Rodrigues
·5 years agoWe're working on getting "Windows Parity" on Linux collectors this year. WMI, Powershell, PDH. We're not using wmic, but more info will come as we progress.