aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Bersenev <bay@hackerdom.ru>2011-06-18 21:52:40 +0000
committerAlexander Bersenev <bay@hackerdom.ru>2011-06-18 21:52:40 +0000
commit34711186c479a6010a28ba916e1cdbf81fe505b4 (patch)
tree541bac23c7800c7a3ac654b653add98e227c6f37
parentanother performace improvements (diff)
downloadautodep-34711186c479a6010a28ba916e1cdbf81fe505b4.tar.gz
autodep-34711186c479a6010a28ba916e1cdbf81fe505b4.tar.bz2
autodep-34711186c479a6010a28ba916e1cdbf81fe505b4.zip
reporting a possible dependency packages
-rw-r--r--logger/src/autodep/logfs/portage_utils.py41
-rwxr-xr-xlogger/src/autodep/showfsevents.py58
-rw-r--r--logger/src/hook_fusefs/hookfs.c2
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;