Trouble with Fortigate PropertySource script
I am trying to write a Groovy PropertySource script, which will SSH into Fortigate devices and return the list of available VDOMs.
In Putty, I would run the command
Then I would type "edit ?" and without hitting enter, the list of available VDOMs would appear (where each VDOM entry beginning with "<vdom> Virtual Domain Name"):

I have the following Groovy script (modified from a ConfigSource in the portal):
<span class="kwd">import</span><span class="pln"> com</span><span class="pun">.</span><span class="pln">santaba</span><span class="pun">.</span><span class="pln">agent</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="typ">Settings</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> net</span><span class="pun">.</span><span class="pln">schmizz</span><span class="pun">.</span><span class="pln">sshj</span><span class="pun">.</span><span class="typ">SSHClient</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> net</span><span class="pun">.</span><span class="pln">schmizz</span><span class="pun">.</span><span class="pln">sshj</span><span class="pun">.</span><span class="pln">connection</span><span class="pun">.</span><span class="pln">channel</span><span class="pun">.</span><span class="pln">direct</span><span class="pun">.</span><span class="typ">Session</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> net</span><span class="pun">.</span><span class="pln">schmizz</span><span class="pun">.</span><span class="pln">sshj</span><span class="pun">.</span><span class="pln">transport</span><span class="pun">.</span><span class="pln">verification</span><span class="pun">.</span><span class="typ">PromiscuousVerifier</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span class="pln">concurrent</span><span class="pun">.</span><span class="typ">TimeUnit</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">security</span><span class="pun">.</span><span class="typ">MessageDigest</span><span class="pln">
</span><span class="com">//def host = hostProps.get("system.hostname")</span><span class="pln">
def host </span><span class="pun">=</span><span class="pln"> </span><span class="str">"<ip address>"</span><span class="pln">
</span><span class="com">//def user = hostProps.get("ssh.user", hostProps.get("config.user"))</span><span class="pln">
def user </span><span class="pun">=</span><span class="pln"> </span><span class="str">"<username>"</span><span class="pln">
</span><span class="com">//def pass = hostProps.get("ssh.pass", hostProps.get("config.pass"))</span><span class="pln">
def pass </span><span class="pun">=</span><span class="pln"> </span><span class="str">"<password>"</span><span class="pln">
</span><span class="com">//def port = hostProps.get("auto.config.port", "22")</span><span class="pln">
def port </span><span class="pun">=</span><span class="pln"> </span><span class="str">"22"</span><span class="pln">
def time </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Settings</span><span class="pun">.</span><span class="pln">getSettingInt</span><span class="pun">(</span><span class="str">"configcollector.script.timeout"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">120</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">1000</span><span class="pln">
def startTime </span><span class="pun">=</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="pln">currentTimeMillis</span><span class="pun">()</span><span class="pln">
def client </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">SSHClient</span><span class="pun">()</span><span class="pln">
client</span><span class="pun">.</span><span class="pln">setTimeout</span><span class="pun">(</span><span class="pln">time</span><span class="pun">)</span><span class="pln">
client</span><span class="pun">.</span><span class="pln">setConnectTimeout</span><span class="pun">(</span><span class="pln">time</span><span class="pun">)</span><span class="pln">
client</span><span class="pun">.</span><span class="pln">addHostKeyVerifier</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">PromiscuousVerifier</span><span class="pun">())</span><span class="pln">
</span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> client</span><span class="pun">.</span><span class="pln">loadKnownHosts</span><span class="pun">()</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">ex</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">/* No Known Hosts File */</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
def session
</span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
client</span><span class="pun">.</span><span class="pln">connect</span><span class="pun">(</span><span class="pln">host</span><span class="pun">,</span><span class="pln"> port</span><span class="pun">.</span><span class="pln">toInteger</span><span class="pun">())</span><span class="pln">
</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">pKey </span><span class="pun">&&</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">File</span><span class="pun">(</span><span class="pln">pKey</span><span class="pun">).</span><span class="pln">exists</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
client</span><span class="pun">.</span><span class="pln">authPublickey</span><span class="pun">(</span><span class="pln">user</span><span class="pun">,</span><span class="pln"> client</span><span class="pun">.</span><span class="pln">loadKeys</span><span class="pun">(</span><span class="pln">pKey</span><span class="pun">))</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
client</span><span class="pun">.</span><span class="pln">authPassword</span><span class="pun">(</span><span class="pln">user</span><span class="pun">,</span><span class="pln"> pass</span><span class="pun">)</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
session </span><span class="pun">=</span><span class="pln"> client</span><span class="pun">.</span><span class="pln">startSession</span><span class="pun">()</span><span class="pln">
session</span><span class="pun">.</span><span class="pln">allocateDefaultPTY</span><span class="pun">()</span><span class="pln">
def cmd </span><span class="pun">=</span><span class="pln"> session</span><span class="pun">.</span><span class="pln">exec</span><span class="pun">(</span><span class="str">"config vdom\n edit ?"</span><span class="pun">)</span><span class="pln">
cmd</span><span class="pun">.</span><span class="pln">join</span><span class="pun">(</span><span class="pln">time</span><span class="pun">.</span><span class="pln">toInteger</span><span class="pun">(),</span><span class="pln"> </span><span class="typ">TimeUnit</span><span class="pun">.</span><span class="pln">MILLISECONDS</span><span class="pun">)</span><span class="pln">
cmd</span><span class="pun">.</span><span class="pln">close</span><span class="pun">()</span><span class="pln">
def rawOut </span><span class="pun">=</span><span class="pln"> cmd</span><span class="pun">.</span><span class="pln">getInputStream</span><span class="pun">().</span><span class="pln">text
print </span><span class="str">"rawout: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> rawOut
def out </span><span class="pun">=</span><span class="pln"> rawOut</span><span class="pun">.</span><span class="pln">trim</span><span class="pun">()</span><span class="pln">
</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">out</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
print out
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Exception</span><span class="pln"> ex</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
println ex
</span><span class="pun">}</span><span class="pln">
finally </span><span class="pun">{</span><span class="pln">
session</span><span class="pun">?.</span><span class="pln">close</span><span class="pun">()</span><span class="pln">
client</span><span class="pun">?.</span><span class="pln">disconnect</span><span class="pun">()</span><span class="pln">
</span><span class="pun">}</span>The result is only "true" (from !groovy).

I'm not super great with Groovy, what am I missing here? Thanks.
mhashemi
Posted 5 years ago·Last reply 5 years ago
5 comments
mhashemi
OP5 years agoThanks, that seems to have worked. I've published the final version to https://github.com/wetling23/Public.LogicMonitorPsScripts/tree/master/PropertySourcesScripts/fortinet.
Michael Rodrigues
·5 years ago@mhashemi change "list.Add" to "list.add" without a capital "A" and it should work.
mhashemi
OP5 years agoThis seems to be working better (at least I can get back data). Now I am running into a problem adding the VDOMs to a list, which I will (eventually) turn into a property. I am getting the following output:
Any idea why, with the code below, I am failing to append "root" and "exit" to the list of VDOMs?
LM User
·5 years agoHm, so the issue is that, when executing these commands manually, the question mark itself prompts a response from the target device. I'm not familiar with the library used to perform the SSH session here, but the target device should receive the question mark and spit out the output the same. Do you need to get the output stream instead of the input stream?
Like i said, not familiar with that particular method of connecting via SSH. I use JSch or Expect.
mhashemi
OP5 years agoJust to be clear, I should add that, once this actually gets the command output, I will want to remove the "<vdom> Virtual Domain Name" lines and return the actual VDOM list as a comma-separated string.