diff options
author | Alexander Bersenev <bay@hackerdom.ru> | 2011-07-03 19:40:37 +0000 |
---|---|---|
committer | Alexander Bersenev <bay@hackerdom.ru> | 2011-07-03 19:40:37 +0000 |
commit | a1d60fa6ca3bf5fc264b68d88e6769bf35f7a51e (patch) | |
tree | d0e1e2980467bf24ea4d2d4571f3c5d0d7838aef | |
parent | package files blocking feature, improved command line arguments (diff) | |
download | autodep-a1d60fa6ca3bf5fc264b68d88e6769bf35f7a51e.tar.gz autodep-a1d60fa6ca3bf5fc264b68d88e6769bf35f7a51e.tar.bz2 autodep-a1d60fa6ca3bf5fc264b68d88e6769bf35f7a51e.zip |
work with usersandbox feature, futher work for outout
-rw-r--r-- | logger/src/autodep/logfs/__init__.pyc | bin | 138 -> 0 bytes | |||
-rw-r--r-- | logger/src/autodep/logfs/fstracer.py | 5 | ||||
-rwxr-xr-x | logger/src/autodep/showfsevents.py | 33 | ||||
-rw-r--r-- | logger/src/hook_lib/file_hook.c | 27 |
4 files changed, 47 insertions, 18 deletions
diff --git a/logger/src/autodep/logfs/__init__.pyc b/logger/src/autodep/logfs/__init__.pyc Binary files differdeleted file mode 100644 index ae3151f..0000000 --- a/logger/src/autodep/logfs/__init__.pyc +++ /dev/null diff --git a/logger/src/autodep/logfs/fstracer.py b/logger/src/autodep/logfs/fstracer.py index 66b1de3..c724b61 100644 --- a/logger/src/autodep/logfs/fstracer.py +++ b/logger/src/autodep/logfs/fstracer.py @@ -74,7 +74,7 @@ def getparentpid(pid): if match==None: print "Failed to get parent process. Format of /proc/<pid>/stat is incorrect. Did you change a kernel?" return 1 - + return int(match.group(1)) except IOError,e: @@ -200,9 +200,10 @@ def getfsevents(prog_name,arguments,approach="hooklib",filterproc=defaultfilter) continue message=record.split("\0") - #if message[3]!="unknown": + #if message[3]=="compile": #and message[1]=="debug": #print message + try: if message[4]=="ASKING": if filterproc(message[1],message[2],message[3]): diff --git a/logger/src/autodep/showfsevents.py b/logger/src/autodep/showfsevents.py index cc4bec6..b738a76 100755 --- a/logger/src/autodep/showfsevents.py +++ b/logger/src/autodep/showfsevents.py @@ -9,23 +9,30 @@ import logfs.fstracer import logfs.portage_utils args_parser=optparse.OptionParser("%prog [options] <command>") +args_parser.add_option("-b", "--block",action="store", type="string", + dest="packages", default="", help="block an access to files from this packages") 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.add_option("--hooklib",action="store_const", dest="approach", + const="hooklib", help="use ld_preload logging approach(default)") +args_parser.add_option("--fusefs",action="store_const", dest="approach", + const="fusefs", help="use fuse logging approach(slow, but reliable)") +args_parser.set_defaults(approach="hooklib") + 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 options +#print args if len(args)==0: args_parser.print_help() exit(1) -#print args -#print options filter_function=lambda eventname,filename,stage: True @@ -45,7 +52,7 @@ if options.packages: return not filename in files_to_block filter_function=filter -events=logfs.fstracer.getfsevents(args[0], args,approach="fusefs",filterproc=filter_function) +events=logfs.fstracer.getfsevents(args[0], args,approach=options.approach,filterproc=filter_function) print "Program finished, analyzing dependencies" # get unique filenames @@ -114,7 +121,15 @@ for stage in sorted(events): filesinfo[filename]["notfound"]=fail_events[filename] #print events_converted_for_output - + +# explicit check for launching with non-emerge application +was_emerge_process=False +for package in packagesinfo: + if len(packagesinfo[package].keys())>1: + was_emerge_process=True + break + +# generating output stagesorder={"clean":1,"setup":2,"unpack":3,"prepare":4,"configure":5,"compile":6,"test":7, "install":8,"preinst":9,"postinst":10,"prerm":11,"postrm":12,"unknown":13} @@ -126,7 +141,7 @@ for package in sorted(packagesinfo): stages=[] for stage in sorted(packagesinfo[package].keys(), key=stagesorder.get): - if stage!="unknown" or options.show_unknown_stage: + if stage!="unknown" or options.show_unknown_stage or not was_emerge_process: stages.append(stage) if len(stages)!=0: @@ -159,7 +174,7 @@ for package in sorted(packagesinfo): """ 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): @@ -195,4 +210,4 @@ for stage in sorted(events, key=stagesorder.get): print file_to_package[filename], print """ -##logfs.fstracer.getfsevents("emerge", ["emerge","--info"])
\ No newline at end of file +##logfs.fstracer.getfsevents("emerge", ["emerge","--info"]) diff --git a/logger/src/hook_lib/file_hook.c b/logger/src/hook_lib/file_hook.c index 4ad6b97..9012b20 100644 --- a/logger/src/hook_lib/file_hook.c +++ b/logger/src/hook_lib/file_hook.c @@ -53,6 +53,7 @@ int (*_close)(int fd); // we hooking this, because some programs closes our sock int log_socket=-1; char log_socket_name[MAXSOCKETPATHLEN]; +char ld_preload_orig[MAXPATHLEN]; void __doconnect(){ if(strlen(log_socket_name)>=MAXSOCKETPATHLEN) { @@ -104,8 +105,16 @@ void _init() { fprintf(stderr,"Unable to create a unix-socket %s: socket name is too long,exiting\n", log_socket_name); exit(1); } + strcpy(log_socket_name,log_socket_env); + if(getenv("LD_PRELOAD")==NULL) { + fprintf(stderr,"Unable to find LD_PRELOAD environment variable. " + "Library will load only with this variable defined"); + exit(1); + } + + strcpy(ld_preload_orig,getenv("LD_PRELOAD")); _open = (int (*)(const char * pathname, int flags, ...)) dlsym(RTLD_NEXT, "open"); _open64 = (int (*)(const char * pathname, int flags, ...)) dlsym(RTLD_NEXT, "open64"); @@ -247,8 +256,8 @@ int open(const char * path, int flags, mode_t mode) { realpath(path,fullpath); char *stage=__get_stage(); if(! __is_event_allowed("open",fullpath,stage)) { - errno=2; // not found __log_event("open",fullpath,"DENIED",errno,stage); + errno=2; // not found return -1; } @@ -270,8 +279,8 @@ int open64(const char * path, int flags, mode_t mode) { realpath(path,fullpath); char *stage=__get_stage(); if(! __is_event_allowed("open",fullpath,stage)) { - errno=2; // not found __log_event("open",path,"DENIED",errno,stage); + errno=2; // not found return -1; } @@ -294,8 +303,8 @@ FILE *fopen(const char *path, const char *mode) { char *stage=__get_stage(); if(! __is_event_allowed("open",fullpath,stage)) { - errno=2; // not found __log_event("open",path,"DENIED",errno,stage); + errno=2; // not found return NULL; } @@ -316,8 +325,8 @@ FILE *fopen64(const char *path, const char *mode) { char *stage=__get_stage(); if(! __is_event_allowed("open",fullpath,stage)) { - errno=2; // not found __log_event("open",fullpath,"DENIED",errno,stage); + errno=2; // not found return NULL; } @@ -346,6 +355,9 @@ ssize_t read(int fd, void *buf, size_t count){ else __log_event("read",fullpath,"OK",0,stage); } + + //__log_event("debug",fullpath,"ERR",getpid(),stage); + errno=saved_errno; return ret; } @@ -372,7 +384,8 @@ pid_t fork(void) { //int succ= _setenv("LOG_SOCKET",log_socket_name,1); - + _setenv("LD_PRELOAD",ld_preload_orig,1); + //ld_preload_orig //fprintf(stderr,"prefork %s%p%p%d %s\n",getenv("LOG_SOCKET"),_setenv,setenv,succ,log_socket_orig); int ret=_fork(); @@ -407,14 +420,14 @@ int execve(const char *filename, char *const argv[], int i; for(i=0;envp[i];i++){ if(strncmp(envp[i],"LD_PRELOAD=",11)==0) - if(strcmp(envp[i]+11,getenv("LD_PRELOAD"))==0) + if(strcmp(envp[i]+11,ld_preload_orig)==0) ld_preload_valid=1; if(strncmp(envp[i],"LOG_SOCKET=",11)==0) if(strcmp(envp[i]+11,log_socket_name)==0) log_socket_valid=1; } if(!ld_preload_valid || !log_socket_valid) { - snprintf(new_ld_preload,MAXENVITEMSIZE,"LD_PRELOAD=%s",getenv("LD_PRELOAD")); + snprintf(new_ld_preload,MAXENVITEMSIZE,"LD_PRELOAD=%s",ld_preload_orig); snprintf(new_log_socket,MAXENVITEMSIZE,"LOG_SOCKET=%s",log_socket_name); for(i=0; envp[i] && i<MAXENVSIZE-3; i++) { if(strncmp(envp[i],"LD_PRELOAD=",11)==0) { |