aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Bersenev <bay@hackerdom.ru>2011-06-18 15:07:10 +0000
committerAlexander Bersenev <bay@hackerdom.ru>2011-06-18 15:07:10 +0000
commit9112354f1c080f2af2ea90647fa1be91578c998d (patch)
tree360c7e725f240f2171269cee56d8c1883fdd3068
parentsmall performance optimization (diff)
downloadautodep-9112354f1c080f2af2ea90647fa1be91578c998d.tar.gz
autodep-9112354f1c080f2af2ea90647fa1be91578c998d.tar.bz2
autodep-9112354f1c080f2af2ea90647fa1be91578c998d.zip
simplify the protocol to make its parsing quick
-rw-r--r--NOTES5
-rw-r--r--logger/src/autodep/logfs/fstracer.py30
-rw-r--r--logger/src/hook_fusefs/hookfs.c37
3 files changed, 16 insertions, 56 deletions
diff --git a/NOTES b/NOTES
index 0b1baf9..91c3df3 100644
--- a/NOTES
+++ b/NOTES
@@ -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];