Rev 8185 | Rev 8342 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
10 | reyssat | 1 | /* Copyright (C) 1998-2003 XIAO, Gang of Universite de Nice - Sophia Antipolis |
2 | * |
||
3 | * This program is free software; you can redistribute it and/or modify |
||
4 | * it under the terms of the GNU General Public License as published by |
||
5 | * the Free Software Foundation; either version 2 of the License, or |
||
6 | * (at your option) any later version. |
||
7 | * |
||
8 | * This program is distributed in the hope that it will be useful, |
||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
11 | * GNU General Public License for more details. |
||
12 | * |
||
13 | * You should have received a copy of the GNU General Public License |
||
14 | * along with this program; if not, write to the Free Software |
||
15 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
||
16 | */ |
||
17 | |||
8155 | bpr | 18 | /* This file contains a routine to do housekeeping: |
19 | * it erases obsolete session directories. |
||
20 | * Regular checkup every 10 minutes or so. |
||
21 | */ |
||
8185 | bpr | 22 | #include "wimslogd.h" |
10 | reyssat | 23 | |
8155 | bpr | 24 | /* internal */ |
10 | reyssat | 25 | void _cleaning(char *di,int hardcheck) |
26 | { |
||
27 | DIR *sdir_base; |
||
28 | struct dirent *ses; |
||
29 | struct stat session_stat; |
||
30 | char session_name[MAX_LINELEN+1]; |
||
31 | |||
32 | sdir_base=opendir(di); |
||
33 | if(sdir_base==NULL) return; |
||
34 | while((ses=readdir(sdir_base))!=NULL) { |
||
35 | if(ses->d_name[0]=='.') continue; |
||
36 | snprintf(session_name,sizeof(session_name),"%s/%s", |
||
37 | di,ses->d_name); |
||
38 | if(lstat(session_name,&session_stat)) { |
||
8195 | bpr | 39 | wimslogd_error("wimslog cleaning(): session stat failure."); |
10 | reyssat | 40 | return; |
41 | } |
||
42 | if(!S_ISDIR(session_stat.st_mode)) { /* not a directory: remove it. */ |
||
43 | if(remove(session_name)<0) { |
||
8195 | bpr | 44 | wimslogd_error("wimslogd cleaning(): unable to chase squatter file."); |
10 | reyssat | 45 | return; |
46 | } |
||
47 | } |
||
8155 | bpr | 48 | /* remove idle session. */ |
10 | reyssat | 49 | else { |
50 | struct stat fst; |
||
51 | char fbuf[4096],cbuf[MAX_LINELEN+1]; |
||
52 | char *pp; |
||
53 | if(session_stat.st_mtime<nowtime-idle_time || |
||
54 | session_stat.st_mtime>nowtime+anti_time) { |
||
55 | remove: |
||
56 | if(remove_tree(session_name)!=0) { |
||
57 | if(strstr(session_name,"chroot")!=NULL) { |
||
58 | char tbuf[4096]; |
||
59 | snprintf(tbuf,sizeof(tbuf),"/%s",session_name); |
||
60 | setenv("tmp_dir",tbuf,1); |
||
61 | chmod(session_name, |
||
62 | S_IRUSR|S_IWUSR|S_IXUSR| |
||
63 | S_IRGRP|S_IWGRP|S_IXGRP| |
||
64 | S_IROTH|S_IWOTH|S_IXOTH); |
||
3836 | kbelabas | 65 | (void)chdir("public_html"); |
10 | reyssat | 66 | call_ssh(1,"bin/ch..root cleantmpdir"); |
3836 | kbelabas | 67 | (void)chdir(cwd); |
10 | reyssat | 68 | chmod(session_name,S_IRUSR|S_IWUSR|S_IXUSR); |
69 | fprintf(stderr,"%s\n",tbuf); |
||
70 | } |
||
71 | if(remove_tree(session_name)!=0) { |
||
72 | fprintf(stderr,"Unable to remove session %s: %s.\n", |
||
73 | session_name,strerror(errno)); |
||
74 | } |
||
75 | } |
||
76 | continue; |
||
77 | } |
||
78 | if(hardcheck==2) { |
||
79 | char dbuf[MAX_FNAME+1]; |
||
80 | struct dirent *s2d; |
||
81 | struct stat fst; |
||
82 | int t; |
||
83 | DIR *s2D; |
||
84 | snprintf(dbuf,sizeof(dbuf),"%s/%s",sesd,ses->d_name); |
||
85 | if(ftest(dbuf)!=is_dir) goto remove; |
||
86 | s2D=opendir(session_name); |
||
87 | if(sdir_base==NULL) goto remove; |
||
88 | while((s2d=readdir(s2D))!=NULL) { /* remove individual files */ |
||
89 | snprintf(dbuf,sizeof(dbuf),"%s/%s",session_name,s2d->d_name); |
||
90 | t=stat(dbuf,&fst); |
||
91 | if(t==0 && fst.st_mtime<nowtime-INS_DELAY && |
||
92 | fst.st_mtime>=nowtime+anti_time) remove(dbuf); |
||
93 | } |
||
94 | closedir(s2D); |
||
95 | continue; |
||
96 | } |
||
97 | if(!hardcheck || strchr(session_name,'_')!=NULL) continue; |
||
98 | if(session_stat.st_mtime>=nowtime-idle_time3 && |
||
99 | session_stat.st_mtime<nowtime+anti_time) continue; |
||
100 | snprintf(fbuf,sizeof(fbuf),"%s/var.stat",session_name); |
||
101 | if(stat(fbuf,&fst)==0) continue; |
||
102 | accessfile(cbuf,"r","%s/var",session_name); |
||
103 | if(cbuf[0]==0) goto remove; /* no var file */ |
||
104 | pp=strstr(cbuf,"\nw_wims_ismanager="); |
||
105 | if(pp!=NULL) { |
||
106 | pp+=strlen("\nw_wims_ismanager="); |
||
107 | if(*pp>'0' && *pp<='9') continue; |
||
108 | } |
||
109 | if(session_stat.st_mtime<nowtime-idle_time2 || |
||
110 | session_stat.st_mtime>nowtime+anti_time) goto remove; |
||
111 | if(session_stat.st_mtime<nowtime-idle_time3 && |
||
112 | strstr(cbuf,"\nwims_new_session=yes\n")!=NULL) goto remove; |
||
113 | /* popup session: 50 sec only. */ |
||
114 | if(session_stat.st_mtime<nowtime-50 && |
||
115 | strstr(cbuf,"\nw_wims_mode=popup\n")!=NULL) goto remove; |
||
116 | } |
||
117 | } |
||
118 | closedir(sdir_base); |
||
119 | } |
||
120 | |||
8155 | bpr | 121 | /* Clean obsolete session directories. */ |
10 | reyssat | 122 | void cleaning(int withmain) |
123 | { |
||
124 | struct stat lastclean_stat; |
||
125 | pid_t pid; |
||
126 | char lastclean_name[MAX_FNAME+1]; |
||
127 | FILE *lastclean; |
||
8155 | bpr | 128 | /* Active only if idle_time>0 */ |
10 | reyssat | 129 | if(idle_time<=0) return; |
8155 | bpr | 130 | /* when is last clean? */ |
10 | reyssat | 131 | if(lastcleantime>nowtime-300) return; |
132 | mystrncpy(lastclean_name,"tmp/log/lastclean",sizeof(lastclean_name)); |
||
133 | if(stat(lastclean_name,&lastclean_stat)==0 && |
||
134 | lastclean_stat.st_mtime>nowtime-300 && |
||
135 | lastclean_stat.st_mtime<nowtime+100) return; |
||
136 | fflush(NULL); |
||
137 | pid=fork(); if(pid>0) {addfork(pid,0); return;} |
||
138 | close(commsock); |
||
139 | if(withmain) _cleaning(sesd,1); |
||
140 | _cleaning("s2",2); |
||
141 | _cleaning("tmp/sessions",0); |
||
142 | _cleaning("chroot/tmp/sessions",0); |
||
8155 | bpr | 143 | /* touch lastclean file */ |
10 | reyssat | 144 | lastclean=fopen(lastclean_name,"w"); fclose(lastclean); |
145 | lastcleantime=nowtime; |
||
146 | snprintf(lastclean_name,sizeof(lastclean_name),"%s/trap.check",tmpd); |
||
147 | if(stat(lastclean_name,&lastclean_stat)==0 && |
||
148 | (lastclean_stat.st_mtime<nowtime-3600 || |
||
149 | lastclean_stat.st_mtime>nowtime+anti_time)) unlink(lastclean_name); |
||
150 | exit(0); |
||
151 | } |
||
152 |