From ae31e19f92e717919ac8e3db9039eb38d2b89aae Mon Sep 17 00:00:00 2001 From: in2 Date: Thu, 7 Mar 2002 15:13:44 +0000 Subject: Initial revision git-svn-id: http://opensvn.csie.org/pttbbs/pttbbs/trunk/pttbbs@1 63ad8ddf-47c3-0310-b6dd-a9e9d9715204 --- util/smtest.c | 296 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 296 insertions(+) create mode 100644 util/smtest.c (limited to 'util/smtest.c') diff --git a/util/smtest.c b/util/smtest.c new file mode 100644 index 00000000..16a2360d --- /dev/null +++ b/util/smtest.c @@ -0,0 +1,296 @@ +#include +#include +#include +#include +#include +#include +#include +#include "config.h" +#include "pttstruct.h" +#include "util.h" +#include "perm.h" +#include "common.h" +#include "proto.h" + +#define WARNFILE BBSHOME "/etc/DeleteBoard.warn" +#define EXECFILE BBSHOME"/etc/DeleteBoard.exec" +#define WARNLIST BBSHOME"/etc/DeleteBoardList.warn" +#define EXECLIST BBSHOME"/etc/DeleteBoardList.exec" + +extern boardheader_t *bcache; +extern int numboards; + +boardheader_t allbrd[MAX_BOARD]; +extern userec_t xuser; + + +int LINK(char* src, char* dst){ + char cmd[200]; + + if( link(src, dst) == 0){ + return 0; + } + + sprintf(cmd, "/bin/cp -R %s %s", src, dst); + return system(cmd); +} + +int outofdate(char *hdrdate, char thedate[], int *zf) +{ + int k = 0; + char *dd; + char latestdate[6]; + int date1[2], date2[2],datetemp; + *zf = 0; + + strcpy(latestdate, thedate); + + dd = strtok(hdrdate,"/"); + if(dd == NULL) return 2; + if(dd) + k = 0; + do{ + if (*dd == '[' ){dd[strlen(dd)-1]='\0'; dd++;} + date1[k] = atoi(dd); + k++; + } while((dd=strtok(NULL,"/ "))!=NULL); + + dd = strtok(latestdate,"/"); + if(dd) + k = 0; + do{ + if (*dd == '[' ){dd[strlen(dd)-1]='\0'; dd++;} + date2[k] = atoi(dd); + k++; + } while((dd=strtok(NULL,"/ "))!=NULL); + + if(date2[0] == date1[0] && date2[1] >= date1[1]) + return 0; + + datetemp = date2[0]; + + for(k = 1;k <= 5;k++) + { + datetemp -= 1; + if((datetemp) <= 0){ + datetemp = 12; + } + if(k < 3 && datetemp == date1[0]) return 0; + if(k == 3 && datetemp == date1[0] && date2[1] <= date1[1]) return 0; + if(k == 3 && datetemp == date1[0] && date2[1] > date1[1]) return 1; + if(k == 4 && datetemp == date1[0] && date2[1] > date1[1]) return 1; + } + *zf = 1; + return 1; +} + +void mailtouser(char *bmname, char *bname, int zf) +{ + fileheader_t mymail; + char genbuf[200]; + + sprintf(genbuf, BBSHOME "/home/%c/%s", bmname[0], bmname); + stampfile(genbuf, &mymail); + strcpy(mymail.owner, "[PTT警察局]"); + + if(zf == 0){ + sprintf(mymail.title,"\033[32m [廢版警告通知]" + "\033[m %s版(BM:%s)",bname, bmname); + }else{ + sprintf(mymail.title,"\033[32m [廢版通知] " + "\033[m %s版(BM:%s)",bname, bmname); + } + mymail.savemode = 0 ; + unlink(genbuf); + if(zf == 0){ + LINK(WARNFILE, genbuf); + }else{ + LINK(EXECFILE, genbuf); + } + + sprintf(genbuf, BBSHOME "/home/%c/%s/.DIR", bmname[0], bmname); + append_record(genbuf, &mymail, sizeof(mymail)); +} + +int main() +{ + int bmid, i, j, k, rd, ood, flag, zapflag = 0,warncount = 0,execcount = 0; + char *p, *bmsname[3], fname[256], hdrdatetemp[6],thedate[6]; + char bname[32],genbuf[200]; + fileheader_t hdr; + FILE *inf, *def; + + ///// set date ////// + time_t t = time(NULL); + struct tm *tm = localtime(&t); + sprintf(thedate, "%2d/%02d", tm->tm_mon + 1, tm->tm_mday); + + ////// board ////// + + resolve_boards(); + if(passwd_mmap()) + exit(1); + memcpy(allbrd,bcache,numboards*sizeof(boardheader_t)); + + ////// write out the target file ////// + inf = fopen(WARNLIST, "w+"); + if(inf == NULL){ + printf("open file error : %s\n", WARNLIST); + exit(1); + } + + def = fopen(EXECLIST, "w+"); + if(def == NULL) + { + printf("open file error : %s\n", EXECLIST); + exit(1); + } + + ////// fprint table title ///// + fprintf(inf,"\n[廢版警告]即日起一個月內若看板" + "使用率仍然過低,則予以廢除。\n\n" + "英文版名 類別 中文版名 日期 " + " 版主名單\n\n"); + + fprintf(def,"\n[廢版公告]下列看板因使用率仍然過低,故予以廢除。\n\n" + "英文版名 類別 中文版名 日期 " + " 版主名單\n\n"); + + ////// start process ///// + j = 0 ; + for (i = 0; i < numboards; i++) { + rd = 0; + if(allbrd[i].brdname[0] == '\0') continue; + if((allbrd[i].brdattr & BRD_NOZAP) || + (allbrd[i].brdattr & BRD_GROUPBOARD) || + (allbrd[i].brdattr & BRD_WARNDEL) || + (allbrd[i].brdattr & BRD_HIDE) || + (allbrd[i].brdattr & BRD_POSTMASK) || + (allbrd[i].brdattr & BRD_VOTEBOARD) || + (allbrd[i].brdattr & BRD_BAD) || + (allbrd[i].level != 0)) continue; + + sprintf(fname, BBSHOME "/boards/%s/.DIR",allbrd[i].brdname); + + /* get date to choose junk board */ + /* exception when ood == 2 */ + flag = 30; + rd = get_num_records(fname, sizeof(fileheader_t)); + if(rd <= 30) + { + get_record(fname, &hdr, sizeof (hdr), 1); + strcpy(hdrdatetemp, hdr.date); + ood = outofdate(hdrdatetemp,thedate, &zapflag); + } + else + { + do{ + if(rd == 0) + { + ood = 0; + break; + } + get_record(fname, &hdr, sizeof (hdr), rd - flag); + strcpy(hdrdatetemp, hdr.date); + ood = outofdate(hdrdatetemp,thedate, &zapflag); + flag += 5; + }while(ood == 2 && flag < 60); + } + if(ood == 0) continue; + + warncount++; + /* print to file */ + fprintf(inf,"%-*.*s%-*.*s %-*.*s%-*.*s\n", IDLEN, IDLEN, + allbrd[i].brdname, BTLEN-26, BTLEN-26, allbrd[i].title, + IDLEN - 5, IDLEN-5,hdr.date, IDLEN * 3, IDLEN * 3, allbrd[i].BM); + + /* post warn file to each board */ + sprintf(genbuf,"~/bin/post %s [廢版警告通知]" + " [PTT警察局] %s",allbrd[i].brdname,WARNFILE); + system(genbuf); + + /* user extract to mail */ + p=strtok(allbrd[i].BM,"/ "); + if(p){ + k = 0; + do + { + if (*p == '[' ){p[strlen(p)-1]='\0'; p++;} + bmid=getuser(p); + bmsname[k] = p; + if(isalpha(allbrd[i].BM[0])&& !(xuser.userlevel &PERM_SYSOP)) + { + mailtouser(bmsname[k],allbrd[i].title, zapflag); + } + k++; + } while((p=strtok(NULL,"/ "))!=NULL); + } + /* set attribute of DeleteBoardWarn Flag */ + bcache[i].brdattr = allbrd[i].brdattr | BRD_WARNDEL; + + /* zap boards */ + if (zapflag == 1) + { + execcount++; + /* print to file */ + fprintf(def,"%-*.*s%-*.*s %-*.*s%-*.*s\n", IDLEN, IDLEN, + allbrd[i].brdname, BTLEN-26, BTLEN-26, allbrd[i].title, + IDLEN - 5, IDLEN-5,hdr.date, IDLEN * 3, IDLEN * 3, allbrd[i].BM); + +// strcpy(bname, allbrd[i].brdname); +// sprintf(genbuf, +// "/bin/tar zcvf ~/tmp/board_%s.tgz boards/%s man/%s>/dev/null 2>&1;" +// "/bin/rm -fr ~/boards/%s man/%s",bname, bname, bname, bname,bname); +// system(genbuf); + +// memset(&allbrd[i], 0, sizeof(allbrd[i])); +// sprintf(allbrd[i].title, "[%s] deleted by System", bname); +// substitute_record(fn_board, &bh, sizeof(allbrd[i]), bid); +// reset_board(bid); + } + + } + + /* post to Record, ViolateLaw */ + if(warncount > 0){ + sprintf(genbuf,"~/bin/post Record [廢版警告通知]" + " [PTT警察局] %s",WARNLIST); + system(genbuf); + sprintf(genbuf,"~/bin/post ViolateLaw [廢版警告通知]" + " [PTT警察局] %s",WARNLIST); + system(genbuf); + } + if(execcount > 0){ + sprintf(genbuf,"~/bin/post Record [廢版公告]" + " [PTT警察局] %s",EXECLIST); + system(genbuf); + sprintf(genbuf,"~/bin/post ViolateLaw [廢版公告]" + " [PTT警察局] %s",EXECLIST); + system(genbuf); + } + + +/* Below is for test only */ +/* + mailtouser("Smile","test", 1); + mailtouser("Smile","test", 0); + + strcpy(bname, "Test"); + sprintf(genbuf,"~/bin/post %s test Smile ~/etc/test.fileaaa",bname); + system(genbuf); + + + bid = getbnum(bname); + strcpy(bname,"jourslamdunk"); + sprintf(genbuf, + "/bin/tar zcvf ~/tmp/board_%s.tgz boards/%s man/%s>/dev/null 2>&1;" + "/bin/rm -fr ~/boards/%s man/%s",bname, bname, bname,bname,bname); + system(genbuf); + + memset(&bh, 0, sizeof(bh)); + sprintf(bh.title, "[%s] deleted by %s", bname,cuser.userid); + substitute_record(fn_board, &bh, sizeof(bh), bid); + reset_board(bid); +*/ + return 0; +} -- cgit v1.2.3