/*******************************************************************/
/*    PROGRAMA : PCISCO.c                                          */
/*                                                                 */
/*    FUNCAO   : Programa que le a mib do roteador cisco 2500 e    */
/*                                                                 */
/*    DATA     : 09/07/96                                          */
/*                                                                 */
/*    AUTOR    : Mario Lemes Proenca Jr.                           */
/*             : Rodolfo Miranda de Baros                          */
/*                                                                 */
/*******************************************************************/


#include <sys/types.h>
#include <sys/param.h>
#include <stdio.h>
#include <netinet/in.h>
#include <sys/time.h>
#include <errno.h>


/* includes do CMU */

#include "/home/uel/cce/dcop/mestrado/cmu/cmu-snmp2/snmplib/snmp.h"
#include "/home/uel/cce/dcop/mestrado/cmu/cmu-snmp2/snmplib/asn1.h"
#include "/home/uel/cce/dcop/mestrado/cmu/cmu-snmp2/snmplib/snmp_impl.h"
#include "/home/uel/cce/dcop/mestrado/cmu/cmu-snmp2/snmplib/snmp_api.h"
#include "/home/uel/cce/dcop/mestrado/cmu/cmu-snmp2/snmplib/snmp_client.h"
#include "/home/uel/cce/dcop/mestrado/cmu/cmu-snmp2/snmplib/parse.h"

static void sprint_by_type();

char
   str [ 200],
   buf2[2048];

char faz, cnt_var;

FILE     * arq_cisco;

time_t  ourtime;

struct variaveis
{
   char  * valor;
} 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	snmp_dump_packet = 0;


/*****/
/*****/


void grava_arq()


{

   FILE     * arq_cisco2, * arq_cisco3, * arq_cisco4;

   char     reg_s[150], reg_in[200], 
            ind       , ind2       , str_aux[20] ;

   long val1, val2, val3;

   ourtime      = time(NULL); 

   arq_cisco2   = fopen("cisco_mib_2", "a+");

      {
         arq_cisco3   = fopen("cisco_mib_11","a+");
         arq_cisco4   = fopen("cisco_mib_00","a+"); /* para guardar historico*/
         memcpy(&reg_s[ 0], ctime(&ourtime), 20);
         reg_s[20]    = 0x00;
         fputs(reg_s  , arq_cisco3); 
         fputs(buf2   , arq_cisco3);
         fputs(reg_s  , arq_cisco4);
         fputs(buf2   , arq_cisco4);
         fclose(arq_cisco3);
      }
   fgets(reg_in, 250, arq_cisco);
   if (cnt_var > 3 && ((cnt_var != 10) && (cnt_var != 11) && (cnt_var!=12)))
      { 
         
         ind  = -1; 
         
         while(reg_in[++ind] != '=');
         ind2 = ind + 1;
         while(reg_in[++ind2] >= '0' && reg_in[ind2]  <= '9');

         /*printf("ind=%u  ind2=%u val=%.10s",ind, ind2, &reg_in[ind+2]); */
      
         memcpy(&str_aux[0], &reg_in[ind+2], 16);
         str_aux[17] = 0x00;
         
         val1 = atol(str_aux);
         val2 = atol(&buf2[ind+1-19]);
         if (val2 < val1)         /* contador virou */
            {
               val3 = val2 - 0;   /* tira de zero, erro menor */
               fputs("cont virou ", arq_cisco4);
               fputs(str_aux      , arq_cisco4);

            }
         else
               val3 = val2 - val1; 
         sprintf(&reg_in[ind+2] , "%d", val3);
       /*printf(" val=%d, val2=%d, val3=%d ", val1, val2, val3);*/
      }
 /*printf (" reg_in %s  ", reg_in);*/
   fputs  (reg_in, arq_cisco2); 
   if (cnt_var > 3 && ((cnt_var != 10) && (cnt_var != 11) && (cnt_var!=12)))
         fputs  ("\n"  , arq_cisco2);
   fclose (arq_cisco2);  
   fclose(arq_cisco4);

      
}


/*****/
/*****/


char  acessa_mib()



{

   /* Estruturas utilizadas pelas funcoes do cmu-snmp. */


   struct snmp_session session, *ss;
   struct snmp_pdu      *pdu  , *response;
   struct variable_list *vars;
   oid    name[MAX_NAME_LEN];
   int    name_length;
   int    status;



   /*  Definicao do objeto a ser buscado */

   char *maquina    = "200.250.10.127";
   char *comunidade = "public";
   char *nome;
 
   /* inicializacao da MIB e inicializa estrutura */

  
   arq_cisco  = fopen("cisco_mib_1", "r");

   init_mib();

   faz     = 22;
   cnt_var =  0;
   while (faz)
   {

      memcpy(&nome, &vari[cnt_var].valor, sizeof(vari[cnt_var].valor));
      cnt_var++;
      faz--;

    bzero((char *)&session, sizeof(struct snmp_session));

    session.peername      = maquina;
    session.version       = SNMP_VERSION_1;
    session.community     = (u_char *)comunidade;
    session.community_len = strlen((char *)comunidade);
    session.retries       = SNMP_DEFAULT_RETRIES;
    session.timeout       = SNMP_DEFAULT_TIMEOUT;
    session.authenticator = NULL;


/* Sincroniza a sessao snmp */


    snmp_synch_setup(&session);

    ss = snmp_open(&session);

    if (ss == NULL)
       {
	  printf("Nao conseguiu abrir sessao\n");
	  return NULL;
       }

    pdu         = snmp_pdu_create(GET_REQ_MSG);
    name_length = MAX_NAME_LEN;

    if (!read_objid(nome, name, &name_length))
       { 
          printf("Objeto inexistente: %s\n", nome);
	  exit(1);
       }

    snmp_add_null_var(pdu, name, name_length);



    status = snmp_synch_response(ss, pdu, &response);

    if(status == STAT_SUCCESS)
       {
          if(response->errstat == SNMP_ERR_NOERROR)
             { 
                vars = response->variables;
                print_variable (vars->name, vars->name_length, vars);
                print_variable2(vars->name, vars->name_length, vars);
                grava_arq();
             }
          else
                printf("Erro no pacote: %s\n",snmp_errstring(response->errstat));
       }
   else
          if (status == STAT_TIMEOUT)
                printf("Sem sem resposta - %s\n", maquina);
          else    /* status == STAT_ERROR */
                printf("An error occurred, Quitting\n");

   if (response)
         snmp_free_pdu(response);
   snmp_close(ss);

   }


}


/*****/
/*****/


print_variable2(objid, objidlen, variable)
    oid     *objid;
    int     objidlen;
    struct  variable_list *variable;
{                    

    sprint_variable(buf2, objid, objidlen, variable);

}


/*****/
/*****/


main()


{



   acessa_mib();

   fclose (arq_cisco);
   unlink("cico_mib_1");
   rename("cisco_mib_11", "cisco_mib_1"); 

}

