home *** CD-ROM | disk | FTP | other *** search
/ Netscape Plug-Ins Developer's Kit / Netscape_Plug-Ins_Developers_Kit.iso / SOFTWARE / getstats / statform.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-05-14  |  6.5 KB  |  186 lines

  1. /*
  2.  * This file is part of the Webmaster's Starter Kit Bootstrap Programs
  3.  *
  4.  * Copyright 1994 by Enterprise Integration Technologies Corporation
  5.  *
  6.  * This is freeware with commercialization rights reserved; see the
  7.  * LICENSE included in the distribution for specifics.
  8.  *
  9.  * based on the statform 1.0 program by Brian Behlendorf, gw@wired.com
  10.  * and Kevin Hughes, kevinh@eit.com
  11.  *
  12.  * IN ORDER TO COMPILE THIS YOU WILL NEED THE LIBCGI LIBRARY,
  13.  * available at ftp://ftp.eit.com/pub/wsk/test/libcgi/
  14.  */
  15.  
  16. #include <stdio.h>
  17. #include <unistd.h>
  18. #include <stdlib.h>
  19. #include <string.h>
  20. #include "../../libcgi/cgi.h"
  21.  
  22. #define SUBJECT "Getstats results"
  23. #define MAXGETSTATSARGS 1024
  24.  
  25. cgi_main(cgi_info *ci) {
  26.   form_entry *p;
  27.   form_entry *get_form_entries(cgi_info *);
  28.   char *bdir, *mailaddress;
  29.   char *gsargv[MAXGETSTATSARGS];
  30.   int gsargc, i;
  31.   
  32.   switch(mcode(ci)) {
  33.     
  34.   case MCODE_HEAD:
  35.   case MCODE_GET:
  36.     puts("Location: /admin/getstats/statform.html\n");
  37.     break;
  38.     
  39.   case MCODE_POST:
  40.     bdir = getenv("BOOTSTRAP_DIR");
  41.     if (bdir == NULL) bdir = "../..";
  42.     chdir(bdir);
  43.     
  44.     mailaddress = NULL;
  45.     gsargc = 0;
  46.     gsargv[gsargc++] = "bin/getstats";
  47.     gsargv[gsargc++] = "-dr";
  48.     gsargv[gsargc++] = "doc";
  49.     gsargv[gsargc++] = "-ht";
  50.  
  51.     print_mimeheader("text/html");
  52.  
  53.     for(p=get_form_entries(ci); p; p = p->next) {
  54.       if (!strcmp(p->name, "protocol")) {
  55.     switch (*(p->val)) {
  56.     case 'G':
  57.     case 'N':
  58.     case 'C':
  59.     case 'P':
  60.       sprintf(gsargv[gsargc++] = malloc(3), "-%c", *(p->val));
  61.       break;
  62.     case 'M':
  63.       gsargv[gsargc++] = "-A";
  64.       break;
  65.     case 'U':
  66.       gsargv[gsargc++] = "-O";
  67.       break;
  68.     default:
  69.       gsargv[gsargc++] = "-z";
  70.     }
  71.       }
  72.       else if (!strcmp(p->name, "logfilename")) {
  73.     gsargv[gsargc++] = "-l";
  74.     gsargv[gsargc++] = (p->val && *(p->val)) ? p->val : "logs/access_log";
  75.       }
  76.       else if (!strcmp(p->name, "common") && !strcmp(p->val, "on"))
  77.     gsargv[gsargc++] = "-M";
  78.       else if (!strcmp(p->name, "concise") && !strcmp(p->val, "on"))
  79.     gsargv[gsargc++] = "-c";
  80.       else if (!strcmp(p->name, "toplines") && p->val && *(p->val)) {
  81.     gsargv[gsargc++] = "-t";
  82.     gsargv[gsargc++] = p->val;
  83.       }
  84.       else if (!strcmp(p->name, "all") && !strcmp(p->val, "on"))
  85.     gsargv[gsargc++] = "-a";
  86.       else if (!strcmp(p->name, "monthly") && !strcmp(p->val, "on"))
  87.     gsargv[gsargc++] = "-m";
  88.       else if (!strcmp(p->name, "weekly") && !strcmp(p->val, "on"))
  89.     gsargv[gsargc++] = "-w";
  90.       else if (!strcmp(p->name, "daysweek") && !strcmp(p->val, "on"))
  91.     gsargv[gsargc++] = "-ds";
  92.       else if (!strcmp(p->name, "daily") && !strcmp(p->val, "on"))
  93.     gsargv[gsargc++] = "-d";
  94.       else if (!strcmp(p->name, "hoursday") && !strcmp(p->val, "on"))
  95.     gsargv[gsargc++] = "-hs";
  96.       else if (!strcmp(p->name, "hourly") && !strcmp(p->val, "on"))
  97.     gsargv[gsargc++] = "-h";
  98.       else if (!strcmp(p->name, "full-hostname") && !strcmp(p->val, "on"))
  99.     gsargv[gsargc++] = "-f";
  100.       else if (!strcmp(p->name, "full-access") && !strcmp(p->val, "on"))
  101.     gsargv[gsargc++] = "-fa";
  102.       else if (!strcmp(p->name, "full-lastaccess") && !strcmp(p->val, "on"))
  103.     gsargv[gsargc++] = "-fd";
  104.       else if (!strcmp(p->name, "full-bytes") && !strcmp(p->val, "on"))
  105.     gsargv[gsargc++] = "-fb";
  106.       else if (!strcmp(p->name, "request-name") && !strcmp(p->val, "on"))
  107.     gsargv[gsargc++] = "-r";
  108.       else if (!strcmp(p->name, "request-accesses") && !strcmp(p->val, "on"))
  109.     gsargv[gsargc++] = "-ra";
  110.       else if (!strcmp(p->name, "request-lastaccesses") && !strcmp(p->val, "on"))
  111.     gsargv[gsargc++] = "-rd";
  112.       else if (!strcmp(p->name, "request-bytes") && !strcmp(p->val, "on"))
  113.     gsargv[gsargc++] = "-rb";
  114.       else if (!strcmp(p->name, "request-filesize") && !strcmp(p->val, "on"))
  115.     gsargv[gsargc++] = "-rf";
  116.       else if (!strcmp(p->name, "domain-name") && !strcmp(p->val, "on"))
  117.     gsargv[gsargc++] = "-dn";
  118.       else if (!strcmp(p->name, "domain-requests") && !strcmp(p->val, "on"))
  119.     gsargv[gsargc++] = "-da";
  120.       else if (!strcmp(p->name, "domain-lastaccesses") && !strcmp(p->val, "on"))
  121.     gsargv[gsargc++] = "-dd";
  122.       else if (!strcmp(p->name, "domain-bytes") && !strcmp(p->val, "on"))
  123.     gsargv[gsargc++] = "-db";
  124.       else if (!strcmp(p->name, "domain-sub") && !strcmp(p->val, "on"))
  125.     gsargv[gsargc++] = "-ds";
  126.       else if (!strcmp(p->name, "filetree") && !strcmp(p->val, "on"))
  127.     gsargv[gsargc++] = "-dt";
  128.       else if (!strcmp(p->name, "error") && !strcmp(p->val, "on"))
  129.     gsargv[gsargc++] = "-e";
  130.       else if (!strcmp(p->name, "samask") && p->val && *(p->val)) {
  131.     gsargv[gsargc++] = "-sa";
  132.     sprintf(gsargv[gsargc++]=malloc(strlen(p->val)+3), "\"%s\"", p->val);
  133.       }
  134.       else if (!strcmp(p->name, "ssmask") && p->val && *(p->val)) {
  135.     gsargv[gsargc++] = "-ss";
  136.     sprintf(gsargv[gsargc++]=malloc(strlen(p->val)+3), "\"%s\"", p->val);
  137.       }
  138.       else if (!strcmp(p->name, "srmask") && p->val && *(p->val)) {
  139.     gsargv[gsargc++] = "-sr";
  140.     sprintf(gsargv[gsargc++]=malloc(strlen(p->val)+3), "\"%s\"", p->val);
  141.       }
  142.       else if (!strcmp(p->name, "spmask") && p->val && *(p->val)) {
  143.     gsargv[gsargc++] = "-sp";
  144.     sprintf(gsargv[gsargc++]=malloc(strlen(p->val)+3), "\"%s\"", p->val);
  145.       }
  146.       else if (!strcmp(p->name, "sdmask") && p->val && *(p->val)) {
  147.     gsargv[gsargc++] = "-sd";
  148.     sprintf(gsargv[gsargc++]=malloc(strlen(p->val)+3), "\"%s\"", p->val);
  149.       }
  150.       else if (!strcmp(p->name, "shmask") && p->val && *(p->val)) {
  151.     gsargv[gsargc++] = "-sh";
  152.     sprintf(gsargv[gsargc++]=malloc(strlen(p->val)+3), "\"%s\"", p->val);
  153.       }
  154.       else if (!strcmp(p->name, "swmask") && p->val && *(p->val)) {
  155.     gsargv[gsargc++] = "-sw";
  156.     sprintf(gsargv[gsargc++]=malloc(strlen(p->val)+3), "\"%s\"", p->val);
  157.       }
  158.       else if (!strcmp(p->name, "mailme")) mailaddress = p->val;
  159.     }
  160.  
  161.     if (mailaddress && *mailaddress) {
  162.       int fd[2];
  163.       puts("<h1>Getstats by mail</h1>");
  164.       printf("<p>Sending the getstats report to %s.\n", mailaddress);
  165.       fflush(stdout);
  166.       if (fork()) exit(0); /* detach so server responds */
  167.       pipe(fd);
  168.       if (fork() == 0) {
  169.     dup2(fd[0], STDIN_FILENO);
  170.     execl("/usr/lib/sendmail", "sendmail", "-t", NULL);
  171.       }
  172.       dup2(fd[1], STDOUT_FILENO);
  173.       printf("To: %s\nSubject: getstats report\n", mailaddress);
  174.       print_mimeheader("text/html");
  175.     }
  176.     fflush(stdout);
  177.     gsargv[gsargc] = NULL;
  178.     execv(gsargv[0], gsargv);
  179.  
  180.     break;
  181.  
  182.   default:
  183.     printf("Unrecognized method '%s'.\n", ci->request_method);
  184.   }
  185. }
  186.