/*    PROGRAMA : PCISCO2                         */
/*                                               */
/*    FUNCAO   : Progarama cgi para mostrar      */
/*               estatisticas do roteador cisco  */
/*               da UEL em pagina HTML           */
/*                                               */
/*    DATA     : 22/09/96                        */
/*                                               */
/*    AUTOR    : Mario Lemes Proenca Jr.         */
/*             : Rodolfo Miranda de Baros        */



#include <stdio.h>
#include <time.h>
#include <stdlib.h>


/*************************************************************************/

extern char *makeword    (char * line, char stop);
extern char *fmakeword   (FILE *    f, char stop, int *len);
extern char x2c          (char * what);
       void unescape_url (char *  url);
       void plustospace  (char *  str);

/*************************************************************************/


#define   MAX_ENTRIES   10000

#define LF 10
#define CR 13

/*************************************************************************/

typedef struct

{
   char   * name;
   char   *  val;
} entry;

entry entries[MAX_ENTRIES];


struct

{

   long  val_s;

} oco[24];

           
struct variaveis
{
   char   valor[44];
} vari[30] =  { "interfaces.ifTable.ifEntry.ifDescr.1        ",
                "interfaces.ifTable.ifEntry.ifType.1         ",
                "interfaces.ifTable.ifEntry.ifAdminStatus.1  ",
                "interfaces.ifTable.ifEntry.ifInOctets.1     ",
                "interfaces.ifTable.ifEntry.ifInUcastPkts.1  ",
                "interfaces.ifTable.ifEntry.ifInNUcastPkts.1 ",
                "interfaces.ifTable.ifEntry.ifOutOctets.1    ",
                "interfaces.ifTable.ifEntry.ifOutUcastPkts.1 ",
                "interfaces.ifTable.ifEntry.ifOutNUcastPkts.1",
                "interfaces.ifTable.ifEntry.ifDescr.2        ",
                "interfaces.ifTable.ifEntry.ifType.2         ",
                "interfaces.ifTable.ifEntry.ifAdminStatus.2  ",
                "interfaces.ifTable.ifEntry.ifInOctets.2     ",
                "interfaces.ifTable.ifEntry.ifInUcastPkts.2  ",
                "interfaces.ifTable.ifEntry.ifInNUcastPkts.2 ",
                "interfaces.ifTable.ifEntry.ifOutOctets.2    ",
                "interfaces.ifTable.ifEntry.ifOutUcastPkts.2 ",
                "interfaces.ifTable.ifEntry.ifOutNUcastPkts.2",
                "ip.ipInReceives.0                           ",
                "ip.ipForwDatagrams.0                        ",
                "ip.ipInDelivers.0                           ",
                "ip.ipOutrequests.0                          "};
           
   
int
   x        ,  m = 0     ,    cl     ;

time_t  ourtime;
 
FILE   * fp, * fp1;

char 

   str_cnt   [ 20],
   linha     [300],
   senha     [  8],
   dia       [  3],
   hora      [  3], 
   v2_1      [ 19],
   v2_2      [ 19],
   v3_1, v3_2,
   st             , 
   it ;


/*****/
/*****/


poe_hora(char cont)

{

char              

   ind, ind2;
                  
long              

   val1, val2, val3, val4;
                  

   ind = -1;
   while(linha[++ind] != '=');
   ind2 = ind + 1;
   while(linha[++ind2] >= '0' && linha[ind2]  <= '9');
   val1 = atol(&linha[ind+2]);
   val2 = val1 / 60;
   memcpy(&linha [ind2]      , "/hora ",    6);
   sprintf(&linha[ind2+6]    , "%d"    , val2);
   ind2 = ind2 + 6;
   while(linha[++ind2] >= '0' && linha[ind2]  <= '9');
   memcpy(&linha[ind2], "/min." ,    5);
   if (cont==4||cont==7||cont==13||cont==16)
      {
         val3 = val1 / 1024;
         val4 = val2 / 1024;
         linha[ind2+5] = ' ';
         sprintf(&linha[ind2+6], "%d"  , val3);
         ind2 += 6;
         while(linha[++ind2] >= '0' && linha[ind2]  <= '9');
         memcpy(&linha[ind2], "k/h",  3);
         linha[ind2+3] = ' ';
         sprintf(&linha[ind2+4], "%d"  , val4);
         ind2 += 4;
         while(linha[++ind2] >= '0' && linha[ind2]  <= '9');
         memcpy(&linha[ind2], "k/min.",  6);
         linha[ind2+6] = 0x0; 
      }
   else
   linha[ind2+5]= 0x0;

}


/******/
/*****/


mostra_esta_hora(char cont)


{

char

   ind, ind2;

   
   if (cont == 1 || cont == 10 )
      {
         if (cont == 10) printf("</table><br>");
         ind  = -1;
         while(linha[++ind] != '='); 
         printf("<table border=1 width=700 height =250>");
         printf("<tr><td><center>");
         printf("*** INTERFACE %u DO ROTEADOR %.20s *** ",it, &linha[ind]);
         printf("</tr></td>");   
         it ++;
      }
   else
      if (cont == 19)
         {
            printf("</table><br>");
            printf("<table border=1 width=700 height=250>");
            ind  = -1;
            while(linha[++ind] != '='); 
            printf("<tr><td><center>");
            printf("*** DADOS SOBRE PACOTES IP NO ROTEADOR *** ");
            printf("</tr></td>");
            poe_hora(cont);
            printf("<tr><td> %.105s", &linha[0]);
            printf("</tr></td>");
         }
      else    
         {
            if (cont != 11 && cont != 12 && cont != 2 && cont != 3)
               {
                  poe_hora(cont);
               }
            printf("<tr><td> %.105s", &linha[0]);
            printf("</tr></td>");
         }

}


/*****/
/*****/


void acha_dia_hora()

{

   char   
      fim   , cont;

   fim  = 1;
   cont = 0;
   fp   =  fopen("../cisco_mib_2","r");
   for (x=0;  (!feof(fp) && fim); x++)
   {
      fgets(linha, 250, fp);
      if ((memcmp(&linha[8], dia, 2) == 0))
         { 
            if ((memcmp(&linha[11], hora, 2) == 0))
               {  
                  cont++;
                  mostra_esta_hora(cont);  
               }
         }
   }
   printf("</table>");
   fclose(fp);

}


/*****/
/*****/


soma_hora_dia(char cont)

{

char
   
   ind;
   
long
   
   val1;
   
   ind = -1;
   while(linha[++ind] != '=');
   val1 = atol(&linha[ind+2]);
   oco[cont].val_s += val1;
   
}


/*****/
/*****/


mostra_este_dia(char cont)

{

   
char        

   ind, ind2;
            
long     

   val1;
         
      if  (cont ==  1 || cont == 2 || cont == 10 || cont == 11 
        || cont == 3 || cont == 12) 
         {
            if (cont==2)  
                  memcpy(&v2_1[0], &linha[58], 18);
            else
                  if (cont==11)
                        memcpy(&v2_2[0], &linha[58], 18);
                  else 
                        if (cont == 3)
                        {
                           if (memcpy(&linha[66], "up", 2) !=0) 
                                 v3_1++;
                        }
                        else
                           if (cont ==12)
                           {
                           if (memcpy(&linha[66], "up", 2) !=0)
                                 v3_2++;
                           }      
         }
      else
         {
            soma_hora_dia(cont);
         }
          
}

/*****/
/*****/

  
void acha_dia()
    
{
      
   char   
      fim   , cont, str_aux[55];
   long
      val1  ;

   fim  = 1;
   cont = 0;
   fp   =  fopen("../cisco_mib_2","r");
   for (x=0;  (!feof(fp) && fim); x++)
   {
      fgets(linha, 250, fp);
      if ((memcmp(&linha[8], dia, 2) == 0))
         {
            cont++;
            mostra_este_dia(cont);
            if (cont==22)  cont=0;
         }
   }
   
   cont=-1;
   while(cont++ <= 21)
   {
      if (cont == 0 || cont == 9 )
      {
         if (cont == 9) printf("</table><br>");
         printf("<table border=1 width=700 height =250>");
         printf("<tr><td><center>");
         if (cont==0) printf("*** INTERFACE 0 DO ROTEADOR  = Ethernet0");
         if (cont==9) printf("*** INTERFACE 1 DO ROTEADOR  = Serial0  ");
         printf("</tr></td>");   
      }
      else
      if (cont == 18)
         {
            printf("</table><br>");
            printf("<table border=1 width=700 height=250>");
            printf("<tr><td><center>");
            printf("*** DADOS SOBRE PACOTES IP NO ROTEADOR ");
            printf("</tr></td>");
             val1 = oco[cont+1].val_s / 24;
            printf("<tr><td> %.44s = %d /dia %d 
/hora",&vari[cont].valor,oco[cont+1].val_s, val1);
            printf("</tr></td>");
         }
      else    
         {
            val1 = oco[cont+1].val_s / 24; 
            if (cont==1) 
               printf("<tr><td> %.44s = %.18s",&vari[cont].valor,v2_1);
            else
            if (cont==10) 
               printf("<tr><td> %.44s = %.16s",&vari[cont].valor,v2_2);
            else
            if (cont==2||cont==11) 
               printf("<tr><td> %.44s = up(1)",&vari[cont].valor);
            else
            if (cont==3||cont==6||cont==12||cont==15)
             printf("<tr><td> %.44s = %d /dia %d /hora %dkb/hora %dkb/min.",
&vari[cont].valor, oco[cont+1].val_s, val1, (val1/1024), (val1/1024/60));
            else
            printf("<tr><td> %.44s = %d /dia %d /hora",
&vari[cont].valor, oco[cont+1].val_s, val1);
            printf("</tr></td>");
         }
   }
   printf("</table>");
   fclose(fp);

}


/*****/
/*****/


mostra_dia()

{

  char
      faz   ;
   
  
    printf("<UL><CENTER><P><B><FONT SIZE=+2>ESTAT&IacuteSTICAS DO ROTEADOR DA
UEL - CISCAO.UEL.BR - 200.250.10.127</FONT></B></P></CENTER></UL> ");
   printf("<center><h1>Estat&iacutesticas de todo o Dia : %s</center>", dia);
   printf("<font size=+1>** Obs. Os n&uacutemeros referem-se a soma dos 
deltas entre as horas e a m&eacutedia desta soma**</font>");
   printf("<hr>");
   acha_dia();

}


/*****/
/*****/


mostra_hora()


{

   char
      faz   ;


    printf("<UL><CENTER><P><B><FONT SIZE=+2>ESTAT&IacuteSTICAS DO ROTEADOR 
DA UEL - CISCAO.UEL.BR - 200.250.10.127</FONT></B></P></CENTER></UL> "); 
   printf("<center><h1>Dia : %s as : %s horas</center>", dia, hora);
   printf("<font size=+1>** Obs. Os n&uacutemeros referem-se a 
diferen&ccedila entre esta hora e a anterior **</font>");
   printf("<hr>");
   acha_dia_hora();

}


/*****/
/*****/


mostra_cab()

{

  /* printf("<body background='fundo.jpg'>");  */ 
   printf("<html> <body bgcolor='#ffffff' text='#000000'> ");
   printf("<CENTER><P><IMG SRC=uel.gif HEIGHT=93 WIDTH=85>");
   printf("<B><FONT SIZE=+2>UniversidadeEstadual de Londrina - 
UEL</FONT></B></P></CENTER>");
   /*<IMG aling=left src=logouel.gif>"); 
   printf("<IMG aling=right src=nomeuel.gif>");*/
   printf("<hr border=1><center>");

}

/*****/
/*****/

        
char mostra_estatistica()
         
       
{


   mostra_cab();
   if (memcmp(&hora[0], "99", 2) == 0)
         mostra_dia();
   else
         mostra_hora();
    
}   
   
       
/*************************************************************************/
/*****/
/*****/


main ( int argc, char * arqv[])

{

   printf("Content-type: text/html%c%c", 10, 10);


   cl  =  atoi(getenv("CONTENT_LENGTH"));
   for (x=0; cl && (!feof(stdin));x++)
   {
      m = x;
      entries[x].val = fmakeword(stdin,'&',&cl);
      plustospace(entries[x].val);
      unescape_url(entries[x].val);
      entries[x].name = makeword(entries[x].val,'=');
   }
   ourtime     = time(NULL);             

   memcpy(&dia [0], entries[0  ].val, 2);
   memcpy(&hora[0], entries[1  ].val, 2);
   dia[2] = hora[2] = 0x0;
   if (dia[0] == '0') dia[0] = ' ';
   it     = 0;
   v3_1   = v3_2 = 0;  /* contador de status da interface*/

   mostra_estatistica();

}

