Metropoli BBS
VIEWER: expire.c MODE: TEXT (ASCII)
/*
 * This part was written by Harald Kipp
 *
 * Bug reports should be sent to
 *
 *  harald@os2point.ping.de
 *  harald@sesam.com
 *  Fido: 2:2448/434
 *
 * This module contains routines to read the configuration file.
 *
 */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>

#include <version.h>
#include <lprintf.h>
#include <getopt.h>
#include <chanlib.h>
#include <readcfg.h>

#include "config.h"
#include "expire.h"

long arts_deleted = 0;
long arts_kept = 0;
long bytes_deleted = 0;
long bytes_kept = 0;
long ids_deleted = 0;
long ids_kept = 0;


static CFGITEM cfgitm[] = {
    { "access"    , 0, 4, NULL               },
    { "actimes"   , 0, 4, NULL               },
    { "active"    , 0, 4, cfg.activefile     },
    { "control"   , 0, 4, NULL               },
    { "dupegroup" , 0, 4, NULL               },
    { "gunzip"    , 0, 4, NULL               },
    { "history"   , 0, 4, cfg.historyfile    },
    { "inews"     , 0, 4, NULL               },
    { "junkgroup" , 0, 4, NULL               },
    { "mydomain"  , 0, 4, NULL               },
    { "mynode"    , 0, 4, NULL               },
    { "newsdir"   , 0, 4, cfg.newsdir        },
    { "newsserver", 0, 4, NULL               },
    { "rnews"     , 0, 4, NULL               },
    { "spooldir"  , 0, 4, NULL               },
    { "uncompress", 0, 4, NULL               }
};

static void usage(void);

/************************************************************************/
/*                                                                      */
/*  EXPIRE                                                              */
/*                                                                      */
/************************************************************************/
int main(int argc, char **argv)
{
    int result = 0;
    int option;
    char *cp;
    time_t t_proc = time(NULL);
    time_t expire_time = time(NULL);

    /*
     * Set up initial configuration
     */
    init_cfg();

    /*
     * Initialize exit proc
     */
    initexit();

    /*
     * Open log file
     */
    lopen(cfg.logfile);
    lprintf("Expire %s - %s", version, __TIMESTAMP__);

    /*
     * Process command line options
     */
    while((option = getopt(argc, argv, "?hiIra:c:d:e:E:n:y:")) != EOF) {
        switch(option) {
        case 'a':
            strcpy(cfg.activefile, optarg);
            break;
        case 'c':
            strcpy(cfg.configfile, optarg);
            break;
        case 'd':
            cp = optarg;
            while(*cp) {
                switch(*cp) {
                case 'e':
                    cfg.logflg |= LOG_EXPIRE;
                    break;
                case 'f':
                    cfg.logflg |= LOG_FLUSH;
                    lflush(1);
                    break;
                case 't':
                    cfg.logflg |= LOG_TESTMODE;
                    printf("- Testmode -\n");
                    break;
                default:
                    lprintf("Unknown option -d%c ignored", *cp);
                    break;
                }
                cp++;
            }
            break;
        case 'e':
            cfg.expiredays = atoi(optarg);
            break;
        case 'E':
            cfg.forgetdays = atoi(optarg);
            break;
        case 'h':       /* ignore history */
            cfg.nohistory = 1;
            break;
        case 'I':       /* Ignore any existing expiration date */
            cfg.ignorexp = 2;
            break;
        case 'i':       /* Ignore any existing expiration date */
            cfg.ignorexp = 1;
            break;
        case 'n':
            strcpy(cfg.newsdir, optarg);
            break;
        case 'r':       /* rebuild history file */
            cfg.dorebuild = 1;
            cfg.nohistory = 1;
            break;
        case 'y':
            strcpy(cfg.historyfile, optarg);
            break;

        default:
            lprintf("Unknown option -%c", option);
            printf("Unknown option -%c\n", option);
        case '?':
            usage();
            return(1);
        }
    }

    /*
     * All command line options are processed, check if one
     * argument is left to give us a list of newsgroups.
     */
    argc -= optind;
    argv += optind;
    if(argc)
        strcpy(cfg.groups, argv[0]);

    ReadCfg(cfg.configfile, cfgitm, sizeof(cfgitm) / sizeof(CFGITEM));
    if(validate_cfg()) {
        lprintf("Purging %s received before %.*s GMT",
                *(cfg.groups) ? cfg.groups : "all",
                strlen(ctime(&cfg.expiretime)) - 1,
                ctime(&cfg.expiretime));
        if(cfg.expiretime > cfg.forgettime)
            lprintf("Remember articles received before %.*s GMT",
                    strlen(ctime(&cfg.forgettime)) - 1,
                    ctime(&cfg.forgettime));
        if(cfg.nohistory) {
            if(PurgeByActive() || DOLOG(LOG_TESTMODE) || cfg.dorebuild)
                UpdateActive();
        }
        else if(PurgeByHistory() || DOLOG(LOG_TESTMODE) || cfg.dorebuild)
            UpdateActive();
    }
    else
        result = 3;

    if(result)
        lprintf("Expire returned error %d", result);
    else {
        t_proc = time(NULL) - t_proc;
        lprintf("Articles deleted: %10lu", arts_deleted);
        lprintf("Articles kept   : %10lu", arts_kept);
        lprintf("Bytes deleted   : %10lu", bytes_deleted);
        lprintf("Bytes kept      : %10lu", bytes_kept);
        lprintf("Ids deleted     : %10lu", ids_deleted);
        lprintf("Ids kept        : %10lu", ids_kept);
        lprintf("Expire processed %lu ids in %lu second(s)",
                ids_deleted + ids_kept, t_proc);
    }
    lclose();

    return(result);
}

/************************************************************************/
/*                                                                      */
/************************************************************************/
static void usage(void)
{
    puts("usage: expire [options] [newsgroups]\n\n"
         "  newsgroups is a comma separated list of groups, which may\n"
         "             include '!', '*', '?' and '[...]'\n\n"
         "options:\n"
         "  -a<filename>   active file             -h ignore history\n"
         "  -c<filename>   configuration file      -i ignore expire lines\n"
         "  -e<days>       expire time             -r rebuild\n"
         "  -E<days>       forget time\n"
         "  -n<directory>  news directory\n"
         "  -y<filename>   history filename\n\n"
         "logfile flags:\n"
         "  e  log expiration progress\n"
         "  f  flush logfile after each line\n"
         "  t  test mode, do not really expire");
    lprintf("Expire usage displayed");
    lclose();
}
[ RETURN TO DIRECTORY ]