aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Bersenev <bay@hackerdom.ru>2011-07-03 19:40:37 +0000
committerAlexander Bersenev <bay@hackerdom.ru>2011-07-03 19:40:37 +0000
commita1d60fa6ca3bf5fc264b68d88e6769bf35f7a51e (patch)
treed0e1e2980467bf24ea4d2d4571f3c5d0d7838aef
parentpackage files blocking feature, improved command line arguments (diff)
downloadautodep-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__.pycbin138 -> 0 bytes
-rw-r--r--logger/src/autodep/logfs/fstracer.py5
-rwxr-xr-xlogger/src/autodep/showfsevents.py33
-rw-r--r--logger/src/hook_lib/file_hook.c27
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
--- a/logger/src/autodep/logfs/__init__.pyc
+++ /dev/null
Binary files 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) {