11-02-2020 02:11 PM
I am using a script snap to use SSH to call a procedure on another server. The pipeline completes without error, but it’s not calling the procedure–and it’s not giving me any error messages, so I don’t know what is failing. Is there a way to view the log that is produced and/or some other method to debug the script?
from com.snaplogic.scripting.language import ScriptHook
from com.snaplogic.scripting.language.ScriptHook import *
from subprocess import Popen, PIPE
import subprocess as subprocess
class TransformScript(ScriptHook):
def init(self, input, output, error, log):
self.input = input
self.output = output
self.error = error
self.log = log
def execute(self):
self.log.info("Executing Transform script")
while self.input.hasNext():
data = self.input.next()
cmdstr = " " + str(data['cmd']) + " "
# args = [cmdstr]
# proc = Popen(["ssh", "banjobs@server01.campus.ithaca.lan", " pwd "], shell=False, stdout=PIPE, stderr=PIPE)
proc = Popen(["ssh", "banjobs@server01.campus.ithaca.lan", " touch /u01/appworx/wjptest.txt "], shell=False, stdout=PIPE, stderr=PIPE)
# proc = Popen(["ssh", "banjobs@server01.campus.ithaca.lan", cmdstr ], shell=False, stdout=PIPE, stderr=PIPE)
out, err = proc.communicate()
exitcode = proc.returncode
proc.kill()
self.output.write(out)
self.log.info("Finished executing the Transform script")
hook = TransformScript(input, output, error, log)
11-02-2020 02:26 PM
Try wrapping your code in a try/catch where the catch writes the error to the error view, like in the default template for a Python script.
11-03-2020 08:32 AM
Ah…missed a few lines of code. Now I’m getting error info in the error view…helpful, thank you.
11-03-2020 08:15 AM
I’m using the default template for the python script, but nothing is being written to the error view.
11-12-2020 06:08 AM
Script snaps seem notoriously difficult to debug.
One technique that helps is very old-school… 1960’s old-school.
Try instrumenting your code.
In the SnapLogic environment, that could take a couple of forms. You could print a set of trace messages to a file (caveat: I have not tried this yet from a script snap). The other way is to create “debug” properties in your output docstream.
For example, you might create a global array named “Debug” or “Trace” in your script, to be added to the document you’re outputting, and any time you want to “print” a trace message with the line number you’re at and the values of some of your variables, you push a message string onto the end of the array.
I won’t claim this is not painful. If your script crashes without producing output, it is of no use. And interpreting your output consists of validating the pipeline and grabbing the JSON that comes out of the Script Snap, pasting it into a JSON formatter/viewer, and interpreting the results.
But at least it doesn’t leave you blindly scratching your head. 😕