Subversion Repositories wimsdev

Rev

Rev 18514 | 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
{
12474 bpr 27
  DIR *sdir_base;
28
  struct dirent *ses;
29
  struct stat session_stat;
30
  char session_name[MAX_LINELEN+1];
10 reyssat 31
 
12474 bpr 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",di,ses->d_name);
37
    if(lstat(session_name,&session_stat)) {
38
      wimslogd_error("wimslog cleaning(): session stat failure.");
39
      return;
40
    }
41
    if(!S_ISDIR(session_stat.st_mode)) { /* not a directory: remove it. */
42
      if(remove(session_name)<0) {
43
        wimslogd_error("wimslogd cleaning(): unable to chase squatter file.");
44
        return;
8849 bpr 45
      }
12474 bpr 46
    }
47
    /* remove idle session. */
48
  else {
49
    char fbuf[4096],cbuf[MAX_LINELEN+1];
50
    char *pp;
18509 czzmrn 51
    /* remove session inactive for more than idle_time seconds */
12474 bpr 52
    if(session_stat.st_mtime<nowtime-idle_time ||
53
        session_stat.st_mtime>nowtime+anti_time) {
54
      remove:
55
      if(remove_tree(session_name)!=0) {
56
        if(strstr(session_name,"chroot")!=NULL) {
57
          char tbuf[4096];
58
          snprintf(tbuf,sizeof(tbuf),"/%s",session_name);
59
          setenv("tmp_dir",tbuf,1);
60
          chmod(session_name,
61
                S_IRUSR|S_IWUSR|S_IXUSR|
62
                S_IRGRP|S_IWGRP|S_IXGRP|
63
                S_IROTH|S_IWOTH|S_IXOTH);
64
          (void)chdir("public_html");
65
          call_ssh(1,"bin/ch..root cleantmpdir");
66
          (void)chdir(cwd);
67
          chmod(session_name,S_IRUSR|S_IWUSR|S_IXUSR);
68
          fprintf(stderr,"%s\n",tbuf);
69
        }
70
        if(remove_tree(session_name)!=0) {
71
          fprintf(stderr,"Unable to remove session %s: %s.\n",
72
                 session_name,strerror(errno));
73
        }
8849 bpr 74
      }
12474 bpr 75
      continue;
76
    }
77
    if(hardcheck==2) {
78
      char dbuf[MAX_FNAME+1];
79
      struct dirent *s2d;
80
      struct stat fst;
81
      int t;
82
      DIR *s2D;
83
      snprintf(dbuf,sizeof(dbuf),"%s/%s",sesd,ses->d_name);
84
      if(ftest(dbuf)!=is_dir) goto remove;
85
      s2D=opendir(session_name);
86
      if(sdir_base==NULL) goto remove;
87
      while((s2d=readdir(s2D))!=NULL) { /* remove individual files */
88
        snprintf(dbuf,sizeof(dbuf),"%s/%s",session_name,s2d->d_name);
89
        t=stat(dbuf,&fst);
90
        if(t==0 && fst.st_mtime<nowtime-INS_DELAY &&
91
               fst.st_mtime>=nowtime+anti_time) remove(dbuf);
8849 bpr 92
      }
12474 bpr 93
      closedir(s2D);
94
      continue;
10 reyssat 95
    }
18509 czzmrn 96
    /* keep sessions with _ in name unless hardcheck */
12474 bpr 97
    if(!hardcheck || strchr(session_name,'_')!=NULL) continue;
18509 czzmrn 98
    /* keep very new sessions (inactive for less than idle_time3 seconds) */
12474 bpr 99
    if(session_stat.st_mtime>=nowtime-idle_time3 &&
100
       session_stat.st_mtime<nowtime+anti_time) continue;
18509 czzmrn 101
    /* for sessions inactive for more than idle_time3 seconds,
18515 czzmrn 102
       keep session if var.stat file exists and wims_user or wims_developer variable is defined
18510 czzmrn 103
    */
12474 bpr 104
    snprintf(fbuf,sizeof(fbuf),"%s/var.stat",session_name);
18510 czzmrn 105
    wlogdaccessfile(fbuf,"r","%s/var.stat",session_name);
18515 czzmrn 106
    if(fbuf[0]!= 0 && (strstr(fbuf,"wims_user=")!=NULL || strstr(fbuf,"wims_developer=")!=NULL)) continue;
18509 czzmrn 107
    /* sessions with no var.stat file, chech var file */
12474 bpr 108
    wlogdaccessfile(cbuf,"r","%s/var",session_name);
18509 czzmrn 109
    if(cbuf[0]==0) goto remove;      /* no var file, remove */
110
    /* keep manager sessions */
12474 bpr 111
    pp=strstr(cbuf,"\nw_wims_ismanager=");
112
    if(pp!=NULL) {
113
      pp+=strlen("\nw_wims_ismanager=");
114
      if(*pp>'0' && *pp<='9') continue;
115
    }
18509 czzmrn 116
    /* remove session inactive for more than idle_time2 seconds */
12474 bpr 117
    if(session_stat.st_mtime<nowtime-idle_time2 ||
118
        session_stat.st_mtime>nowtime+anti_time) goto remove;
18509 czzmrn 119
    /* remove unused sessions */
12474 bpr 120
    if(session_stat.st_mtime<nowtime-idle_time3 &&
121
        strstr(cbuf,"\nwims_new_session=yes\n")!=NULL) goto remove;
18509 czzmrn 122
         /* remove popup session: 50 sec only. */
12474 bpr 123
    if(session_stat.st_mtime<nowtime-50 &&
124
        strstr(cbuf,"\nw_wims_mode=popup\n")!=NULL) goto remove;
125
    }
126
  }
127
  closedir(sdir_base);
10 reyssat 128
}
129
 
8155 bpr 130
/* Clean obsolete session directories. */
10 reyssat 131
void cleaning(int withmain)
132
{
12474 bpr 133
  struct stat lastclean_stat;
134
  pid_t pid;
135
  char lastclean_name[MAX_FNAME+1];
136
  FILE *lastclean;
137
  /* Active only if idle_time>0 */
138
  if(idle_time<=0) return;
139
  /* when is last clean? */
140
  if(lastcleantime>nowtime-300) return;
141
  mystrncpy(lastclean_name,"tmp/log/lastclean",sizeof(lastclean_name));
142
  if(stat(lastclean_name,&lastclean_stat)==0 &&
143
      lastclean_stat.st_mtime>nowtime-300 &&
144
      lastclean_stat.st_mtime<nowtime+100) return;
145
  fflush(NULL);
146
  pid=fork(); if(pid>0) {addfork(pid,0); return;}
147
  close(commsock);
148
  if(withmain) _cleaning(sesd,1);
149
  _cleaning("s2",2);
150
  _cleaning("tmp/sessions",0);
151
  _cleaning("chroot/tmp/sessions",0);
152
  /* touch lastclean file */
153
  lastclean=fopen(lastclean_name,"w"); fclose(lastclean);
154
  lastcleantime=nowtime;
155
  snprintf(lastclean_name,sizeof(lastclean_name),"%s/trap.check",tmpd);
156
  if(stat(lastclean_name,&lastclean_stat)==0 &&
157
      (lastclean_stat.st_mtime<nowtime-3600 ||
8849 bpr 158
      lastclean_stat.st_mtime>nowtime+anti_time)) unlink(lastclean_name);
12474 bpr 159
  exit(0);
10 reyssat 160
}