diff options
author | Alexander Bersenev <bay@hackerdom.ru> | 2011-05-25 23:27:10 +0000 |
---|---|---|
committer | Alexander Bersenev <bay@hackerdom.ru> | 2011-05-25 23:27:10 +0000 |
commit | d3d4eea92adb488e7704dfd3548e8974846741c8 (patch) | |
tree | 729a006fae7c0e7e84edf1f8e4fa5762707839a0 | |
parent | use sockets instead of pipes for IPC (diff) | |
download | autodep-d3d4eea92adb488e7704dfd3548e8974846741c8.tar.gz autodep-d3d4eea92adb488e7704dfd3548e8974846741c8.tar.bz2 autodep-d3d4eea92adb488e7704dfd3548e8974846741c8.zip |
refactor socket logic on server
-rw-r--r-- | logger/src/autodep/logfs/fstracer.py | 104 | ||||
-rwxr-xr-x | logger/src/autodep/showfsevents.py | 5 | ||||
-rw-r--r-- | logger/src/hook_lib/file_hook.c | 86 | ||||
-rw-r--r-- | logger/test/1_access/accesser.c | 17 |
4 files changed, 125 insertions, 87 deletions
diff --git a/logger/src/autodep/logfs/fstracer.py b/logger/src/autodep/logfs/fstracer.py index 8b5c61b..9460093 100644 --- a/logger/src/autodep/logfs/fstracer.py +++ b/logger/src/autodep/logfs/fstracer.py @@ -7,72 +7,22 @@ import os import time import tempfile import socket -import asyncore - -class socket_selecter(asyncore.dispatcher): - connects=0; - - def __init__(self,path): - asyncore.dispatcher.__init__(self) - self.path=path - self.create_socket(socket.AF_UNIX, socket.SOCK_STREAM) - self.set_reuse_addr() - self.bind(self.path) - self.listen(128) - - def handle_accept(self): - ret = self.accept() - if ret is None: - pass - else: - (sock,addr)=ret - print "Client accepted\n" - self.connects+=1 - handler = log_handler(sock,addr,self) - print "After client accepted connects=%s\n" % self.connects - - -class log_handler(asyncore.dispatcher_with_send): - - def __init__(self, sock, addr,listen_socket_dispatcher): - asyncore.dispatcher_with_send.__init__(self, sock) - self.addr = addr - self.buffer = '' - self.listen_sock_dispatcher=listen_socket_dispatcher - - def handle_read(self): - print self.recv(8192) - - def writable(self): - return (len(self.buffer) > 0) - - def handle_write(self): - pass - #self.send(self.buffer) - #self.buffer = '' - - def handle_close(self): - print "Client closed the socket\n" - self.listen_sock_dispatcher.connects-=1 - if self.listen_sock_dispatcher.connects == 0: - #pass - self.listen_sock_dispatcher.close() - self.close() - - +import select # run the program and get file access events def getfsevents(prog_name,arguments): - # generating a random socketname + # generate a random socketname tmpdir = tempfile.mkdtemp() socketname = os.path.join(tmpdir, 'socket') try: - pass - #os.mkfifo(fifoname) - except OSError, e: - print "Failed to create a socket for exchange data with logger: %s" % e + 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) + except socket.error, e: + print "Failed to create a socket for exchange data with the logger: %s" % e return () else: print socketname @@ -84,18 +34,34 @@ def getfsevents(prog_name,arguments): "LD_PRELOAD":"/home/bay/gsoc/logger/src/hook_lib/file_hook.so", "LOG_SOCKET":socketname }) + print "Failed to launch the programm" os.exit(0) else: - server = socket_selecter(socketname) - #fifo = open(fifoname, 'r') - - try: - asyncore.loop() - finally: - if os.path.exists(server.path): - os.unlink(server.path) - os.wait() + input = [sock_listen] + connects = 0; - pass - + while input: + inputready,outputready,exceptready = select.select(input,[],[]) + + for s in inputready: + if s == sock_listen: + ret = s.accept() + if ret is None: + pass + else: + (client,addr)=ret + print "Client accepted\n"; + connects+=1; + input.append(client) + else: + data = s.recv(8192) + if data: + print data + else: + s.close() + input.remove(s) + connects-=1; + if connects==0: + input.remove(sock_listen) + os.wait() diff --git a/logger/src/autodep/showfsevents.py b/logger/src/autodep/showfsevents.py index 06a872b..8e4647a 100755 --- a/logger/src/autodep/showfsevents.py +++ b/logger/src/autodep/showfsevents.py @@ -2,4 +2,7 @@ import os -from ..pymodules.fstracrds import fstracer
\ No newline at end of file +import logfs.fstracer + +logfs.fstracer.getfsevents("/bin/sh", ["sh" , "-c", "/usr/bin/tac bay_success; /usr/bin/tac bay_god bay_god2"]) +#logfs.fstracer.getfsevents("emerge", ["emerge","--info"])
\ No newline at end of file diff --git a/logger/src/hook_lib/file_hook.c b/logger/src/hook_lib/file_hook.c index 11228c1..6713d54 100644 --- a/logger/src/hook_lib/file_hook.c +++ b/logger/src/hook_lib/file_hook.c @@ -12,41 +12,85 @@ #define _FCNTL_H #include <bits/fcntl.h> +#include <sys/socket.h> +#include <sys/un.h> + #define MAXPATHLEN 256 +#define MAXSOCKETPATHLEN 108 #define MAXFILEBUFFLEN 2048 //extern int errorno; int (*_open)(const char * pathname, int flags, ...); int (*_open64)(const char * pathname, int flags, ...); +int (*_execve)(const char *filename, char *const argv[],char *const envp[]); + +FILE *log_file_handle; // one of these two vars will be used for logging +int log_socket=-1; -FILE *log_file_handle; +int is_log_into_socket=0; void _init() { _open = (int (*)(const char * pathname, int flags, ...)) dlsym(RTLD_NEXT, "open"); _open64 = (int (*)(const char * pathname, int flags, ...)) dlsym(RTLD_NEXT, "open64"); + _execve = (int (*)(const char *filename, char *const argv[],char *const envp[])) dlsym(RTLD_NEXT, "execve"); - if(_open==NULL || _open64==NULL) { + if(_open==NULL || _open64==NULL || execve==NULL) { fprintf(stderr,"Failed to load original functions of hook\n"); exit(1); } - char *log_file_name=getenv("FILE_LOG"); - if(log_file_name==NULL) { + + char *log_socket_name=getenv("LOG_SOCKET"); + if(log_socket_name==NULL) { fprintf(stderr,"Using stderr as output for logs " - "because the FILE_LOG environment variable isn't defined.\n"); + "because the LOG_SOCKET environment variable isn't defined.\n"); + log_file_handle=stderr; } else { - log_file_handle=fopen(log_file_name,"a+"); + is_log_into_socket=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); + exit(1); + } + + fprintf(stderr,"Using a socket for logging: %s\n",log_socket_name); + + 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)); + exit(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)); + exit(1); + } + + log_file_handle=fdopen(log_socket,"r+"); + if(log_file_handle==NULL) { - fprintf(stderr,"Failed to open log file %s: %s\n", log_file_name, strerror(errno)); + fprintf(stderr,"Unable to open a socket for a steam writing: %s\n", strerror(errno)); exit(1); } } } void _fini() { + fflush(log_file_handle); fclose(log_file_handle); + + if(is_log_into_socket) + close(log_socket); + + //fprintf(stderr,"All sockets closed\n"); } /* @@ -71,6 +115,12 @@ void __print_escaped(FILE *fh ,const char *s){ } /* + * Fprint +*/ + +//void __fprint + +/* * Get a pid of the parent proccess * Parse the /proc/pid/stat * We need a first number after last ')' character @@ -153,14 +203,14 @@ void __print_cmdline(pid_t pid) { /* * Format of log string: time event file flags result parents */ -void __hook_log(const char *event_type, const char *filename,int flags, int result, int err) { +void __hook_log(const char *event_type, const char *filename, char* result, int err) { fprintf(log_file_handle,"%lld ",(unsigned long long)time(NULL)); __print_escaped(log_file_handle, event_type); fprintf(log_file_handle," "); __print_escaped(log_file_handle, filename); - fprintf(log_file_handle," %d %d %d ", flags, result, err); + fprintf(log_file_handle," %s %d ", result, err); // TODO: add a parent processes in output pid_t pid; __getparentpid(getpid()); @@ -172,6 +222,7 @@ void __hook_log(const char *event_type, const char *filename,int flags, int resu } fprintf(log_file_handle,"\n"); + fflush(log_file_handle); } int open(const char * pathname, int flags, mode_t mode) { @@ -181,7 +232,7 @@ int open(const char * pathname, int flags, mode_t mode) { else ret=_open(pathname, flags, 0); - __hook_log("open",pathname,flags,ret,errno); + __hook_log("open",pathname,"todo",errno); return ret; } @@ -194,13 +245,16 @@ int open64(const char * pathname, int flags, mode_t mode) { else ret=_open64(pathname, flags, 0); - __hook_log("open64",pathname,flags,ret,errno); + __hook_log("open64",pathname,"todo",errno); return ret; } -//int execve(const char *filename, char *const argv[], -// char *const envp[]) { - //printf("FORK!!!!(canceled)"); -// return NULL; -//} +int execve(const char *filename, char *const argv[], + char *const envp[]) { + __hook_log("execve",filename,"todo",0); + + int ret=_execve(filename, argv, envp); + + return ret; +} diff --git a/logger/test/1_access/accesser.c b/logger/test/1_access/accesser.c index 912fc70..cdfe520 100644 --- a/logger/test/1_access/accesser.c +++ b/logger/test/1_access/accesser.c @@ -1,10 +1,25 @@ +#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> +#include <string.h> +#include <errno.h> int main(int argc, char **argv) { if(argc<=1) { printf("Usage: accesser.c <file1> [file2] [file3] ...\n"); + return 1; } - return 0; + int i; + for(i=1;i<argc;i++) { + printf("Accessing %s: ",argv[i]); + int fh; + fh=open(argv[i], O_RDONLY); + if(fh!=-1) + printf("OK\n"); + else + printf("ERR, %s\n", strerror(errno)); + } + + return 0; } |