* [gentoo-commits] proj/autodep:master commit in: logger/src/autodep/logfs/, logger/src/hook_fusefs/, logger/src/autodep/
@ 2011-06-10 6:45 Александр Берсенев
0 siblings, 0 replies; 4+ messages in thread
From: Александр Берсенев @ 2011-06-10 6:45 UTC (permalink / raw
To: gentoo-commits
commit: 8b8b0e496ae3676790215f1eb94e233403f06936
Author: Alexander Bersenev <bay <AT> hackerdom <DOT> ru>
AuthorDate: Fri Jun 10 12:45:13 2011 +0000
Commit: Александр Берсенев <bay <AT> hackerdom <DOT> ru>
CommitDate: Fri Jun 10 12:45:13 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/autodep.git;a=commit;h=8b8b0e49
Finalized format of communications. Fiexed a very annoying bug with lost ALLOW packet. Fixed tests
---
logger/src/autodep/logfs/fstracer.py | 102 +++++++++++++++++++++++++----
logger/src/autodep/logfs/logger_fusefs.py | 6 +-
logger/src/autodep/logfs/test_fstracer.py | 41 +++++++-----
logger/src/autodep/showfsevents.py | 30 ++++++++-
logger/src/hook_fusefs/hookfs.c | 74 ++++++++++++++++++---
5 files changed, 210 insertions(+), 43 deletions(-)
diff --git a/logger/src/autodep/logfs/fstracer.py b/logger/src/autodep/logfs/fstracer.py
index cf10e6e..6979b27 100644
--- a/logger/src/autodep/logfs/fstracer.py
+++ b/logger/src/autodep/logfs/fstracer.py
@@ -30,22 +30,76 @@ def parse_message(message):
# check if proccess is finished
def checkfinished(pid):
if not os.path.exists("/proc/%d/stat" % pid):
- return (True,0)
+ return True
try:
pid_child,exitcode = os.waitpid(pid, os.WNOHANG)
except OSError, e:
if e.errno == 10:
- return (False,0)
+ return False
else:
raise
if pid_child==0:
- return (False,0)
- return (True,exitcode)
+ return False
+ return True
+
+#check if process is zombie
+def iszombie(pid):
+ try:
+ statfile=open("/proc/%d/stat" % pid,"r")
+ line=statfile.readline()
+ statfile.close()
+ line=line.rsplit(")")[1] # find last ")" char
+ line=line.strip()
+ match=re.match(r"(\w)",line)
+ if match==None:
+ print "Failed to get check if process is zombie. Format of /proc/<pid>/stat is incorrect. Did you change a kernel?"
+ return False
+
+ return match.group(1)=="Z"
+
+ except IOError,e:
+ return True
+
+
+# uses /proc filesystem to get pid of parent
+def getparentpid(pid):
+ try:
+ statfile=open("/proc/%d/stat" % pid,"r")
+ line=statfile.readline()
+ statfile.close()
+ line=line.rsplit(")")[1] # find last ")" char
+ line=line.strip()
+ match=re.match(r"\w\s(\d+)",line)
+ 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:
+ return 1
+
+#check if message came from one of a child
+def checkparent(parent,child):
+ #print "Parent %s, child %s"%(parent,child)
+ if child==1 or getparentpid(child)==1:
+ return True
+
+ currpid=child
+# for(pid=getpid();pid!=0;pid=__getparentpid(pid))
+ while getparentpid(currpid)!=1:
+ currpid=getparentpid(currpid)
+ if currpid==parent:
+ return True
+
+ print "External actions with filesystem detected pid of external prog is %d" % child
+ return False
+
+# default access filter. Allow acess to all files
+def defaultfilter(eventname, filename, pid):
-# default access filter. Allow always
-def defaultfilter(time, filename, pid):
return True
# run the program and get file access events
@@ -59,7 +113,7 @@ def getfsevents(prog_name,arguments,approach="hooklib",filterproc=defaultfilter)
sock_listen=socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock_listen.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock_listen.bind(socketname)
- sock_listen.listen(1024)
+ sock_listen.listen(65536*8)
except socket.error, e:
print "Failed to create a socket for exchange data with the logger: %s" % e
return []
@@ -103,7 +157,7 @@ def getfsevents(prog_name,arguments,approach="hooklib",filterproc=defaultfilter)
input.append(client)
buffers[client]=''
else:
- data=s.recv(65536)
+ data=s.recv(4096)
buffers[s]+=data
@@ -131,26 +185,50 @@ def getfsevents(prog_name,arguments,approach="hooklib",filterproc=defaultfilter)
#print "datalen: %d" % len(data)
message=parse_message(record)
+
try:
if message[4]=="ASKING":
- if filterproc(message[1],message[2],message[3]):
+ #print "ASKING %s"%message[2]
+ if message[2]=="/" or ( # always allow acces to "/" because of some processes like ksysguardd
+ True):#checkparent(pid,int(message[3])) and filterproc(message[1],message[2],message[3])):
s.sendall("ALLOW\n"); # TODO: think about flush here
+ #print "ALLOWING %s"%message[2]
+
else:
print "Blocking an access to %s" % message[2]
s.sendall("DENY\n"); # TODO: think about flush here
else:
- events.append([message[1],message[2]]);
+ # check previous five messages for possible repeats
+ for prevevent in events[-5:]:
+ if prevevent[1:]==message[1:]:
+ break
+ else:
+ pass
+ #events.append(message)
except IndexError:
print "IndexError while parsing %s"%record
#print "!!"+data+"!!"
#print parse_message(data)
- if len(input)==1 and connects==0:
+
+ if len(input)==1 and connects==0: #or
# seems like there is no connect
- print "It seems like a logger module was unable to start." + \
+ print "It seems like a logger module was unable to start or failed to finish" + \
"Check that you are not launching a suid program under non-root user."
return []
+ #if iszombie(pid):
+ # print "Child finished, but connection remains. Closing a connection"
+ # break
os.wait()
+
+ if len(events)==0:
+ return []
+
+ timeofstart=int(events[0][0])
+ # make all event times relative to time 0 - time of start task
+ for event_num in range(0,len(events)):
+ events[event_num][0]=int(events[event_num][0])-timeofstart
return events
+
diff --git a/logger/src/autodep/logfs/logger_fusefs.py b/logger/src/autodep/logfs/logger_fusefs.py
index 11a6f39..ec19b80 100644
--- a/logger/src/autodep/logfs/logger_fusefs.py
+++ b/logger/src/autodep/logfs/logger_fusefs.py
@@ -93,9 +93,9 @@ class logger:
print "Unmounting partitions"
self.mountlist.reverse()
for mount in self.mountlist:
- self.smartcommandlauncher(['umount',self.rootmountpath+mount])
- self.smartcommandlauncher(['fusermount','-u',self.rootmountpath]);
- self.smartcommandlauncher(['umount',self.rootmountpath]);
+ self.smartcommandlauncher(['umount','-l',self.rootmountpath+mount])
+ self.smartcommandlauncher(['fusermount','-z','-u',self.rootmountpath]);
+ self.smartcommandlauncher(['umount','-l',self.rootmountpath]);
os.rmdir(self.rootmountpath)
except OSError, e:
diff --git a/logger/src/autodep/logfs/test_fstracer.py b/logger/src/autodep/logfs/test_fstracer.py
index c254bce..a4c4b56 100644
--- a/logger/src/autodep/logfs/test_fstracer.py
+++ b/logger/src/autodep/logfs/test_fstracer.py
@@ -2,6 +2,13 @@ import unittest
import fstracer
+def simple_getfsevents(prog,args,approach="hooklib"):
+ ret=[]
+ events = fstracer.getfsevents(prog,args,approach)
+ for event in events:
+ ret.append([event[1],event[2],event[4]])
+ return ret
+
class hooklib_simple_tests(unittest.TestCase):
def test_open_unexists(self):
self.assertEqual(fstracer.getfsevents('/bin/cat',
@@ -48,17 +55,20 @@ class hooklib_simple_tests(unittest.TestCase):
class fusefs_simple_tests(unittest.TestCase):
def test_open_unexists(self):
- eventslist=fstracer.getfsevents('/bin/cat', ['/bin/cat','/f1','/f2'],approach="fusefs")
- self.assertTrue(eventslist.count(['stat', '/f1'])==1)
- def test_open_exists(self):
- eventslist=fstracer.getfsevents('/bin/cat', ['/bin/cat','/etc/passwd'],approach="fusefs")
- self.assertTrue(eventslist.count(['stat', '/etc/passwd'])>=1)
+ eventslist=simple_getfsevents('/bin/cat', ['/bin/cat','/f1','/f2'],approach="fusefs")
+ print eventslist
+ self.assertTrue(eventslist.count(['stat', '/f1',"ERR/2"])==1)
+ self.assertTrue(eventslist.count(['stat', '/f2',"ERR/2"])==1)
+
+ def test_open_exists(self):
+ eventslist=simple_getfsevents('/bin/cat', ['/bin/cat','/etc/passwd'],approach="fusefs")
+ self.assertTrue(eventslist.count(['stat', '/etc/passwd',"OK"])>=1)
def test_open_many(self):
filesnum=200
- eventslist=fstracer.getfsevents('/bin/cat',['/bin/cat']+
+ eventslist=simple_getfsevents('/bin/cat',['/bin/cat']+
map(lambda x: '/file'+str(x),range(0,filesnum)), approach="fusefs")
- for f in map(lambda x: ['stat','/file'+str(x)],range(0,filesnum)):
+ for f in map(lambda x: ['stat','/file'+str(x),"ERR/2"],range(0,filesnum)):
self.assertTrue(f in eventslist)
def test_parralel(self):
@@ -72,21 +82,20 @@ class fusefs_simple_tests(unittest.TestCase):
for f in xrange(0,filesnum):
command+="/file_%d_%d " % (p,f)
command+="& "
- command+=" >/dev/null 2>&1"
+ command+=" 2>/dev/null"
#command+=" "+"A"*65536
- resultarray=fstracer.getfsevents('/bin/sh', ['/bin/sh','-c',command],approach="fusefs")
-
- #self.assertTrue(resultarray.count(['execve', '/bin/cat'])==procnum)
-
- print resultarray
+ resultarray=simple_getfsevents('/bin/sh', ['/bin/sh','-c',command],approach="fusefs")
for p in xrange(0,procnum):
for f in xrange(0,filesnum):
- self.assertTrue(resultarray.count(['stat', '/file_%d_%d' % (p,f)])==1)
-
-
+ self.assertTrue(resultarray.count(['stat', '/file_%d_%d' % (p,f),"ERR/2"])==1)
+ def test_open_very_many(self):
+ resultarray=simple_getfsevents('/bin/sh', ['/bin/sh','-c',
+ "for i in `seq 1 10`; do cat /testmany;done 2> /dev/null"],approach="fusefs")
+ print resultarray
+ self.assertTrue(resultarray.count(['stat','/testmany',"ERR/2"])>=1000)
if __name__ == '__main__':
#unittest.main()
diff --git a/logger/src/autodep/showfsevents.py b/logger/src/autodep/showfsevents.py
index 25bf1ff..0fba98a 100755
--- a/logger/src/autodep/showfsevents.py
+++ b/logger/src/autodep/showfsevents.py
@@ -5,6 +5,10 @@ import sys
import logfs.fstracer
+def printevents(events):
+ for event in events:
+ print "%s %s"%(event[1],event[2])
+
#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:
@@ -12,5 +16,29 @@ if len(sys.argv)<2:
exit(1)
events=logfs.fstracer.getfsevents(sys.argv[1], sys.argv[1:],approach="fusefs")
-print events
+
+succ_events=[]
+err_events=[]
+deny_events=[]
+
+for event in events:
+ if event[4]=="OK":
+ succ_events.append(event)
+ elif event[4]=="DENIED":
+ deny_events.append(event)
+ else:
+ err_events.append(event)
+
+
+
+print "Report:"
+if len(succ_events)>0:
+ print "Successful events:"
+ printevents(succ_events)
+if len(err_events)>0:
+ print "\nNon-successful events:"
+ printevents(err_events)
+if len(deny_events)>0:
+ print "\nBlocked events:"
+ printevents(deny_events)
#logfs.fstracer.getfsevents("emerge", ["emerge","--info"])
\ No newline at end of file
diff --git a/logger/src/hook_fusefs/hookfs.c b/logger/src/hook_fusefs/hookfs.c
index 16b9a46..45bcd6b 100644
--- a/logger/src/hook_fusefs/hookfs.c
+++ b/logger/src/hook_fusefs/hookfs.c
@@ -60,7 +60,7 @@ struct hookfs_config config;
* Prints a string escaping spaces and '\'
* Does not check input variables
*/
-void __print_escaped(FILE *fh ,const char *s){
+static void __print_escaped(FILE *fh ,const char *s){
for(;(*s)!=0; s++) {
if(*s==' ')
fprintf(fh,"\\ ");
@@ -78,10 +78,25 @@ void __print_escaped(FILE *fh ,const char *s){
}
/*
- * Format of log string: time event file flags result parents
-*/
-void log_event(const char *event_type, const char *filename, char *result,int err, pid_t pid) {
- pthread_mutex_lock( &socketblock );
+ * This is here because launching of a task is very slow without it
+ */
+static int is_file_excluded(const char *filename) {
+ if(strcmp(filename,"/etc/ld.so.preload")==0)
+ return 1;
+ if(strcmp(filename,"/etc/ld.so.cache")==0)
+ return 1;
+ if(strcmp(filename,"/usr/lib64/locale/locale-archive")==0)
+ return 1;
+ if(strcmp(filename,"/usr/lib64/locale")==0)
+ return 1;
+
+ return 0;
+}
+
+
+static void raw_log_event(const char *event_type, const char *filename, char *result,int err, pid_t pid) {
+ if(is_file_excluded(filename)) return;
+
fprintf(log_file,"%lld ",(unsigned long long)time(NULL));
@@ -97,6 +112,14 @@ void log_event(const char *event_type, const char *filename, char *result,int er
fprintf(log_file,"\n");
fflush(log_file);
+}
+
+/*
+ * Format of log string: time event file flags result parents
+*/
+static void log_event(const char *event_type, const char *filename, char *result,int err, pid_t pid) {
+ pthread_mutex_lock( &socketblock );
+ raw_log_event(event_type,filename,result,err,pid);
pthread_mutex_unlock( &socketblock );
}
@@ -104,13 +127,17 @@ void log_event(const char *event_type, const char *filename, char *result,int er
* Ack a python part about an event
* Returns 1 if access is allowed and 0 if denied
*/
-int is_event_allowed(const char *event_type,const char *filename, pid_t pid) {
+static int is_event_allowed(const char *event_type,const char *filename, pid_t pid) {
// sending asking log_event
- log_event(event_type,filename,"ASKING",0,pid);
+ if(is_file_excluded(filename)) return 1;
+ //return 1;
+ pthread_mutex_lock( &socketblock );
+
+ raw_log_event(event_type,filename,"ASKING",0,pid);
char answer[8];
- pthread_mutex_lock( &socketblock );
fscanf(log_file,"%7s",answer);
+ fflush(log_file); // yes, it is here too
pthread_mutex_unlock( &socketblock );
if(strcmp(answer,"ALLOW")==0)
@@ -122,7 +149,6 @@ int is_event_allowed(const char *event_type,const char *filename, pid_t pid) {
return 0;
}
-
static char * malloc_relative_path(const char *path) {
int len = strlen(path);
char * buf = malloc(1 + len + 1);
@@ -149,6 +175,14 @@ static int hookfs_getattr(const char *path, struct stat *stbuf)
{
struct fuse_context * context = fuse_get_context();
+ if(! is_event_allowed("stat",path,context->pid)) {
+ errno=2; // not found
+ log_event("stat",path,"DENIED",errno,context->pid);
+
+ return -errno;
+ }
+
+
char * rel_path = malloc_relative_path(path);
if (! rel_path) {
return -errno;
@@ -172,7 +206,14 @@ static int hookfs_fgetattr(const char *path, struct stat *stbuf,
int res;
struct fuse_context * context = fuse_get_context();
+ if(! is_event_allowed("stat",path,context->pid)) {
+ errno=2; // not found
+ log_event("stat",path,"DENIED",errno,context->pid);
+
+ return -errno;
+ }
+
res = fstat(fi->fh, stbuf);
if (res == -1) {
@@ -188,6 +229,14 @@ static int hookfs_access(const char *path, int mask)
{
struct fuse_context * context = fuse_get_context();
+ if(! is_event_allowed("stat",path,context->pid)) {
+ errno=2; // not found
+ log_event("stat",path,"DENIED",errno,context->pid);
+
+ return -errno;
+ }
+
+
char * rel_path = malloc_relative_path(path);
if (! rel_path) {
return -errno;
@@ -348,7 +397,7 @@ static int hookfs_unlink(const char *path)
int res = unlink(rel_path);
free(rel_path);
- //NOTIFY(post_unlink, path, res);
+
if (res == -1)
return -errno;
@@ -556,6 +605,8 @@ static int hookfs_create(const char *path, mode_t mode, struct fuse_file_info *f
if(! is_event_allowed("create",path,context->pid)) {
errno=2; // not found
+ log_event("create",path,"DENIED",errno,context->pid);
+
return -errno;
}
@@ -587,6 +638,8 @@ static int hookfs_open(const char *path, struct fuse_file_info *fi)
if(! is_event_allowed("open",path,context->pid)) {
errno=2; // not found
+ log_event("open",path,"DENIED",errno,context->pid);
+
return -errno;
}
@@ -895,7 +948,6 @@ static int hookfs_handle_opt(void *data, const char *arg, int key, struct fuse_a
"\n"
"%s options:\n"
" --argv-debug enable argv debugging\n"
- " --flush flush log after each write\n"
"\n"
"general options:\n"
" -o opt,[opt...] mount options\n"
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [gentoo-commits] proj/autodep:master commit in: logger/src/autodep/logfs/, logger/src/hook_fusefs/, logger/src/autodep/
@ 2011-06-18 15:53 Александр Берсенев
0 siblings, 0 replies; 4+ messages in thread
From: Александр Берсенев @ 2011-06-18 15:53 UTC (permalink / raw
To: gentoo-commits
commit: 34711186c479a6010a28ba916e1cdbf81fe505b4
Author: Alexander Bersenev <bay <AT> hackerdom <DOT> ru>
AuthorDate: Sat Jun 18 21:52:40 2011 +0000
Commit: Александр Берсенев <bay <AT> hackerdom <DOT> ru>
CommitDate: Sat Jun 18 21:52:40 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/autodep.git;a=commit;h=34711186
reporting a possible dependency packages
---
logger/src/autodep/logfs/portage_utils.py | 41 ++++++++++++++++++++
logger/src/autodep/showfsevents.py | 58 ++++++++++++++++++++--------
logger/src/hook_fusefs/hookfs.c | 2 +-
3 files changed, 83 insertions(+), 18 deletions(-)
diff --git a/logger/src/autodep/logfs/portage_utils.py b/logger/src/autodep/logfs/portage_utils.py
new file mode 100644
index 0000000..6592d7a
--- /dev/null
+++ b/logger/src/autodep/logfs/portage_utils.py
@@ -0,0 +1,41 @@
+#!/usr/bin/env python2
+
+import os
+import subprocess
+import re
+
+def getpackagesbyfiles(files):
+ ret={}
+ listtocheck=[]
+ for f in files:
+ if os.path.isdir(f):
+ ret[f]="directory"
+ else:
+ listtocheck.append(f)
+
+ try:
+ proc=subprocess.Popen(['qfile']+['--nocolor','--exact','','--from','-'],
+ stdin=subprocess.PIPE, stdout=subprocess.PIPE,stderr=subprocess.PIPE,
+ bufsize=4096)
+
+ out,err=proc.communicate("\n".join(listtocheck))
+ if err!=None:
+ print "Noncritical error while launch qfile %s"%err;
+
+ lines=out.split("\n")
+ #print lines
+ line_re=re.compile(r"^([^ ]+)\s+\(([^)]+)\)$")
+ for line in lines:
+ if len(line)==0:
+ continue
+ match=line_re.match(line)
+ if match:
+ ret[match.group(2)]=match.group(1)
+ else:
+ print "Util qfile returned unparsable string: %s" % line
+
+ except OSError,e:
+ print "Error while launching qfile: %s" % e
+
+
+ return ret
\ No newline at end of file
diff --git a/logger/src/autodep/showfsevents.py b/logger/src/autodep/showfsevents.py
index 24a4bdd..fd628cd 100755
--- a/logger/src/autodep/showfsevents.py
+++ b/logger/src/autodep/showfsevents.py
@@ -4,11 +4,8 @@ import os
import sys
import logfs.fstracer
+import logfs.portage_utils
-def printevents(events):
- for event in events:
- print "%s %s"%(event[1],event[2])
-
#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:
@@ -16,32 +13,59 @@ if len(sys.argv)<2:
exit(1)
events=logfs.fstracer.getfsevents(sys.argv[1], sys.argv[1:],approach="fusefs")
+print "Program finished, analyzing dependencies"
+# get unique filenames
+filenames={}
+for stage in events:
+ succ_events=events[stage][0]
+ fail_events=events[stage][1]
+ for filename in succ_events:
+ filenames[filename]=""
+ for filename in fail_events:
+ filenames[filename]=""
+filenames=filenames.keys();
+
+file_to_package=logfs.portage_utils.getpackagesbyfiles(filenames)
#print events
-for stage in events:
+stagesorder={"setup":1,"unpack":2,"prepare":3,"compile":4,"test":5,
+ "src_install":6,"preinst":7,"postinst":8, "unknown":9}
+
+for stage in sorted(events, key=stagesorder.get):
succ_events=events[stage][0]
fail_events=events[stage][1]
print "On stage %s:" % stage
- for filename in sorted(succ_events):
- print " %40s\t" % filename,
+ for filename in sorted(succ_events, key=file_to_package.get):
+ print " %-40s" % filename,
+ action=""
if succ_events[filename]==[False,False]:
- print "accessed"
+ action="accessed",
elif succ_events[filename]==[True,False]:
- print "readed"
+ action="readed",
elif succ_events[filename]==[False,True]:
- print "writed"
+ action="writed",
elif succ_events[filename]==[True,True]:
- print "readed and writed"
- for filename in sorted(fail_events):
+ action="readed and writed",
+
+ print " %-21s " % action,
+ if filename in file_to_package:
+ print file_to_package[filename],
+ print
- print " %40s\t"%filename,
+ for filename in sorted(fail_events, key=file_to_package.get):
+ print " %-40s" % filename,
+ action=""
if fail_events[filename]==[True,False]:
- print "file not found"
+ action="file not found"
elif fail_events[filename]==[True,True]:
- print "blocked somewhen, not found somewhen"
+ action="blocked and not found"
elif fail_events[filename]==[False,True]:
- print "blocked"
+ action="blocked"
elif fail_events[filename]==[False,False]:
- print "other error"
+ action="other error"
+ print " %-21s " % action,
+ if filename in file_to_package:
+ print file_to_package[filename],
+ print
##logfs.fstracer.getfsevents("emerge", ["emerge","--info"])
\ No newline at end of file
diff --git a/logger/src/hook_fusefs/hookfs.c b/logger/src/hook_fusefs/hookfs.c
index 9241a2a..6456bef 100644
--- a/logger/src/hook_fusefs/hookfs.c
+++ b/logger/src/hook_fusefs/hookfs.c
@@ -93,7 +93,7 @@ pid_t getparentpid(pid_t pid){
filedata[bytes_readed]=0;
- char *beg_scan_offset=rindex(filedata,')');
+ char *beg_scan_offset=strrchr(filedata,')');
if(beg_scan_offset==NULL) {
fclose(stat_file_handle);
return 0;
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [gentoo-commits] proj/autodep:master commit in: logger/src/autodep/logfs/, logger/src/hook_fusefs/, logger/src/autodep/
@ 2011-06-25 19:52 Александр Берсенев
0 siblings, 0 replies; 4+ messages in thread
From: Александр Берсенев @ 2011-06-25 19:52 UTC (permalink / raw
To: gentoo-commits
commit: 61c0886b26c9ee2b9e13f14b08cd6cd46b2faf1b
Author: Alexander Bersenev <bay <AT> hackerdom <DOT> ru>
AuthorDate: Sun Jun 26 01:52:41 2011 +0000
Commit: Александр Берсенев <bay <AT> hackerdom <DOT> ru>
CommitDate: Sun Jun 26 01:52:41 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/autodep.git;a=commit;h=61c0886b
move to seqpacket sockets
---
logger/src/autodep/logfs/fstracer.py | 119 ++++++++++++-----------------
logger/src/autodep/logfs/test_fstracer.py | 30 +++++---
logger/src/autodep/showfsevents.py | 8 +-
logger/src/hook_fusefs/hookfs.c | 117 +++++++++++++++--------------
4 files changed, 134 insertions(+), 140 deletions(-)
diff --git a/logger/src/autodep/logfs/fstracer.py b/logger/src/autodep/logfs/fstracer.py
index 5842372..dda7afe 100644
--- a/logger/src/autodep/logfs/fstracer.py
+++ b/logger/src/autodep/logfs/fstracer.py
@@ -126,10 +126,12 @@ def getfsevents(prog_name,arguments,approach="hooklib",filterproc=defaultfilter)
socketname = os.path.join(tmpdir, 'socket')
try:
- sock_listen=socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
+ #sock_listen=socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
+ sock_listen=socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET)
+
sock_listen.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock_listen.bind(socketname)
- sock_listen.listen(65536)
+ sock_listen.listen(1024)
except socket.error, e:
print "Failed to create a socket for exchange data with the logger: %s" % e
return []
@@ -155,9 +157,7 @@ def getfsevents(prog_name,arguments,approach="hooklib",filterproc=defaultfilter)
else:
input = [sock_listen]
connects = 0;
-
- buffers = {}
-
+
while input:
inputready,_,_ = select.select(input,[],[],5)
@@ -171,83 +171,68 @@ def getfsevents(prog_name,arguments,approach="hooklib",filterproc=defaultfilter)
(client,addr)=ret
connects+=1; # client accepted
input.append(client)
- buffers[client]=""
else:
- data=s.recv(65536)
+ record=s.recv(8192)
- buffers[s]+=data
-
- if not data:
+ if not record:
s.close()
input.remove(s)
- del buffers[s]
connects-=1;
if connects==0:
input.remove(sock_listen)
sock_listen.close()
continue
- if not "\0\0" in buffers[s]:
- continue
-
- data,buffers[s] = buffers[s].rsplit("\0\0",1)
+ message=record.split("\0")
+ #print message
- for record in data.split("\0\0"):
- if len(record)==0:
- continue
- # TODO: check array
- #print "!"+"%d"%len(record)+"?"
- #print "datalen: %d" % len(data)
- message=record.split("\0")
- #print message
-
- try:
- if message[4]=="ASKING":
- if filterproc(message[1],message[2],message[3]):
- #print "Allowing an access to %s" % message[2]
- s.sendall("ALLOW\n"); # TODO: think about flush here
-
- else:
- print "Blocking an access to %s" % message[2]
- s.sendall("DENY\n"); # TODO: think about flush here
-
+ try:
+ if message[4]=="ASKING":
+ if filterproc(message[1],message[2],message[3]):
+ #print "Allowing an access to %s" % message[2]
+ s.sendall("ALLOW"); # TODO: think about flush here
+
else:
- eventname,filename,stage,result=message[1:5]
- #if stage != "unknown":
+ print "Blocking an access to %s" % message[2]
+ s.sendall("DENY"); # TODO: think about flush here
-
- if not stage in events:
- events[stage]=[{},{}]
+ else:
+ eventname,filename,stage,result=message[1:5]
+ #if stage != "unknown":
+
+
+ if not stage in events:
+ events[stage]=[{},{}]
+
+ hashofsucesses=events[stage][0]
+ hashoffailures=events[stage][1]
+
+ if result=="OK":
+ if not filename in hashofsucesses:
+ hashofsucesses[filename]=[False,False]
- hashofsucesses=events[stage][0]
- hashoffailures=events[stage][1]
+ readed_or_writed=hashofsucesses[filename]
- if result=="OK":
- if not filename in hashofsucesses:
- hashofsucesses[filename]=[False,False]
-
- readed_or_writed=hashofsucesses[filename]
-
- if eventname=="read":
- readed_or_writed[0]=True
- elif eventname=="write":
- readed_or_writed[1]=True
-
- elif result[0:3]=="ERR" or result=="DENIED":
- if not filename in hashoffailures:
- hashoffailures[filename]=[False,False]
- notfound_or_blocked=hashoffailures[filename]
+ if eventname=="read":
+ readed_or_writed[0]=True
+ elif eventname=="write":
+ readed_or_writed[1]=True
- if result=="ERR/2":
- notfound_or_blocked[0]=True
- elif result=="DENIED":
- notfound_or_blocked[1]=True
-
- else:
- print "Error in logger module<->analyser protocol"
+ elif result[0:3]=="ERR" or result=="DENIED":
+ if not filename in hashoffailures:
+ hashoffailures[filename]=[False,False]
+ notfound_or_blocked=hashoffailures[filename]
- except IndexError:
- print "IndexError while parsing %s"%record
+ if result=="ERR/2":
+ notfound_or_blocked[0]=True
+ elif result=="DENIED":
+ notfound_or_blocked[1]=True
+
+ else:
+ print "Error in logger module<->analyser protocol"
+
+ except IndexError:
+ print "IndexError while parsing %s"%record
if len(input)==1 and connects==0: #or
@@ -264,9 +249,5 @@ def getfsevents(prog_name,arguments,approach="hooklib",filterproc=defaultfilter)
#if len(events)==0:
#return []
- #timeofstart=int(events[0][0])
- # make all event times relative to time 0 - time of start task
- #for event_num in range(0,len(events)):
- #events[event_num][0]=int(events[event_num][0])-timeofstart
return events
diff --git a/logger/src/autodep/logfs/test_fstracer.py b/logger/src/autodep/logfs/test_fstracer.py
index a4c4b56..db61486 100644
--- a/logger/src/autodep/logfs/test_fstracer.py
+++ b/logger/src/autodep/logfs/test_fstracer.py
@@ -5,8 +5,13 @@ import fstracer
def simple_getfsevents(prog,args,approach="hooklib"):
ret=[]
events = fstracer.getfsevents(prog,args,approach)
- for event in events:
- ret.append([event[1],event[2],event[4]])
+ #print events
+ for stage in events:
+ for filename in events[stage][0]:
+ ret.append([filename,'success'])
+ for filename in events[stage][1]:
+ ret.append([filename,'fail'])
+
return ret
class hooklib_simple_tests(unittest.TestCase):
@@ -57,23 +62,23 @@ class fusefs_simple_tests(unittest.TestCase):
def test_open_unexists(self):
eventslist=simple_getfsevents('/bin/cat', ['/bin/cat','/f1','/f2'],approach="fusefs")
print eventslist
- self.assertTrue(eventslist.count(['stat', '/f1',"ERR/2"])==1)
- self.assertTrue(eventslist.count(['stat', '/f2',"ERR/2"])==1)
+ self.assertTrue(eventslist.count(['/f1',"fail"])==1)
+ self.assertTrue(eventslist.count(['/f2',"fail"])==1)
def test_open_exists(self):
eventslist=simple_getfsevents('/bin/cat', ['/bin/cat','/etc/passwd'],approach="fusefs")
- self.assertTrue(eventslist.count(['stat', '/etc/passwd',"OK"])>=1)
+ self.assertTrue(eventslist.count(['/etc/passwd','success'])>=1)
def test_open_many(self):
filesnum=200
eventslist=simple_getfsevents('/bin/cat',['/bin/cat']+
map(lambda x: '/file'+str(x),range(0,filesnum)), approach="fusefs")
- for f in map(lambda x: ['stat','/file'+str(x),"ERR/2"],range(0,filesnum)):
+ for f in map(lambda x: ['/file'+str(x),'fail'],range(0,filesnum)):
self.assertTrue(f in eventslist)
def test_parralel(self):
- filesnum=200
- procnum=6
+ filesnum=400
+ procnum=8
# create command
command=""
@@ -89,13 +94,14 @@ class fusefs_simple_tests(unittest.TestCase):
for p in xrange(0,procnum):
for f in xrange(0,filesnum):
- self.assertTrue(resultarray.count(['stat', '/file_%d_%d' % (p,f),"ERR/2"])==1)
+ self.assertTrue(resultarray.count(['/file_%d_%d' % (p,f),"fail"])==1)
def test_open_very_many(self):
resultarray=simple_getfsevents('/bin/sh', ['/bin/sh','-c',
- "for i in `seq 1 10`; do cat /testmany;done 2> /dev/null"],approach="fusefs")
- print resultarray
- self.assertTrue(resultarray.count(['stat','/testmany',"ERR/2"])>=1000)
+ "for i in `seq 1 1000`; do cat /testmany$i;done 2> /dev/null"],approach="fusefs")
+ #print resultarray
+ for i in range(1,1000):
+ self.assertTrue(resultarray.count(['/testmany'+str(i),'fail'])==1)
if __name__ == '__main__':
#unittest.main()
diff --git a/logger/src/autodep/showfsevents.py b/logger/src/autodep/showfsevents.py
index fd628cd..444b96a 100755
--- a/logger/src/autodep/showfsevents.py
+++ b/logger/src/autodep/showfsevents.py
@@ -25,11 +25,13 @@ for stage in events:
filenames[filename]=""
filenames=filenames.keys();
-file_to_package=logfs.portage_utils.getpackagesbyfiles(filenames)
+# temporary disabled
+#file_to_package=logfs.portage_utils.getpackagesbyfiles(filenames)
+file_to_package={}
#print events
-stagesorder={"setup":1,"unpack":2,"prepare":3,"compile":4,"test":5,
- "src_install":6,"preinst":7,"postinst":8, "unknown":9}
+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}
for stage in sorted(events, key=stagesorder.get):
succ_events=events[stage][0]
diff --git a/logger/src/hook_fusefs/hookfs.c b/logger/src/hook_fusefs/hookfs.c
index 89c899a..8219994 100644
--- a/logger/src/hook_fusefs/hookfs.c
+++ b/logger/src/hook_fusefs/hookfs.c
@@ -46,6 +46,8 @@
#define MAXSOCKETPATHLEN 108
#define MAXFILEBUFFLEN 2048
+#define MAXSOCKETMSGLEN 8192
+
#define MAXSTAGELEN 20
#define IOBUFSIZE 65536
@@ -60,7 +62,7 @@ pthread_mutex_t socketblock = PTHREAD_MUTEX_INITIALIZER;
int mountpoint_fd = -1;
char *mountpoint = NULL;
-FILE * log_file = NULL;
+//FILE * log_file = NULL;
int log_socket=-1;
struct hookfs_config config;
@@ -243,15 +245,18 @@ static int is_process_external(pid_t pid) {
}
static void raw_log_event(const char *event_type, const char *filename, char *result,int err, char* stage) {
- fprintf(log_file,"%lld%c",(unsigned long long)time(NULL),0);
- fprintf(log_file,"%s%c%s%c%s%c",event_type,0,filename,0,stage,0);
+ char msg_buff[MAXSOCKETMSGLEN];
+ int bytes_to_send;
+ if(strcmp(result,"ERR")==0) {
+ bytes_to_send=snprintf(msg_buff,MAXSOCKETMSGLEN,"%lld%c%s%c%s%c%s%c%s/%d",
+ (unsigned long long)time(NULL),0,event_type,0,filename,0,stage,0,result,err);
+ } else {
+ bytes_to_send=snprintf(msg_buff,MAXSOCKETMSGLEN,"%lld%c%s%c%s%c%s%c%s",
+ (unsigned long long)time(NULL),0,event_type,0,filename,0,stage,0,result);
+ }
- if(strcmp(result,"ERR")==0)
- fprintf(log_file,"%s/%d",result,err);
- else
- fprintf(log_file,"%s",result);
-
- fprintf(log_file,"%c%c",0,0);
+ if(bytes_to_send>=MAXSOCKETMSGLEN) return;
+ send(log_socket,msg_buff,bytes_to_send,0);
}
/*
@@ -259,11 +264,9 @@ static void raw_log_event(const char *event_type, const char *filename, char *re
*/
static void log_event(const char *event_type, const char *filename, char *result,int err, char* stage) {
if(is_file_excluded(filename)) return;
-
- pthread_mutex_lock( &socketblock );
+// pthread_mutex_lock( &socketblock );
raw_log_event(event_type,filename,result,err,stage);
-
- pthread_mutex_unlock( &socketblock );
+// pthread_mutex_unlock( &socketblock );
}
/*
@@ -278,17 +281,19 @@ static int is_event_allowed(const char *event_type,const char *filename, pid_t p
// sending asking log_event
raw_log_event(event_type,filename,"ASKING",0,stage);
- fflush(log_file);
- char answer[8];
- fscanf(log_file,"%7s",answer);
+ char answer[8];
+ int bytes_recieved;
+ bytes_recieved=recv(log_socket,answer,8,0);
+
+ //fscanf(log_file,"%7s",answer);
pthread_mutex_unlock( &socketblock );
if(strcmp(answer,"ALLOW")==0)
return 1;
else if(strcmp(answer,"DENY")==0)
return 0;
- else
+ else
fprintf(stderr,"Protocol error, text should be ALLOW or DENY, got: %s",answer);
return 0;
}
@@ -972,7 +977,7 @@ static void * hookfs_init(struct fuse_conn_info *conn) {
}
static void hookfs_destroy() {
- fflush(log_file);
+// fflush(log_file);
}
static struct fuse_operations hookfs_oper = {
@@ -1124,45 +1129,45 @@ int main(int argc, char *argv[]) {
char *log_socket_name=getenv("LOG_SOCKET");
if(log_socket_name==NULL) {
- fprintf(stderr,"Using stderr as output for logs "
- "because the LOG_SOCKET environment variable isn't defined.\n");
- log_file=stderr;
- } else {
- if(strlen(log_socket_name)>=MAXSOCKETPATHLEN) {
- fprintf(stderr,"Unable to create a unix-socket %s: socket name is too long,exiting\n", log_socket_name);
+ fprintf(stderr,"LOG_SOCKET environment variable isn't defined."
+ "Are this library launched by server?\n");
return 1;
- }
+ }
+
+ if(strlen(log_socket_name)>=MAXSOCKETPATHLEN) {
+ fprintf(stderr,"Unable to create a unix-socket %s: socket name is too long,exiting\n", log_socket_name);
+ return 1;
+ }
- log_socket=socket(AF_UNIX, SOCK_STREAM, 0);
- if(log_socket==-1) {
- fprintf(stderr,"Unable to create a unix-socket %s: %s\n", log_socket_name, strerror(errno));
- return 1;
- }
-
- struct sockaddr_un serveraddr;
- memset(&serveraddr, 0, sizeof(serveraddr));
- serveraddr.sun_family = AF_UNIX;
- strcpy(serveraddr.sun_path, log_socket_name);
-
- int ret=connect(log_socket, (struct sockaddr *)&serveraddr, SUN_LEN(&serveraddr));
- if(ret==-1) {
- fprintf(stderr,"Unable to connect a unix-socket: %s\n", strerror(errno));
- return 1;
- }
-
- log_file=fdopen(log_socket,"a+");
-
- if(log_file==NULL) {
- fprintf(stderr,"Unable to open a socket for a steam writing: %s\n", strerror(errno));
- exit(1);
- }
-
- ret=setvbuf(log_file,NULL,_IOFBF,IOBUFSIZE);
- if(ret!=0){
- fprintf(stderr,"Unable to set a size of io buffer");
- exit(1);
- }
+ log_socket=socket(AF_UNIX, SOCK_SEQPACKET, 0);
+ if(log_socket==-1) {
+ fprintf(stderr,"Unable to create a unix-socket %s: %s\n", log_socket_name, strerror(errno));
+ return 1;
+ }
+
+ struct sockaddr_un serveraddr;
+ memset(&serveraddr, 0, sizeof(serveraddr));
+ serveraddr.sun_family = AF_UNIX;
+ strcpy(serveraddr.sun_path, log_socket_name);
+
+ int ret=connect(log_socket, (struct sockaddr *)&serveraddr, SUN_LEN(&serveraddr));
+ if(ret==-1) {
+ fprintf(stderr,"Unable to connect a unix-socket: %s\n", strerror(errno));
+ return 1;
}
+
+ //log_file=fdopen(log_socket,"a+");
+
+ //if(log_file==NULL) {
+ //fprintf(stderr,"Unable to open a socket for a steam writing: %s\n", strerror(errno));
+ //exit(1);
+ //}
+
+ //ret=setvbuf(log_file,NULL,_IOFBF,IOBUFSIZE);
+ //if(ret!=0){
+ //fprintf(stderr,"Unable to set a size of io buffer");
+ //exit(1);
+ //}
if (! try_chdir_to_mountpoint(args.argc, args.argv)) {
return 1;
@@ -1170,7 +1175,7 @@ int main(int argc, char *argv[]) {
umask(0);
int res = fuse_main(args.argc, args.argv, &hookfs_oper, NULL);
- fflush(log_file);
- fclose(log_file);
+ //fflush(log_file);
+ //fclose(log_file);
return res;
}
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [gentoo-commits] proj/autodep:master commit in: logger/src/autodep/logfs/, logger/src/hook_fusefs/, logger/src/autodep/
@ 2011-06-26 17:18 Александр Берсенев
0 siblings, 0 replies; 4+ messages in thread
From: Александр Берсенев @ 2011-06-26 17:18 UTC (permalink / raw
To: gentoo-commits
commit: def6b2dfe499271ac0fb1ff493f8fd13800962f4
Author: Alexander Bersenev <bay <AT> hackerdom <DOT> ru>
AuthorDate: Sun Jun 26 23:18:26 2011 +0000
Commit: Александр Берсенев <bay <AT> hackerdom <DOT> ru>
CommitDate: Sun Jun 26 23:18:26 2011 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/autodep.git;a=commit;h=def6b2df
using epoll instead of select
---
logger/src/autodep/logfs/fstracer.py | 62 +++++++++++++++++----------------
logger/src/autodep/showfsevents.py | 2 +-
logger/src/hook_fusefs/hookfs.c | 2 +-
3 files changed, 34 insertions(+), 32 deletions(-)
diff --git a/logger/src/autodep/logfs/fstracer.py b/logger/src/autodep/logfs/fstracer.py
index dda7afe..a4a5b49 100644
--- a/logger/src/autodep/logfs/fstracer.py
+++ b/logger/src/autodep/logfs/fstracer.py
@@ -155,34 +155,38 @@ def getfsevents(prog_name,arguments,approach="hooklib",filterproc=defaultfilter)
print "Launch likely was unsuccessful"
sys.exit(1)
else:
- input = [sock_listen]
+ epoll=select.epoll()
+ epoll.register(sock_listen.fileno(), select.EPOLLIN)
+
connects = 0;
-
- while input:
- inputready,_,_ = select.select(input,[],[],5)
-
- for s in inputready:
- #print "!! len: %d" % len(buffers)
- if s == sock_listen:
- ret = s.accept()
+ clients={}
+ stop=0
+
+ while stop==0:
+ sock_events = epoll.poll(3)
+ for fileno, sock_event in sock_events:
+ if fileno == sock_listen.fileno():
+ ret = sock_listen.accept()
if ret is None:
pass
else:
(client,addr)=ret
connects+=1; # client accepted
- input.append(client)
- else:
+ epoll.register(client.fileno(), select.EPOLLIN)
+ clients[client.fileno()]=client
+ elif sock_event & select.EPOLLHUP:
+ epoll.unregister(fileno)
+ clients[fileno].close()
+ del clients[fileno]
+ connects-=1
+
+ if connects==0:
+ stop=1
+ break
+ elif sock_event & select.EPOLLIN:
+ s=clients[fileno]
record=s.recv(8192)
- if not record:
- s.close()
- input.remove(s)
- connects-=1;
- if connects==0:
- input.remove(sock_listen)
- sock_listen.close()
- continue
-
message=record.split("\0")
#print message
@@ -198,8 +202,6 @@ def getfsevents(prog_name,arguments,approach="hooklib",filterproc=defaultfilter)
else:
eventname,filename,stage,result=message[1:5]
- #if stage != "unknown":
-
if not stage in events:
events[stage]=[{},{}]
@@ -235,19 +237,19 @@ def getfsevents(prog_name,arguments,approach="hooklib",filterproc=defaultfilter)
print "IndexError while parsing %s"%record
- if len(input)==1 and connects==0: #or
- # seems like there is no connect
- print "It seems like a logger module was unable to start or failed to finish" + \
+ if len(sock_events)==0 and len(clients)==0:
+ # # seems like there is no connect
+ print "It seems like a logger module was unable to start or failed to finish\n" + \
"Check that you are not launching a suid program under non-root user."
return []
- if len(inputready)==0 and iszombie(pid):
- print "Child finished, but connection remains. Closing a connection"
- break
+ if len(clients)==0 and iszombie(pid):
+ break
os.wait()
- #if len(events)==0:
- #return []
+ epoll.unregister(sock_listen.fileno())
+ epoll.close()
+ sock_listen.close()
return events
diff --git a/logger/src/autodep/showfsevents.py b/logger/src/autodep/showfsevents.py
index 444b96a..2b04709 100755
--- a/logger/src/autodep/showfsevents.py
+++ b/logger/src/autodep/showfsevents.py
@@ -12,7 +12,7 @@ if len(sys.argv)<2:
print "Usage: showfsevents.py <command>"
exit(1)
-events=logfs.fstracer.getfsevents(sys.argv[1], sys.argv[1:],approach="fusefs")
+events=logfs.fstracer.getfsevents(sys.argv[1], sys.argv[1:],approach="hooklib")
print "Program finished, analyzing dependencies"
# get unique filenames
filenames={}
diff --git a/logger/src/hook_fusefs/hookfs.c b/logger/src/hook_fusefs/hookfs.c
index 8219994..24b6342 100644
--- a/logger/src/hook_fusefs/hookfs.c
+++ b/logger/src/hook_fusefs/hookfs.c
@@ -264,6 +264,7 @@ static void raw_log_event(const char *event_type, const char *filename, char *re
*/
static void log_event(const char *event_type, const char *filename, char *result,int err, char* stage) {
if(is_file_excluded(filename)) return;
+
// pthread_mutex_lock( &socketblock );
raw_log_event(event_type,filename,result,err,stage);
// pthread_mutex_unlock( &socketblock );
@@ -281,7 +282,6 @@ static int is_event_allowed(const char *event_type,const char *filename, pid_t p
// sending asking log_event
raw_log_event(event_type,filename,"ASKING",0,stage);
-
char answer[8];
int bytes_recieved;
bytes_recieved=recv(log_socket,answer,8,0);
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2011-06-26 17:19 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-06-26 17:18 [gentoo-commits] proj/autodep:master commit in: logger/src/autodep/logfs/, logger/src/hook_fusefs/, logger/src/autodep/ Александр Берсенев
-- strict thread matches above, loose matches on Subject: below --
2011-06-25 19:52 Александр Берсенев
2011-06-18 15:53 Александр Берсенев
2011-06-10 6:45 Александр Берсенев
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox