aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Bersenev <bay@hackerdom.ru>2011-05-25 23:27:10 +0000
committerAlexander Bersenev <bay@hackerdom.ru>2011-05-25 23:27:10 +0000
commitd3d4eea92adb488e7704dfd3548e8974846741c8 (patch)
tree729a006fae7c0e7e84edf1f8e4fa5762707839a0
parentuse sockets instead of pipes for IPC (diff)
downloadautodep-d3d4eea92adb488e7704dfd3548e8974846741c8.tar.gz
autodep-d3d4eea92adb488e7704dfd3548e8974846741c8.tar.bz2
autodep-d3d4eea92adb488e7704dfd3548e8974846741c8.zip
refactor socket logic on server
-rw-r--r--logger/src/autodep/logfs/fstracer.py104
-rwxr-xr-xlogger/src/autodep/showfsevents.py5
-rw-r--r--logger/src/hook_lib/file_hook.c86
-rw-r--r--logger/test/1_access/accesser.c17
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;
}