diff options
author | Alexander Bersenev <bay@hackerdom.ru> | 2011-06-18 15:07:10 +0000 |
---|---|---|
committer | Alexander Bersenev <bay@hackerdom.ru> | 2011-06-18 15:07:10 +0000 |
commit | 9112354f1c080f2af2ea90647fa1be91578c998d (patch) | |
tree | 360c7e725f240f2171269cee56d8c1883fdd3068 | |
parent | small performance optimization (diff) | |
download | autodep-9112354f1c080f2af2ea90647fa1be91578c998d.tar.gz autodep-9112354f1c080f2af2ea90647fa1be91578c998d.tar.bz2 autodep-9112354f1c080f2af2ea90647fa1be91578c998d.zip |
simplify the protocol to make its parsing quick
-rw-r--r-- | NOTES | 5 | ||||
-rw-r--r-- | logger/src/autodep/logfs/fstracer.py | 30 | ||||
-rw-r--r-- | logger/src/hook_fusefs/hookfs.c | 37 |
3 files changed, 16 insertions, 56 deletions
@@ -10,10 +10,7 @@ This is few notes mainly for myself. 2. Format of answer for ASKING packet: <ALLOW | DENY> -3. Format of answer for not ASKING packet: - <ALLOW> - -4. Format of events structure: +3. Format of events structure: [ { <stage of building>:{<filename>:[<was readed>,<was writed>]} diff --git a/logger/src/autodep/logfs/fstracer.py b/logger/src/autodep/logfs/fstracer.py index a632269..fec926c 100644 --- a/logger/src/autodep/logfs/fstracer.py +++ b/logger/src/autodep/logfs/fstracer.py @@ -16,18 +16,9 @@ import proc_helpers import logger_hooklib import logger_fusefs - -def unescape(s): - s=s.replace(r'\\r', '\r') - s=s.replace(r'\\n', '\n') - s=s.replace(r'\\', '') - return s - def parse_message(message): - ret=re.split(r"(?<![\\]) ",message,6) - #for i in ret: - - return map(unescape, ret) + ret=message.split("\0") + return ret # check if proccess is finished def checkfinished(pid): @@ -180,7 +171,7 @@ def getfsevents(prog_name,arguments,approach="hooklib",filterproc=defaultfilter) (client,addr)=ret connects+=1; # client accepted input.append(client) - buffers[client]='' + buffers[client]="" else: data=s.recv(4096) @@ -189,26 +180,25 @@ def getfsevents(prog_name,arguments,approach="hooklib",filterproc=defaultfilter) if not data: s.close() input.remove(s) - buffers[s]="" + del buffers[s] connects-=1; if connects==0: input.remove(sock_listen) sock_listen.close() continue - - - if not "\n" in buffers[s]: + + if not "\0\0" in buffers[s]: continue - data,buffers[s] = buffers[s].rsplit("\n",1) + data,buffers[s] = buffers[s].rsplit("\0\0",1) - for record in data.split("\n"): + 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=parse_message(record) + message=record.split("\0") try: @@ -256,8 +246,6 @@ def getfsevents(prog_name,arguments,approach="hooklib",filterproc=defaultfilter) except IndexError: print "IndexError while parsing %s"%record - #print "!!"+data+"!!" - #print parse_message(data) if len(input)==1 and connects==0: #or diff --git a/logger/src/hook_fusefs/hookfs.c b/logger/src/hook_fusefs/hookfs.c index a633276..3545151 100644 --- a/logger/src/hook_fusefs/hookfs.c +++ b/logger/src/hook_fusefs/hookfs.c @@ -70,24 +70,6 @@ char *stagenames[]={ }; int stagenameslength=sizeof(stagenames)/sizeof(char *); - -/* - * Prints a string escaping spaces and '\' - * Does not check input variables -*/ -static void __print_escaped(FILE *fh ,const char *s){ - for(;(*s)!=0; s++) { - if(*s==' ') - fprintf(fh,"\\ "); - else if(*s=='\n') - fprintf(fh,"\\n"); - else if(*s=='\\') - fprintf(fh,"\\\\"); - else - fprintf(fh,"%c", *s); - } -} - /* * Get a pid of the parent proccess * Parse the /proc/pid/stat @@ -203,30 +185,23 @@ static int is_process_external(pid_t pid) { if(pid==1 || getparentpid(pid)==1) return 0; - getparentpid(getpid()); for(;pid!=0;pid=getparentpid(pid)) if(pid==parent_pid) return 0; - return 1; + return 1; } static void raw_log_event(const char *event_type, const char *filename, char *result,int err, char* stage) { - - - fprintf(log_file,"%lld ",(unsigned long long)time(NULL)); - - __print_escaped(log_file, event_type); - fprintf(log_file," "); - __print_escaped(log_file, filename); + 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); - fprintf(log_file," %s ", stage); if(strcmp(result,"ERR")==0) fprintf(log_file,"%s/%d",result,err); else fprintf(log_file,"%s",result); - fprintf(log_file,"\n"); + fprintf(log_file,"%c%c",0,0); fflush(log_file); } @@ -247,12 +222,12 @@ static void log_event(const char *event_type, const char *filename, char *result * Returns 1 if access is allowed and 0 if denied */ static int is_event_allowed(const char *event_type,const char *filename, pid_t pid, char* stage) { - // sending asking log_event if(is_file_excluded(filename)) return 1; if(is_process_external(pid)) return 0; // protecting from external access //return 1; pthread_mutex_lock( &socketblock ); - + + // sending asking log_event raw_log_event(event_type,filename,"ASKING",0,stage); char answer[8]; |