Python Sample Script


import re
import ntpath
import glob
import subprocess

# In order to get this tool to run correctly, you'll need python installed (duh!) and graphviz
basedir = "/home/ronald-dev/allBashScript/"

'''
This function will scan a bash file, and look for any dependency to another bash file
@param String The fileName
@return Array The dependency filenames
'''
def readDependencies(fileName):
f = open(fileName, 'r')
content = f.read()
occurences = {} # {file1.sh:1, file2.sh:1, file3.sh:1}
for m in re.finditer('[\w|\/]*\.sh', content):
word = ntpath.basename(content[m.start(): m.end()])
# print str(m.start()) + " to " + str(m.end()) + ": " + word
if word not in occurences:
isComment = False
index = m.start()
while index > 0 and content[index] != "\n":
if content[index] == "\"" or content[index] == "'" or content[index] == "#" :
isComment = True
break
else:
index = index-1

if isComment == False:
occurences[word]=1
f.close()
return occurences.keys()

'''
Scan one bash file and convert it dependencies to GraphViz notation
@param String The fileName
@param Array The dependency filenames
@return String GraphViz notation "bash01.sh" -> "bash02.sh";[NEWLINE] etc
'''
def toGraphvizNotation(fileName, arrayOfDependencies):
string = ""
filename = ntpath.basename(fileName)
for dependency in arrayOfDependencies:
string += ' "' + filename + '" -> "' + dependency + "\";\n"

return string

'''
Scans all bash file, with extension .sh
@param String The directory to scan
@return Array Array of filenames
'''
def readAllBashFiles(directory):
return glob.glob(directory+"*.sh")

'''
Scan multiple bash files and convert their dependencies to GraphViz notation
@param String The directory to scan
@return String GraphViz notation "bash01.sh" -> "bash02.sh";[NEWLINE] etc
'''
def generateGraphVizFile(basedir):
bashfiles = readAllBashFiles(basedir)
#print bashfiles
graphVizFileContent = ""

for bashfile in bashfiles:
graphVizFileContent += toGraphvizNotation(bashfile, readDependencies(bashfile))

graphVizFileContent = "digraph G { \n"+ graphVizFileContent+ "}"
# print graphVizFileContent;
return graphVizFileContent

'''
Write to a content to a file
@param String The filename to be written to
@return String The content
'''
def writeGraphvizFile(filename, graphVizFileContent):
f = open(filename, 'w')
f.write(graphVizFileContent)
f.close()

writeGraphvizFile("/tmp/bashdependencies.dot", generateGraphVizFile(basedir))
subprocess.call(["/usr/bin/dot", "-T", "svg", "-o", "/tmp/allBashScript.svg", "/tmp/bashdependencies.dot"])
subprocess.call(["eog", "/tmp/allBashScript.svg"])