aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Bersenev <bay@hackerdom.ru>2011-07-03 16:26:50 +0000
committerAlexander Bersenev <bay@hackerdom.ru>2011-07-03 16:26:50 +0000
commit1e08a6bccc05184a6f864263194b45066b8acea5 (patch)
treedaaab8313c4f6f69117232ce9a7485f61c047c9e
parentchanged format of outout (diff)
downloadautodep-1e08a6bccc05184a6f864263194b45066b8acea5.tar.gz
autodep-1e08a6bccc05184a6f864263194b45066b8acea5.tar.bz2
autodep-1e08a6bccc05184a6f864263194b45066b8acea5.zip
package files blocking feature, improved command line arguments
-rw-r--r--logger/src/autodep/logfs/fstracer.py8
-rw-r--r--logger/src/autodep/logfs/portage_utils.py22
-rwxr-xr-xlogger/src/autodep/showfsevents.py89
-rw-r--r--logger/src/hook_fusefs/hookfs.c2
-rw-r--r--logger/src/hook_lib/file_hook.c2
5 files changed, 101 insertions, 22 deletions
diff --git a/logger/src/autodep/logfs/fstracer.py b/logger/src/autodep/logfs/fstracer.py
index 80666e6..66b1de3 100644
--- a/logger/src/autodep/logfs/fstracer.py
+++ b/logger/src/autodep/logfs/fstracer.py
@@ -98,8 +98,7 @@ def checkparent(parent,child):
# default access filter. Allow acess to all files
-def defaultfilter(eventname, filename, pid):
-
+def defaultfilter(eventname, filename, stage):
return True
# run the program and get file access events
@@ -201,7 +200,8 @@ def getfsevents(prog_name,arguments,approach="hooklib",filterproc=defaultfilter)
continue
message=record.split("\0")
- #print message
+ #if message[3]!="unknown":
+ #print message
try:
if message[4]=="ASKING":
@@ -263,8 +263,6 @@ def getfsevents(prog_name,arguments,approach="hooklib",filterproc=defaultfilter)
if len(clients)==0 and iszombie(pid):
break
- #print "\n\nRETURNING!!!!\n\n"
-
epoll.unregister(sock_listen.fileno())
epoll.close()
sock_listen.close()
diff --git a/logger/src/autodep/logfs/portage_utils.py b/logger/src/autodep/logfs/portage_utils.py
index 6592d7a..a03f6af 100644
--- a/logger/src/autodep/logfs/portage_utils.py
+++ b/logger/src/autodep/logfs/portage_utils.py
@@ -38,4 +38,24 @@ def getpackagesbyfiles(files):
print "Error while launching qfile: %s" % e
- return ret \ No newline at end of file
+ return ret
+
+def getfilesbypackage(packagename):
+ ret=[]
+ try:
+ proc=subprocess.Popen(['qlist']+['--nocolor',"--obj",packagename],
+ stdout=subprocess.PIPE,stderr=subprocess.PIPE,
+ bufsize=4096)
+
+ out,err=proc.communicate()
+ if err!=None and len(err)!=0 :
+ print "Noncritical error while launch qlist: %s" % err;
+
+ ret=out.split("\n")
+ if ret==['']:
+ ret=[]
+ except OSError,e:
+ print "Error while launching qfile: %s" % e
+
+ return ret
+
diff --git a/logger/src/autodep/showfsevents.py b/logger/src/autodep/showfsevents.py
index 9d252c3..cc4bec6 100755
--- a/logger/src/autodep/showfsevents.py
+++ b/logger/src/autodep/showfsevents.py
@@ -8,19 +8,44 @@ import sys
import logfs.fstracer
import logfs.portage_utils
-#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:
-# print "Usage: showfsevents.py <command>"
-# exit(1)
-
args_parser=optparse.OptionParser("%prog [options] <command>")
-args_parser.add_option("-v", action="store_true", dest="verbose", default=False, help="show accessed files")
+args_parser.add_option("-v", action="store_true", dest="verbose",
+ default=False, help="show accessed files")
+args_parser.add_option("-u", "--unknown", action="store_true", dest="show_unknown_stage",
+ default=False, help="show unknown stage")
+args_parser.add_option("-b", "--block",action="store", type="string",
+ dest="packages", default="", help="block an access to files from this packages")
+args_parser.epilog="Example: %s -b lsof,cowsay emerge bash" % (os.path.basename(sys.argv[0]))
+
+args_parser.disable_interspersed_args()
(options, args) = args_parser.parse_args()
-print args
-events=logfs.fstracer.getfsevents(args[0], args,approach="hooklib")
+if len(args)==0:
+ args_parser.print_help()
+ exit(1)
+#print args
+#print options
+
+filter_function=lambda eventname,filename,stage: True
+
+# handling --block
+if options.packages:
+ packages=options.packages.split(",")
+ files_to_block=[]
+ for package in packages:
+ files_in_package=logfs.portage_utils.getfilesbypackage(package)
+ if len(files_in_package)==0:
+ print "Bad package name: %s. Exiting" % package
+ exit(1)
+ files_to_block+=files_in_package
+ files_to_block={}.fromkeys(files_to_block)
+ # new filter function
+ def filter(eventname,filename,stage):
+ return not filename in files_to_block
+ filter_function=filter
+
+events=logfs.fstracer.getfsevents(args[0], args,approach="fusefs",filterproc=filter_function)
print "Program finished, analyzing dependencies"
# get unique filenames
@@ -29,9 +54,9 @@ for stage in events:
succ_events=events[stage][0]
fail_events=events[stage][1]
for filename in succ_events:
- filenames[filename]=""
+ filenames[filename]=None
for filename in fail_events:
- filenames[filename]=""
+ filenames[filename]=None
filenames=filenames.keys();
# temporary disabled
@@ -39,8 +64,8 @@ file_to_package=logfs.portage_utils.getpackagesbyfiles(filenames)
#file_to_package={}
#print events
-# this part is completly unreadable. It converting one complex struct(returned with getfsevents) to
-# another which good for user
+# this part is completly unreadable. It converting one complex struct(returned by getfsevents) to
+# another complex struct which good for generating output
events_converted_for_output={}
packagesinfo={}
@@ -95,12 +120,46 @@ stagesorder={"clean":1,"setup":2,"unpack":3,"prepare":4,"configure":5,"compile":
for package in sorted(packagesinfo):
- print "%-40s: %s"%(package,packagesinfo[package].keys())
+ # not showing special directory package
+ if package=="directory":
+ continue
+
+ stages=[]
+ for stage in sorted(packagesinfo[package].keys(), key=stagesorder.get):
+ if stage!="unknown" or options.show_unknown_stage:
+ stages.append(stage)
+
+ if len(stages)!=0:
+ print "%-40s: %s"%(package,stages)
+ # show information about accessed files
+ if options.verbose:
+ filenames={}
+ for stage in stages:
+ for filename in packagesinfo[package][stage]:
+ if len(packagesinfo[package][stage][filename]["found"])!=0:
+ was_readed,was_writed=packagesinfo[package][stage][filename]["found"]
+ if not filename in filenames:
+ filenames[filename]=[was_readed,was_writed]
+ else:
+ old_was_readed, old_was_writed=filenames[filename]
+ filenames[filename]=[old_was_readed | was_readed, old_was_writed | was_writed ]
+
+ for filename in filenames:
+ if filenames[filename]==[False,False]:
+ action="accessed"
+ elif filenames[filename]==[True,False]:
+ action="readed"
+ elif filenames[filename]==[False,True]:
+ action="writed"
+ elif filenames[filename]==[True,True]:
+ action="readed and writed"
+ print " %-56s %-21s" % (filename,action)
+
"""
for stage in sorted(events, key=stagesorder.get):
- succ_events=events[stage][0]
+ succ_events=events[stage][0]-
fail_events=events[stage][1]
print "On stage %s:" % stage
for filename in sorted(succ_events, key=file_to_package.get):
diff --git a/logger/src/hook_fusefs/hookfs.c b/logger/src/hook_fusefs/hookfs.c
index 24b6342..0d957dc 100644
--- a/logger/src/hook_fusefs/hookfs.c
+++ b/logger/src/hook_fusefs/hookfs.c
@@ -184,9 +184,11 @@ static int getenv_by_pid(pid_t pid, char *envname,char *result,int result_len) {
*/
static char * getstagebypid(pid_t pid) {
char stage[MAXSTAGELEN];
+ //log_event("",filename,result,err,stage);
if(!getenv_by_pid(getparentpid(pid),"EBUILD_PHASE",stage,MAXSTAGELEN))
return "unknown";
+
// ugly, but memory allocation is not better
// there is better way to write this, but this is fast
int i;
diff --git a/logger/src/hook_lib/file_hook.c b/logger/src/hook_lib/file_hook.c
index 8702a2c..4ad6b97 100644
--- a/logger/src/hook_lib/file_hook.c
+++ b/logger/src/hook_lib/file_hook.c
@@ -393,7 +393,7 @@ pid_t fork(void) {
int execve(const char *filename, char *const argv[],
char *const envp[]) {
if(access(filename, F_OK)!=-1)
- __log_event("open",filename,"OK",0,__get_stage());
+ __log_event("read",filename,"OK",0,__get_stage());
else
__log_event("open",filename,"ERR",2,__get_stage());