Subversion Repositories wimsdev

Rev

Rev 3836 | Go to most recent revision | Details | 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
 
18
        /* This file contains a routine to do housekeeping:
19
         * it erases obsolete session directories.
20
         * Regular checkup every 10 minutes or so. */
21
 
22
        /* internal */
23
void _cleaning(char *di,int hardcheck)
24
{
25
    DIR *sdir_base;
26
    struct dirent *ses;
27
    struct stat session_stat;
28
    char session_name[MAX_LINELEN+1];
29
 
30
    sdir_base=opendir(di);
31
    if(sdir_base==NULL) return;
32
    while((ses=readdir(sdir_base))!=NULL) {
33
        if(ses->d_name[0]=='.') continue;
34
        snprintf(session_name,sizeof(session_name),"%s/%s",
35
                 di,ses->d_name);
36
        if(lstat(session_name,&session_stat)) {
37
            error("wimslog cleaning(): session stat failure.");
38
            return;
39
        }
40
        if(!S_ISDIR(session_stat.st_mode)) { /* not a directory: remove it. */
41
            if(remove(session_name)<0) {
42
                error("wimslogd cleaning(): unable to chase squatter file.");
43
                return;
44
            }
45
        }
46
            /* remove idle session. */
47
        else {
48
            struct stat fst;
49
            char fbuf[4096],cbuf[MAX_LINELEN+1];
50
            char *pp;
51
            if(session_stat.st_mtime<nowtime-idle_time ||
52
               session_stat.st_mtime>nowtime+anti_time) {
53
                remove:
54
                if(remove_tree(session_name)!=0) {
55
                    if(strstr(session_name,"chroot")!=NULL) {
56
                        char tbuf[4096];
57
                        snprintf(tbuf,sizeof(tbuf),"/%s",session_name);
58
                        setenv("tmp_dir",tbuf,1);
59
                        chmod(session_name,
60
                              S_IRUSR|S_IWUSR|S_IXUSR|
61
                              S_IRGRP|S_IWGRP|S_IXGRP|
62
                              S_IROTH|S_IWOTH|S_IXOTH);
63
                        chdir("public_html");
64
                        call_ssh(1,"bin/ch..root cleantmpdir");
65
                        chdir(cwd);
66
                        chmod(session_name,S_IRUSR|S_IWUSR|S_IXUSR);
67
                        fprintf(stderr,"%s\n",tbuf);
68
                    }
69
                    if(remove_tree(session_name)!=0) {
70
                        fprintf(stderr,"Unable to remove session %s: %s.\n",
71
                                session_name,strerror(errno));
72
                    }
73
                }
74
                continue;
75
            }
76
            if(hardcheck==2) {
77
                char dbuf[MAX_FNAME+1];
78
                struct dirent *s2d;
79
                struct stat fst;
80
                int t;
81
                DIR *s2D;
82
                snprintf(dbuf,sizeof(dbuf),"%s/%s",sesd,ses->d_name);
83
                if(ftest(dbuf)!=is_dir) goto remove;
84
                s2D=opendir(session_name);
85
                if(sdir_base==NULL) goto remove;
86
                while((s2d=readdir(s2D))!=NULL) { /* remove individual files */
87
                    snprintf(dbuf,sizeof(dbuf),"%s/%s",session_name,s2d->d_name);
88
                    t=stat(dbuf,&fst);
89
                    if(t==0 && fst.st_mtime<nowtime-INS_DELAY &&
90
                       fst.st_mtime>=nowtime+anti_time) remove(dbuf);
91
                }
92
                closedir(s2D);
93
                continue;
94
            }
95
            if(!hardcheck || strchr(session_name,'_')!=NULL) continue;
96
            if(session_stat.st_mtime>=nowtime-idle_time3 &&
97
               session_stat.st_mtime<nowtime+anti_time) continue;
98
            snprintf(fbuf,sizeof(fbuf),"%s/var.stat",session_name);
99
            if(stat(fbuf,&fst)==0) continue;
100
            accessfile(cbuf,"r","%s/var",session_name);
101
            if(cbuf[0]==0) goto remove; /* no var file */
102
            pp=strstr(cbuf,"\nw_wims_ismanager=");
103
            if(pp!=NULL) {
104
                pp+=strlen("\nw_wims_ismanager=");
105
                if(*pp>'0' && *pp<='9') continue;
106
            }
107
            if(session_stat.st_mtime<nowtime-idle_time2 ||
108
               session_stat.st_mtime>nowtime+anti_time) goto remove;
109
            if(session_stat.st_mtime<nowtime-idle_time3 &&
110
               strstr(cbuf,"\nwims_new_session=yes\n")!=NULL) goto remove;
111
                /* popup session: 50 sec only. */
112
            if(session_stat.st_mtime<nowtime-50 &&
113
               strstr(cbuf,"\nw_wims_mode=popup\n")!=NULL) goto remove;
114
        }
115
    }
116
    closedir(sdir_base);
117
}
118
 
119
        /* Clean obsolete session directories. */
120
void cleaning(int withmain)
121
{
122
    struct stat lastclean_stat;
123
    pid_t pid;
124
    char lastclean_name[MAX_FNAME+1];
125
    FILE *lastclean;
126
        /* Active only if idle_time>0 */
127
    if(idle_time<=0) return;
128
        /* when is last clean? */
129
    if(lastcleantime>nowtime-300) return;
130
    mystrncpy(lastclean_name,"tmp/log/lastclean",sizeof(lastclean_name));
131
    if(stat(lastclean_name,&lastclean_stat)==0 &&
132
       lastclean_stat.st_mtime>nowtime-300 &&
133
       lastclean_stat.st_mtime<nowtime+100) return;
134
    fflush(NULL);
135
    pid=fork(); if(pid>0) {addfork(pid,0); return;}
136
    close(commsock);
137
    if(withmain) _cleaning(sesd,1);
138
    _cleaning("s2",2);
139
    _cleaning("tmp/sessions",0);
140
    _cleaning("chroot/tmp/sessions",0);
141
        /* touch lastclean file */
142
    lastclean=fopen(lastclean_name,"w"); fclose(lastclean);
143
    lastcleantime=nowtime;
144
    snprintf(lastclean_name,sizeof(lastclean_name),"%s/trap.check",tmpd);
145
    if(stat(lastclean_name,&lastclean_stat)==0 &&
146
       (lastclean_stat.st_mtime<nowtime-3600 ||
147
        lastclean_stat.st_mtime>nowtime+anti_time)) unlink(lastclean_name);
148
    exit(0);
149
}
150