精華區beta SetupBBS 關於我們 聯絡資訊
/*-------------------------------------------------------*/ /* util/account.c ( NTHU CS MapleBBS Ver 2.36 ) */ /*-------------------------------------------------------*/ /* target : 上站人次統計、系統資料備份 */ /* create : 95/03/29 */ /* update : 95/12/15 */ /*-------------------------------------------------------*/ #include "bbs.h" #include <time.h> #include <sys/ipc.h> #include <sys/shm.h> #define _BBS_UTIL_C_ #include "record.c" #define MAX_LINE 16 #define ADJUST_M 6 /* adjust back 5 minutes */ /* Ptt about share memory */ struct UCACHE *uidshm; struct PTTCACHE *ptt; struct FROMCACHE *fcache; static void attach_err(shmkey, name) int shmkey; char *name; { fprintf(stderr, "[%s error] key = %x\n", name, shmkey); exit(1); } static void * attach_shm(shmkey, shmsize) int shmkey, shmsize; { void *shmptr; int shmid; shmid = shmget(shmkey, shmsize, 0); if (shmid < 0) { shmid = shmget(shmkey, shmsize, IPC_CREAT | 0600); if (shmid < 0) attach_err(shmkey, "shmget"); shmptr = (void *) shmat(shmid, NULL, 0); if (shmptr == (void *) -1) attach_err(shmkey, "shmat"); memset(shmptr, 0, shmsize); } else { shmptr = (void *) shmat(shmid, NULL, 0); if (shmptr == (void *) -1) attach_err(shmkey, "shmat"); } return shmptr; } void resolve_ucache() { if (uidshm == NULL) { uidshm = attach_shm(UIDSHM_KEY, sizeof(*uidshm)); } } void reset_garbage() { int n; if (ptt == NULL) { ptt = attach_shm(PTTSHM_KEY, sizeof(*ptt)); if (ptt->touchtime == 0) ptt->touchtime = 1; } printf("\n動態看板數[%d]\n",ptt->max_film ); /* for(n=0;n<=ptt->max_film;n++) printf("\n (%d) %s \n",n,ptt->notes[n]); */ ptt->uptime =0; } void resolve_fcache() { if (fcache == NULL) { fcache = attach_shm(FROMSHM_KEY, sizeof(*fcache)); if (fcache->touchtime == 0) fcache->touchtime = 1; } fcache->uptime =0; } void keeplog(fpath, board, title) char *fpath; char *board; char *title; { fileheader fhdr; char genbuf[256],buf[256]; char *flog; if(!board) board = "Record"; sprintf(genbuf, "boards/%s", board); stampfile(genbuf, &fhdr); sprintf(buf,"mv %s %s",fpath, genbuf); system(buf); /* printf("keep record:[%s][%s][%s][%s]\n",fpath, board, title,genbuf); */ strcpy(fhdr.title, title); strcpy(fhdr.owner, "[歷史老師]"); sprintf(genbuf, "boards/%s/.DIR", board); append_record(genbuf, &fhdr, sizeof(fhdr)); } void outs(fp, buf, mode) FILE *fp; char buf[], mode; { static char state = '0'; if (state != mode) fprintf(fp, "%cm", state = mode); if (buf[0]) { fprintf(fp, buf); buf[0] = 0; } } void gzip(source, target, stamp) char *source, *target, *stamp; { char buf[128]; sprintf(buf, "/bin/gzip -f9n adm/%s%s", target, stamp); rename(source, &buf[14]); system(buf); } main() { int hour, max, item, total, i, j,mo,da,max_user=0,max_login=0,max_reg=0,mahour,k; char *act_file = ".act"; char *log_file = "usies"; char buf[256],buf1[256], *p; FILE *fp,*fp1; int act[27]; /* 次數/累計時間/pointer */ time_t now; struct tm *ptime; now = time(NULL) - ADJUST_M * 60; /* back to ancent */ ptime = localtime(&now); memset(act, 0, sizeof(act)); printf("次數/累計時間\n"); if ((ptime->tm_hour != 0) && (fp = fopen(act_file, "r"))) { fread(act, sizeof(act), 1, fp); fclose(fp); } if ((fp = fopen(log_file, "r")) == NULL) { printf("cann't open usies\n"); return 1; } if (act[26]) fseek(fp, act[26], 0); while (fgets(buf, 256, fp)) { hour = atoi(buf + 9); if (hour < 0 || hour > 23) { continue; } if (!strncmp(buf + 22, "ENTER", 5)) { act[hour]++; continue; } if (p = (char *) strstr(buf + 40, "Stay:")) { if (hour = atoi(p + 5)) { act[24] += hour; act[25]++; } continue; } } act[26] = ftell(fp); fclose(fp); for (i = max = total = 0; i < 24; i++) { total += act[i]; if (act[i] > max) { max_user = max = act[i]; mahour = i; } } item = max / MAX_LINE + 1; if (!ptime->tm_hour) keeplog("etc/today", "Record", "上站人次統計"); if ((fp = fopen("etc/today", "w")) == NULL) { printf("cann't open etc/today\n"); return 1; } fprintf(fp, "\t\t\t;33;46m 每小時上站人次統計 [%02d/%02d/%02d] 0m\n\n", ptime->tm_year, ptime->tm_mon + 1, ptime->tm_mday); for (i = MAX_LINE + 1; i > 0; i--) { strcpy(buf, " "); for (j = 0; j < 24; j++) { max = item * i; hour = act[j]; if (hour && (max > hour) && (max - item <= hour)) { outs(fp, buf, '3'); fprintf(fp, "%-3d", hour); } else if (max <= hour) { outs(fp, buf, '1'); fprintf(fp, "█ "); } else strcat(buf, " "); } fprintf(fp, "\n"); } fprintf(fp, " 2m" "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23\n\n" "\t\t4m總共上站人次:7m%-9d4m平均使用人數:7m%d0;0m \n",total, total/24); fclose(fp); if (fp = fopen(act_file, "w")) { fwrite(act, sizeof(act), 1, fp); fclose(fp); } /* -------------------------------------------------------------- */ sprintf(buf, "-%02d%02d%02d", ptime->tm_year, ptime->tm_mon + 1, ptime->tm_mday); now += ADJUST_M * 60; /* back to future */ /* Ptt 歷史事件處理 */ if(fp = fopen("etc/history.data","r")) { /*最多同時上線*/ if(fscanf(fp,"%d %d %d %d",&max_login,&max,&max_reg,&k)) { int a; resolve_fcache(); printf("此時段最多同時上線:%d 過去:%d\n",a=fcache->max_user,k); fclose(fp); if(a > k) { ptime=localtime(&fcache->max_time); if(fp1=fopen("etc/history", "a")) { fprintf(fp1, "◎ 【%02d/%02d/%02d %02d:%02d】" "2m同時在坊內人數m首次達到 ;36m%dm 人次\n", ptime->tm_mon+1, ptime->tm_mday, ptime->tm_year, ptime->tm_hour,ptime->tm_min,a); fclose(fp1); } if(fp=fopen("etc/history.data","w")) { fprintf(fp,"%d %d %d %d",max_login,max,max_reg,a); fclose(fp); } } } else fclose(fp); } ptime = localtime(&now); if(ptime->tm_hour) { printf("多個節日處理\n"); /* Ptt 多個節日處理 */ if(fp1 = fopen("etc/today_is","r")); { char tod[20][100]; for(i=0;fgets(tod[i],20,fp1) && i<100;i++); fclose(fp1); fp1 = fopen("etc/today_is","w"); for(j=1;j<=i;j++) { fputs(tod[j%i],fp1); } fclose(fp1); } } if(!ptime->tm_hour) { keeplog(".note", "Record", "心情留言版"); system("/bin/cp etc/today etc/yesterday"); /* system("rm -f note.dat");*/ /* Ptt */ sprintf(buf1,"[公安報告] 使用者上線監控 [%02d/%02d:%02d]" ,ptime->tm_mon+1,ptime->tm_mday,ptime->tm_hour); keeplog("usies", "Security", buf1); printf("[公安報告] 使用者上線監控\n"); gzip(log_file, "usies", buf); printf("壓縮使用者上線監控\n"); /* Ptt 歷史事件處理 */ now = time(NULL) - ADJUST_M * 60; /* back to ancent */ ptime = localtime(&now); resolve_ucache(); if(fp = fopen("etc/history.data","r")) { /* 單日最多次人次,同時上線,註冊*/ if(fscanf(fp,"%d %d %d %d",&max_login,&max,&max_reg,&k)) { fp1 = fopen("etc/history","r+"); fseek(fp1,0,2); if ( max_user > max ) { fprintf(fp1,"◇ 【%02d/%02d/%02d %02d】 " ";32m單一小時上線人次m首次達到 ;35m%dm 人次 \n" ,ptime->tm_mon+1,ptime->tm_mday,ptime->tm_year,mahour,max_user); max = max_user; } if ( total > max_login ) { fprintf(fp1,"◆ 【%02d/%02d/%02d】 " ";32m單日上線人次m首次達到;33m %dm 人次 \n" ,ptime->tm_mon+1,ptime->tm_mday,ptime->tm_year,total); max_login = total; } if ( uidshm->number > max_reg + max_reg/10) { fprintf(fp1,"★ 【%02d/%02d/%02d】 " ";32m總註冊人數m提升到;31m %dm 人 \n" ,ptime->tm_mon+1,ptime->tm_mday,ptime->tm_year,uidshm->number); max_reg = uidshm->number; } fclose(fp1); } fclose(fp); fp = fopen("etc/history.data","w"); fprintf(fp,"%d %d %d %d",max_login,max,max_reg,k); fclose(fp); } now += ADJUST_M * 60; /* back to future */ ptime = localtime(&now); /* Ptt 節日處理 */ printf("節日處理\n"); i=0; if(fp1 = fopen("etc/today_is","w")) { if(fp = fopen("etc/feast","r")) { while (fgets(buf1,100,fp)) { if(buf[1] != '#' && sscanf(buf1,"%d %d ",&mo,&da)==2) { /* printf("%d %d [%s]",mo,da,&buf1[6]);*/ if(ptime->tm_mday == da && ptime->tm_mon + 1 == mo) { i =1; fprintf(fp1,"%-14s",&buf1[6]); } } } fclose(fp); } printf("節日處理1\n"); if(i==0) { if(fp = fopen("etc/today_boring","r")) { while (fgets(buf1,250,fp)) { if(strlen(buf)>3) { fprintf(fp1,"%s",buf1); } } fclose(fp); } else { fprintf(fp1,"本日節日徵求中"); } } fclose(fp1); } /* Ptt 歡迎畫面處理 */ printf("歡迎畫面處理\n"); if(fp = fopen("etc/Welcome.date","r")) { char temp[50]; while (fscanf(fp,"%d %d %s\n",&mo,&da,buf1) != EOF) { if(ptime->tm_mday == da && ptime->tm_mon + 1 == mo) { strcpy(temp,buf1); sprintf(buf1,"cp -f etc/Welcomes/%s etc/Welcome",temp); system(buf1); break; } } fclose(fp); } printf("歡迎畫面處理\n"); if (ptime->tm_wday == 0) { keeplog("etc/week", "Record", "本週熱門話題"); gzip("bbslog", "bntplink", buf); gzip("innd/bbslog", "innbbsd", buf); gzip("etc/mailog", "mailog", buf); } if (ptime->tm_mday == 1) keeplog("etc/month", "Record", "本月熱門話題"); if (ptime->tm_yday == 1) keeplog("etc/year", "Record", "年度熱門話題"); } else if (ptime->tm_hour == 3 && ptime->tm_wday == 6) { char *fn1 = "tmp"; char *fn2 = "suicide"; rename(fn1, fn2); mkdir(fn1, 0755); sprintf(buf, "/bin/gtar cfz adm/%s-%02d%02d%02d.tgz %s", fn2, ptime->tm_year, ptime->tm_mon + 1, ptime->tm_mday, fn2); system(buf); sprintf(buf, "/bin/rm -fr %s", fn2); system(buf); } /* Ptt reset Ptt's share memory */ reset_garbage(); }