diff options
author | Alexander Bersenev <bay@hackerdom.ru> | 2011-07-03 16:26:50 +0000 |
---|---|---|
committer | Alexander Bersenev <bay@hackerdom.ru> | 2011-07-03 16:26:50 +0000 |
commit | 1e08a6bccc05184a6f864263194b45066b8acea5 (patch) | |
tree | daaab8313c4f6f69117232ce9a7485f61c047c9e | |
parent | changed format of outout (diff) | |
download | autodep-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.py | 8 | ||||
-rw-r--r-- | logger/src/autodep/logfs/portage_utils.py | 22 | ||||
-rwxr-xr-x | logger/src/autodep/showfsevents.py | 89 | ||||
-rw-r--r-- | logger/src/hook_fusefs/hookfs.c | 2 | ||||
-rw-r--r-- | logger/src/hook_lib/file_hook.c | 2 |
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()); |