public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Александр Берсенев" <bay@hackerdom.ru>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/autodep:master commit in: logger/src/autodep/logfs/, logger/src/autodep/, logger/src/hook_lib/
Date: Sun,  3 Jul 2011 13:41:03 +0000 (UTC)	[thread overview]
Message-ID: <a1d60fa6ca3bf5fc264b68d88e6769bf35f7a51e.bay@gentoo> (raw)

commit:     a1d60fa6ca3bf5fc264b68d88e6769bf35f7a51e
Author:     Alexander Bersenev <bay <AT> hackerdom <DOT> ru>
AuthorDate: Sun Jul  3 19:40:37 2011 +0000
Commit:     Александр Берсенев <bay <AT> hackerdom <DOT> ru>
CommitDate: Sun Jul  3 19:40:37 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/autodep.git;a=commit;h=a1d60fa6

work with usersandbox feature, futher work for outout

---
 logger/src/autodep/logfs/__init__.pyc |  Bin 138 -> 0 bytes
 logger/src/autodep/logfs/fstracer.py  |    5 +++--
 logger/src/autodep/showfsevents.py    |   33 ++++++++++++++++++++++++---------
 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
deleted file mode 100644
index ae3151f..0000000
Binary files a/logger/src/autodep/logfs/__init__.pyc and /dev/null differ

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) {



             reply	other threads:[~2011-07-03 19:40 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-07-03 13:41 Александр Берсенев [this message]
  -- strict thread matches above, loose matches on Subject: below --
2011-06-30 20:04 [gentoo-commits] proj/autodep:master commit in: logger/src/autodep/logfs/, logger/src/autodep/, logger/src/hook_lib/ Александр Берсенев
2011-06-08 12:28 Александр Берсенев

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=a1d60fa6ca3bf5fc264b68d88e6769bf35f7a51e.bay@gentoo \
    --to=bay@hackerdom.ru \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox