Gentoo Archives: gentoo-commits

From: "Александр Берсенев" <bay@×××××××××.ru>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/autodep:master commit in: logger/src/autodep/logfs/, logger/src/autodep/, logger/src/hook_lib/
Date: Thu, 30 Jun 2011 20:04:44
Message-Id: a211bf1d95a0adae7aa76539fcc9789aa0c1644c.bay@gentoo
1 commit: a211bf1d95a0adae7aa76539fcc9789aa0c1644c
2 Author: Alexander Bersenev <bay <AT> hackerdom <DOT> ru>
3 AuthorDate: Fri Jul 1 02:04:09 2011 +0000
4 Commit: Александр Берсенев <bay <AT> hackerdom <DOT> ru>
5 CommitDate: Fri Jul 1 02:04:09 2011 +0000
6 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/autodep.git;a=commit;h=a211bf1d
7
8 fixed a very nasty issue with environment variables
9
10 ---
11 logger/src/autodep/logfs/fstracer.py | 17 ++-
12 logger/src/autodep/showfsevents.py | 1 +
13 logger/src/hook_lib/file_hook.c | 280 +++++++++++++++++++++++++++++-----
14 3 files changed, 253 insertions(+), 45 deletions(-)
15
16 diff --git a/logger/src/autodep/logfs/fstracer.py b/logger/src/autodep/logfs/fstracer.py
17 index 7ceb36e..1b99f8e 100644
18 --- a/logger/src/autodep/logfs/fstracer.py
19 +++ b/logger/src/autodep/logfs/fstracer.py
20 @@ -132,10 +132,10 @@ def getfsevents(prog_name,arguments,approach="hooklib",filterproc=defaultfilter)
21
22 sock_listen.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
23 sock_listen.bind(socketname)
24 - sock_listen.listen(1024)
25 + sock_listen.listen(64)
26 # enable connect a socket for anyone
27 os.chmod(tmpdir,stat.S_IRUSR|stat.S_IWUSR|stat.S_IXUSR|stat.S_IROTH|stat.S_IWOTH|stat.S_IXOTH)
28 - os.chmod(socketname,stat.S_IRUSR|stat.S_IWUSR|stat.S_IROTH|stat.S_IWOTH)
29 + os.chmod(socketname,stat.S_IRUSR|stat.S_IWUSR|stat.S_IXUSR|stat.S_IROTH|stat.S_IWOTH|stat.S_IXOTH)
30
31 except socket.error, e:
32 print "Failed to create a socket for exchange data with the logger: %s" % e
33 @@ -168,19 +168,26 @@ def getfsevents(prog_name,arguments,approach="hooklib",filterproc=defaultfilter)
34 stop=0
35 was_first_connect=False
36
37 + #print "fileno listen: %d",sock_listen.fileno()
38 +
39 while stop==0:
40 sock_events = epoll.poll(3)
41 for fileno, sock_event in sock_events:
42 if fileno == sock_listen.fileno():
43 + #print "\n\nEVENT\n\n"
44 ret = sock_listen.accept()
45 + #print ret
46 if ret is None:
47 + # print "\n\nPASS\n\n"
48 pass
49 else:
50 (client,addr)=ret
51 + # print client
52 connects+=1; # client accepted
53 was_first_connect=True
54 epoll.register(client.fileno(), select.EPOLLIN)
55 clients[client.fileno()]=client
56 + #print "opened %d" % client.fileno()
57 #elif sock_event & select.EPOLLHUP:
58 #epoll.unregister(fileno)
59 #clients[fileno].close()
60 @@ -196,7 +203,7 @@ def getfsevents(prog_name,arguments,approach="hooklib",filterproc=defaultfilter)
61 clients[fileno].close()
62 del clients[fileno]
63 connects-=1
64 - #print "closing!!"
65 + #print "closed %d"%fileno
66 continue
67
68 message=record.split("\0")
69 @@ -258,12 +265,14 @@ def getfsevents(prog_name,arguments,approach="hooklib",filterproc=defaultfilter)
70 return []
71 if len(clients)==0 and iszombie(pid):
72 break
73 +
74 + #print "\n\nRETURNING!!!!\n\n"
75 +
76
77 os.wait()
78
79 epoll.unregister(sock_listen.fileno())
80 epoll.close()
81 sock_listen.close()
82 -
83 return events
84
85
86 diff --git a/logger/src/autodep/showfsevents.py b/logger/src/autodep/showfsevents.py
87 index 2b04709..20264e1 100755
88 --- a/logger/src/autodep/showfsevents.py
89 +++ b/logger/src/autodep/showfsevents.py
90 @@ -14,6 +14,7 @@ if len(sys.argv)<2:
91
92 events=logfs.fstracer.getfsevents(sys.argv[1], sys.argv[1:],approach="hooklib")
93 print "Program finished, analyzing dependencies"
94 +#exit(0);
95 # get unique filenames
96 filenames={}
97 for stage in events:
98
99 diff --git a/logger/src/hook_lib/file_hook.c b/logger/src/hook_lib/file_hook.c
100 index 7c846e2..2958cb7 100644
101 --- a/logger/src/hook_lib/file_hook.c
102 +++ b/logger/src/hook_lib/file_hook.c
103 @@ -22,6 +22,8 @@
104 #define MAXFILEBUFFLEN 2048
105
106 #define MAXSOCKETMSGLEN 8192
107 +#define MAXENVSIZE 65536
108 +#define MAXENVITEMSIZE 256
109
110 //extern int errorno;
111
112 @@ -31,16 +33,27 @@ int (*_open)(const char * pathname, int flags, ...);
113 int (*_open64)(const char * pathname, int flags, ...);
114 FILE * (*_fopen)(const char *path, const char *mode);
115 FILE * (*_fopen64)(const char *path, const char *mode);
116 -int (*_execve)(const char *filename, char *const argv[],char *const envp[]);
117 ssize_t (*_read)(int fd, void *buf, size_t count);
118 ssize_t (*_write)(int fd, const void *buf, size_t count);
119 size_t (*_fread)(void *ptr, size_t size, size_t nmemb, FILE *stream);
120 size_t (*_fwrite)(const void *ptr, size_t size, size_t nmemb, FILE *stream);
121
122 +int (*_execve)(const char *filename, char *const argv[],char *const envp[]);
123 +int (*_execv)(const char *path, char *const argv[]);
124 +int (*_execvp)(const char *file, char *const argv[]);
125 +int (*_fexecve)(int fd, char *const argv[], char *const envp[]);
126 +
127 +int (*_system)(const char *command);
128 +
129 +pid_t (*_fork)();
130 +
131 +int (*_setenv)(const char *name, const char *value, int overwrite);
132 int (*_close)(int fd); // we hooking this, because some programs closes our socket
133
134 int log_socket=-1;
135
136 +char log_socket_orig[MAXSOCKETPATHLEN];
137 +
138 void __doinit(){
139 _open = (int (*)(const char * pathname, int flags, ...)) dlsym(RTLD_NEXT, "open");
140 _open64 = (int (*)(const char * pathname, int flags, ...)) dlsym(RTLD_NEXT, "open64");
141 @@ -51,52 +64,70 @@ void __doinit(){
142 _read= (ssize_t (*)(int fd, void *buf, size_t count)) dlsym(RTLD_NEXT, "read");
143 _write= (ssize_t (*)(int fd, const void *buf, size_t count)) dlsym(RTLD_NEXT, "write");
144
145 + _fork = (pid_t (*)()) dlsym(RTLD_NEXT, "fork");
146 _execve = (int (*)(const char *filename, char *const argv[],char *const envp[])) dlsym(RTLD_NEXT, "execve");
147 + _execv = (int (*)(const char *path, char *const argv[])) dlsym(RTLD_NEXT, "execv");
148 + _execvp = (int (*)(const char *file, char *const argv[])) dlsym(RTLD_NEXT, "execvp");
149
150 + _fexecve = (int (*)(int fd, char *const argv[], char *const envp[])) dlsym(RTLD_NEXT, "fexecve");
151 +
152 + _system = (int (*)(const char *command)) dlsym(RTLD_NEXT, "system");
153 +
154 +
155 + _setenv=(int (*)(const char *name, const char *value, int overwrite)) dlsym(RTLD_NEXT, "setenv");
156 _close= (int (*)(int fd)) dlsym(RTLD_NEXT, "close");
157
158
159 if(_open==NULL || _open64==NULL ||
160 _fopen==NULL || _fopen64==NULL ||
161 - execve==NULL || _read==NULL || _write==NULL || close==NULL) {
162 + _read==NULL || _write==NULL ||
163 + _fork==NULL || _execve==NULL || _execv==NULL || _fexecve==NULL || _execvp==NULL ||
164 + _system==NULL || _setenv==NULL || _close==NULL) {
165 fprintf(stderr,"Failed to load original functions of hook\n");
166 exit(1);
167 }
168
169
170 char *log_socket_name=getenv("LOG_SOCKET");
171 +
172 if(log_socket_name==NULL) {
173 fprintf(stderr,"LOG_SOCKET environment variable isn't defined."
174 "Are this library launched by server?\n");
175
176 exit(1);
177 - } else {
178 - if(strlen(log_socket_name)>=MAXSOCKETPATHLEN) {
179 - fprintf(stderr,"Unable to create a unix-socket %s: socket name is too long,exiting\n", log_socket_name);
180 - exit(1);
181 - }
182 -
183 - log_socket=socket(AF_UNIX, SOCK_SEQPACKET, 0);
184 - if(log_socket==-1) {
185 - fprintf(stderr,"Unable to create a unix-socket %s: %s\n", log_socket_name, strerror(errno));
186 - exit(1);
187 - }
188 -
189 - struct sockaddr_un serveraddr;
190 - memset(&serveraddr, 0, sizeof(serveraddr));
191 - serveraddr.sun_family = AF_UNIX;
192 - strcpy(serveraddr.sun_path, log_socket_name);
193 -
194 - int ret=connect(log_socket, (struct sockaddr *)&serveraddr, SUN_LEN(&serveraddr));
195 - if(ret==-1) {
196 - fprintf(stderr,"Unable to connect a unix-socket: %s\n", strerror(errno));
197 - exit(1);
198 - }
199 - }
200 + }
201 + strcpy(log_socket_orig,getenv("LOG_SOCKET"));
202 + //fprintf(stderr,"%d %s\n",getpid(),log_socket_name);
203 +
204 +
205 + if(strlen(log_socket_name)>=MAXSOCKETPATHLEN) {
206 + fprintf(stderr,"Unable to create a unix-socket %s: socket name is too long,exiting\n", log_socket_name);
207 + exit(1);
208 + }
209 +
210 + log_socket=socket(AF_UNIX, SOCK_SEQPACKET, 0);
211 + if(log_socket==-1) {
212 + fprintf(stderr,"Unable to create a unix-socket %s: %s\n", log_socket_name, strerror(errno));
213 + exit(1);
214 + }
215 +
216 + struct sockaddr_un serveraddr;
217 + memset(&serveraddr, 0, sizeof(serveraddr));
218 + serveraddr.sun_family = AF_UNIX;
219 + strcpy(serveraddr.sun_path, log_socket_name);
220 +
221 +
222 + int ret=connect(log_socket, (struct sockaddr *)&serveraddr, SUN_LEN(&serveraddr));
223 + if(ret==-1) {
224 + fprintf(stderr,"Unable to connect a unix-socket %d %s: %s\n", getpid(),log_socket_name, strerror(errno));
225 + fflush(stderr);
226 + //execlp("/bin/bash","/bin/bash",NULL);
227 + exit(1);
228 + }
229 }
230
231 void __dofini() {
232 - //close(log_socket);
233 + close(log_socket);
234 }
235
236 void _init() {
237 @@ -110,7 +141,7 @@ void _fini() {
238 /*
239 * Format of log string: time event filename stage result/err
240 */
241 -static void __raw_log_event(const char *event_type, const char *filename, char *result,int err, char* stage) {
242 +static int __raw_log_event(const char *event_type, const char *filename, char *result,int err, char* stage) {
243 //printf("lololo:%s %s %s\n",event_type,filename,stage);
244
245 char msg_buff[MAXSOCKETMSGLEN];
246 @@ -123,19 +154,20 @@ static void __raw_log_event(const char *event_type, const char *filename, char *
247 (unsigned long long)time(NULL),0,event_type,0,filename,0,stage,0,result);
248 }
249
250 - if(bytes_to_send>=MAXSOCKETMSGLEN) return;
251 - if(send(log_socket,msg_buff,bytes_to_send,0)==-1) {
252 - printf("BAYBAY!!!11 %d %d\n",log_socket, getpid());
253 - sleep(100500);
254 - }
255 + if(bytes_to_send>=MAXSOCKETMSGLEN)
256 + return 0;
257 +
258 + if(send(log_socket,msg_buff,bytes_to_send,0)==-1)
259 + return 0;
260
261 + return 1;
262 }
263
264 /*
265 * Log an event
266 */
267 -static void __log_event(const char *event_type, const char *filename, char *result,int err, char* stage) {
268 - __raw_log_event(event_type,filename,result,err,stage);
269 +static int __log_event(const char *event_type, const char *filename, char *result,int err, char* stage) {
270 + return __raw_log_event(event_type,filename,result,err,stage);
271 }
272
273 /*
274 @@ -167,7 +199,7 @@ ssize_t __get_path_by_fd(int fd, char *output, int output_len) {
275 static int __is_event_allowed(const char *event_type,const char *filename, char* stage) {
276 char answer[8];
277 int bytes_recieved;
278 -
279 + //printf("asking %s\n",filename);
280
281 pthread_mutex_lock( &socketblock );
282
283 @@ -180,8 +212,11 @@ static int __is_event_allowed(const char *event_type,const char *filename, char*
284 return 1;
285 else if(strcmp(answer,"DENY")==0)
286 return 0;
287 - else
288 + else {
289 fprintf(stderr,"Protocol error, text should be ALLOW or DENY, got: %s",answer);
290 +
291 + exit(1);
292 + }
293 return 0;
294 }
295
296 @@ -198,10 +233,10 @@ int open(const char * path, int flags, mode_t mode) {
297 }
298
299
300 - if(flags & O_CREAT)
301 + //if(flags & O_CREAT)
302 ret=_open(path, flags, mode);
303 - else
304 - ret=_open(path, flags, 0);
305 + //else
306 + // ret=_open(path, flags, 0);
307
308 if(ret==-1)
309 __log_event("open",fullpath,"ERR",errno,stage);
310 @@ -311,7 +346,27 @@ ssize_t write(int fd,const void *buf, size_t count){
311 return ret;
312 }
313
314 +pid_t fork(void) {
315 + //fprintf(stderr,"prefork %s %s\n",getenv("LOG_SOCKET"),log_socket_orig);
316
317 + //int succ=
318 + setenv("LOG_SOCKET",log_socket_orig,1);
319 +
320 + //fprintf(stderr,"prefork %s%p%p%d %s\n",getenv("LOG_SOCKET"),_setenv,setenv,succ,log_socket_orig);
321 +
322 + int ret=_fork();
323 + // we must to handle fork for reconnect a socket
324 +
325 + if(ret==0) {
326 +
327 + __dofini(); // reinit connection for clildren
328 + __doinit(); // because now it is different processes
329 + } else {
330 + //fprintf(stderr,"fork new: %d LOG_SOCKET=%s\n", ret,getenv("LOG_SOCKET"));
331 + //sleep(3);
332 + }
333 + return ret;
334 +}
335
336 int execve(const char *filename, char *const argv[],
337 char *const envp[]) {
338 @@ -319,17 +374,160 @@ int execve(const char *filename, char *const argv[],
339 __log_event("open",filename,"OK",0,__get_stage());
340 else
341 __log_event("open",filename,"ERR",2,__get_stage());
342 -
343
344 + //fprintf(stderr,"executing %s pid=%d", filename,getpid());
345 + char *new_envp[MAXENVSIZE];
346 + char new_ld_preload[MAXENVITEMSIZE];
347 + char new_log_socket[MAXENVITEMSIZE];
348 +
349 + int ld_preload_valid=0;
350 + int log_socket_valid=0;
351 + int i;
352 + for(i=0;envp[i];i++){
353 + if(strncmp(envp[i],"LD_PRELOAD=",11)==0)
354 + if(strcmp(envp[i]+11,getenv("LD_PRELOAD"))==0)
355 + ld_preload_valid=1;
356 + if(strncmp(envp[i],"LOG_SOCKET=",11)==0)
357 + if(strcmp(envp[i]+11,log_socket_orig)==0)
358 + log_socket_valid=1;
359 + }
360 + if(!ld_preload_valid || !log_socket_valid) {
361 + snprintf(new_ld_preload,MAXENVITEMSIZE,"LD_PRELOAD=%s",getenv("LD_PRELOAD"));
362 + snprintf(new_log_socket,MAXENVITEMSIZE,"LOG_SOCKET=%s",log_socket_orig);
363 + for(i=0; envp[i] && i<MAXENVSIZE-3; i++) {
364 + if(strncmp(envp[i],"LD_PRELOAD=",11)==0) {
365 + new_envp[i]=new_ld_preload;
366 + ld_preload_valid=1;
367 + } else if(strncmp(envp[i],"LOG_SOCKET=",11)==0) {
368 + new_envp[i]=new_log_socket;
369 + log_socket_valid=1;
370 + } else {
371 + new_envp[i]=envp[i];
372 + }
373 + }
374 +
375 + if(!ld_preload_valid) {
376 + new_envp[i]=new_ld_preload;
377 + i++;
378 + }
379 + if(!log_socket_valid) {
380 + new_envp[i]=new_log_socket;
381 + i++;
382 + }
383 + new_envp[i]=NULL;
384 + envp=new_envp;
385 +// for(i=0;envp[i];i++){
386 +// printf("BAY: %s\n",envp[i]);
387 +// }
388 +
389 + }
390 +
391 + fflush(stderr);
392 int ret=_execve(filename, argv, envp);
393
394 return ret;
395 }
396
397 +//int clone(int (*fn)(void *), void *child_stack,
398 +// int flags, void *arg, ...) {
399 +// fprintf(stderr,"clone pid=%d",getpid());
400 +// fflush(stderr);
401 +
402 +// return -1;//_clone(fn,child_stack,flags,arg);
403 +//}
404 +
405 +
406 +/*int fexecve(int fd, char *const argv[], char *const envp[]) {
407 + fprintf(stderr,"fexecuting pid=%d",getpid());
408 + fflush(stderr);
409 + return _fexecve(fd,argv,envp);
410 +}
411 +
412 +int execle(const char *path, const char *arg, ...) {
413 + fprintf(stderr,"fexecluting pid=%d",getpid());
414 + fflush(stderr);
415 +//
416 + return 0;
417 +}
418 +
419 +int execl(const char *path, const char *arg, ...){
420 + fprintf(stderr,"execluting 1 pid=%d",getpid());
421 + fflush(stderr);
422 +//
423 + return 0;
424 +}
425 +
426 +int execv(const char *path, char *const argv[]){
427 + fprintf(stderr,"execvuting 1 pid=%d",getpid());
428 + fflush(stderr);
429 + _execv(path,argv);
430 + return 0;
431 +}
432 +
433 +int execvp(const char *file, char *const argv[]){
434 + fprintf(stderr,"execvpting 1 pid=%d",getpid());
435 + fflush(stderr);
436 +
437 + return _execvp(file,argv);
438 +
439 + return 0;
440 +}
441 +
442 +
443 +int execvpe(const char *file, char *const argv[],
444 + char *const envp[]){
445 + fprintf(stderr,"execvpeting 1 pid=%d",getpid());
446 + fflush(stderr);
447 +//
448 + return 0;
449 +}
450 +
451 +int execlp(const char *file, const char *arg, ...){
452 + fprintf(stderr,"execlpeting 1 pid=%d",getpid());
453 + fflush(stderr);
454 +//
455 + return 0;
456 +}
457 +
458 +int rexec(char **ahost, int inport, char *user,
459 + char *passwd, char *cmd, int *fd2p){
460 + fprintf(stderr,"rexec 1 pid=%d",getpid());
461 + fflush(stderr);
462 +//
463 + return 0;
464 +}
465 +
466 +int system(const char *command) {
467 + fprintf(stderr,"rexec 1 pid=%d cmd=%s",getpid(),command);
468 + fflush(stderr);
469 +
470 + return _system(command);
471 + return 0;
472 +
473 +}*/
474 +
475 +
476 +
477 +int setenv(const char *name, const char *value, int overwrite) {
478 + //printf (" CHANGING name: %s, value: %s",name,value);
479 + if(strcmp(name,"LD_PRELOAD")==0 ||
480 + strcmp(name,"LOG_SOCKET")==0) return -1;
481 + int ret=_setenv(name,value,overwrite);
482 + return ret;
483 +}
484 +
485 +//int putenv(char *string){
486 +// fprintf(stderr,"putenv 1 pid=%d cmd=%s",getpid(),string);
487 +// fflush(stderr);
488 +//
489 +// //return _system(command);
490 +// return 0;
491 +//}
492 +
493 +
494 int close(int fd) {
495 if(fd!=log_socket) {
496 return _close(fd);
497 }
498 return -1;
499 }
500 -