diff options
author | Alexander Bersenev <bay@hackerdom.ru> | 2011-06-18 21:52:40 +0000 |
---|---|---|
committer | Alexander Bersenev <bay@hackerdom.ru> | 2011-06-18 21:52:40 +0000 |
commit | 34711186c479a6010a28ba916e1cdbf81fe505b4 (patch) | |
tree | 541bac23c7800c7a3ac654b653add98e227c6f37 | |
parent | another performace improvements (diff) | |
download | autodep-34711186c479a6010a28ba916e1cdbf81fe505b4.tar.gz autodep-34711186c479a6010a28ba916e1cdbf81fe505b4.tar.bz2 autodep-34711186c479a6010a28ba916e1cdbf81fe505b4.zip |
reporting a possible dependency packages
-rw-r--r-- | logger/src/autodep/logfs/portage_utils.py | 41 | ||||
-rwxr-xr-x | logger/src/autodep/showfsevents.py | 58 | ||||
-rw-r--r-- | logger/src/hook_fusefs/hookfs.c | 2 |
3 files changed, 83 insertions, 18 deletions
diff --git a/logger/src/autodep/logfs/portage_utils.py b/logger/src/autodep/logfs/portage_utils.py new file mode 100644 index 0000000..6592d7a --- /dev/null +++ b/logger/src/autodep/logfs/portage_utils.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python2 + +import os +import subprocess +import re + +def getpackagesbyfiles(files): + ret={} + listtocheck=[] + for f in files: + if os.path.isdir(f): + ret[f]="directory" + else: + listtocheck.append(f) + + try: + proc=subprocess.Popen(['qfile']+['--nocolor','--exact','','--from','-'], + stdin=subprocess.PIPE, stdout=subprocess.PIPE,stderr=subprocess.PIPE, + bufsize=4096) + + out,err=proc.communicate("\n".join(listtocheck)) + if err!=None: + print "Noncritical error while launch qfile %s"%err; + + lines=out.split("\n") + #print lines + line_re=re.compile(r"^([^ ]+)\s+\(([^)]+)\)$") + for line in lines: + if len(line)==0: + continue + match=line_re.match(line) + if match: + ret[match.group(2)]=match.group(1) + else: + print "Util qfile returned unparsable string: %s" % line + + except OSError,e: + print "Error while launching qfile: %s" % e + + + return ret
\ No newline at end of file diff --git a/logger/src/autodep/showfsevents.py b/logger/src/autodep/showfsevents.py index 24a4bdd..fd628cd 100755 --- a/logger/src/autodep/showfsevents.py +++ b/logger/src/autodep/showfsevents.py @@ -4,11 +4,8 @@ import os import sys import logfs.fstracer +import logfs.portage_utils -def printevents(events): - for event in events: - print "%s %s"%(event[1],event[2]) - #logfs.fstracer.getfsevents("/bin/sh", ["sh" , "-c", "/usr/bin/tac bay_success; /usr/bin/tac bay_god bay_god2"]) #events=logfs.fstracer.getfsevents("/bin/cat", ["cat" , "l l l"]) if len(sys.argv)<2: @@ -16,32 +13,59 @@ if len(sys.argv)<2: exit(1) events=logfs.fstracer.getfsevents(sys.argv[1], sys.argv[1:],approach="fusefs") +print "Program finished, analyzing dependencies" +# get unique filenames +filenames={} +for stage in events: + succ_events=events[stage][0] + fail_events=events[stage][1] + for filename in succ_events: + filenames[filename]="" + for filename in fail_events: + filenames[filename]="" +filenames=filenames.keys(); + +file_to_package=logfs.portage_utils.getpackagesbyfiles(filenames) #print events -for stage in events: +stagesorder={"setup":1,"unpack":2,"prepare":3,"compile":4,"test":5, + "src_install":6,"preinst":7,"postinst":8, "unknown":9} + +for stage in sorted(events, key=stagesorder.get): succ_events=events[stage][0] fail_events=events[stage][1] print "On stage %s:" % stage - for filename in sorted(succ_events): - print " %40s\t" % filename, + for filename in sorted(succ_events, key=file_to_package.get): + print " %-40s" % filename, + action="" if succ_events[filename]==[False,False]: - print "accessed" + action="accessed", elif succ_events[filename]==[True,False]: - print "readed" + action="readed", elif succ_events[filename]==[False,True]: - print "writed" + action="writed", elif succ_events[filename]==[True,True]: - print "readed and writed" - for filename in sorted(fail_events): + action="readed and writed", + + print " %-21s " % action, + if filename in file_to_package: + print file_to_package[filename], + print - print " %40s\t"%filename, + for filename in sorted(fail_events, key=file_to_package.get): + print " %-40s" % filename, + action="" if fail_events[filename]==[True,False]: - print "file not found" + action="file not found" elif fail_events[filename]==[True,True]: - print "blocked somewhen, not found somewhen" + action="blocked and not found" elif fail_events[filename]==[False,True]: - print "blocked" + action="blocked" elif fail_events[filename]==[False,False]: - print "other error" + action="other error" + print " %-21s " % action, + if filename in file_to_package: + print file_to_package[filename], + print ##logfs.fstracer.getfsevents("emerge", ["emerge","--info"])
\ No newline at end of file diff --git a/logger/src/hook_fusefs/hookfs.c b/logger/src/hook_fusefs/hookfs.c index 9241a2a..6456bef 100644 --- a/logger/src/hook_fusefs/hookfs.c +++ b/logger/src/hook_fusefs/hookfs.c @@ -93,7 +93,7 @@ pid_t getparentpid(pid_t pid){ filedata[bytes_readed]=0; - char *beg_scan_offset=rindex(filedata,')'); + char *beg_scan_offset=strrchr(filedata,')'); if(beg_scan_offset==NULL) { fclose(stat_file_handle); return 0; |