diff --git a/gui/Bin/scytherview.py b/gui/Bin/scytherview.py new file mode 100755 index 0000000..4fbdb4b --- /dev/null +++ b/gui/Bin/scytherview.py @@ -0,0 +1,84 @@ +#!/usr/bin/python +# +# Convert scyther dot output to a printable PDF and display it +# +# This is a simple hack to be able to quickly use the graphical output +# of Scyther if one only has graphviz, but not elementtree and wxPython. +# +# Notes: only works under Linux currently, because of silly assumptions +# on temporary directories and pdf viewers. +# +import os,sys,commands +import os.path + +tempcount = 0 + +def generateTemp(extension='tmp'): + # We need a temporary file to hold the generated postscript stuff before + # it is converted to pdf + global tempcount + + tempcount = tempcount + 1 + tmp = '/tmp/output_dot_%s_%i.%s' % (os.getpid(),tempcount,extension) + + try: + os.unlink(tmp) + except: + pass + return tmp + +def scyther_to_dotfile(): + """ Run Scyther, return dotfile name """ + + scythername = os.path.join(os.path.dirname(__file__),"scyther-linux") + args = " ".join(sys.argv[1:]) + tmpdotfile = generateTemp('dot') + + command = "%s --plain --dot-output %s > %s" % (scythername, args, tmpdotfile) + output = commands.getoutput(command) + return (output,tmpdotfile) + +def dotfile_to_pdffile(dotfile,outfile=None): + """ Generate a PDF file (name is returned) from an input dotfile + name """ + + tmp = generateTemp('ps') + + # First split the input per digraph and call dot with -Gsize arguments to make + # it fit to a landscape page + dotdata = open(dotfile, "r") + f = None + for line in dotdata.xreadlines(): + if (line.find('digraph') == 0): + f = os.popen("dot -Gsize='11.0,8.0' -Gratio=fill -Tps >>%s" % (tmp),'w') + print >>f, line + dotdata.close() + + if not f: + return None + f.close() + + if not outfile: + outfile = generateTemp('pdf') + + # Now convert the resulting stuff to a pdf + os.system('ps2pdf -sPAPERSIZE=a4 -g7014x5300 -r600 %s %s' % (tmp,outfile)) + #os.system('ps2pdf -g8300x6250 -r600 %s %s' % (tmp,outf)) + + # And remove the temp file + os.unlink(tmp) + + return outfile + +def main(): + (output,dotfile) = scyther_to_dotfile() + print output + pdffile = dotfile_to_pdffile(dotfile) + os.unlink(dotfile) + if pdffile: + commands.getoutput("xpdf %s" % pdffile) + os.unlink(pdffile) + else: + print "No graphs generated." + +main()