/* * Semestralni prace z predmetu PSI - vypis SNMP tabulky at * Vypis polozek: atPhysAddress, atNetAddress * Petr Chudes, Ondrej Patka, 2002 */ #include "snmp_api.h" #include "snmp_client.h" #include "snmp.h" oid tabulka[256] = {1, 3, 6, 1, 2, 1, 3, 1, 1, 2}; oid delka_tab = 10; char *community,*hostname; int konec_vypisu; void vypis_hlavicku(void) { printf("\nSemestralni prace z predmetu PSI" "\nPetr Chudes, Ondrej Patka, 2002" "\nVypis casti SNMP tabulky AT (1.3.6.1.2.1.3.1.1)" "\n vypisovane polozky: atIfIndex (.1)" "\n atPhysAddress (.2)" "\n atNetAddress (.3)" "\n---------------------------------------------------------\n"); } int zpracovani(int operation, struct snmp_session* session, int reqid, struct snmp_pdu *pdu, void *magic) { int i; for (i=0;i<10;i++) if (tabulka[i] != *(pdu->variables->name+i)) konec_vypisu = 1; if (konec_vypisu == 1) return 0; switch (tabulka[9]){ case 1: /*ifIndex*/ printf(" | %2d\n",*(pdu->variables->val.integer)); break; case 2 : /*atPhysAddress*/ memcpy(tabulka, pdu->variables->name,pdu->variables->name_length*sizeof(oid)); delka_tab = pdu->variables->name_length; // printf("%3d.%3d.%3d.%3d.%3d.%3d - ", tabulka[10], tabulka[11], tabulka[12] // , tabulka[13], tabulka[14], tabulka[15]); printf(" "); for (i=0;ivariables->val_len;i++){ printf("%02x ",*(pdu->variables->val.string+i)); } printf(" | "); break; case 3 : /*atNetAddress*/ for (i=0;ivariables->val_len-1;i++){ printf("%3d.",*(pdu->variables->val.string+i)); } printf("%3d",*(pdu->variables->val.string+i)); break; } return 0; } /****************************************************************** * Funkce pro nacteni dat z AT tabulky a jejich vypis na obrazovku * ******************************************************************/ int vypis_at_table(void) { int cislo_spojeni; struct snmp_session *nove_spojeni, *otevrene_spojeni; struct snmp_pdu *pdu; int numfds; fd_set fdset; struct timeval to; int block; /* vytvoreni noveho spojeni - naplneni struktury snmp_session */ nove_spojeni = (struct snmp_session *) calloc (1, sizeof (struct snmp_session)); nove_spojeni->retries = SNMP_API_DEFAULT_RETRIES; /* Number of retries befor timeout */ nove_spojeni->timeout = SNMP_API_DEFAULT_TIMEOUT; /* Number of uS until first timeout, then exponencial backoff */ nove_spojeni->peername = hostname; /* Domain name or dotted IP address or default peer */ nove_spojeni->remote_port = SNMP_PORT; /* UDP port number of peer */ nove_spojeni->local_port = 0; /* My UDP port number, 0 for default, picked for randomly */ nove_spojeni->authenticator = NULL; /* Authentification function or NULL */ nove_spojeni->callback = (int (*)())zpracovani; /* Function to interpret incoming data */ nove_spojeni->version = SNMP_VERSION_1; /* SNMP version number */ nove_spojeni->community_len = 0; /* community */ nove_spojeni->community = community; /* otevreni noveho spojeni */ if ((otevrene_spojeni = snmp_open(nove_spojeni)) == NULL) return 255; cislo_spojeni = snmp_select_info(&numfds, &fdset, &to, &block); printf(" atPhysAddress(.2) | atNetAddress(.3) | atIfIndex(.1)\n" "---------------------------------------------------------\n"); /* nacitani a vypis az do konce tabulky */ konec_vypisu = 0; while (konec_vypisu == 0) { /* vytvoreni pdu s prikazem GETNEXT */ pdu = snmp_pdu_create(GETNEXT_REQ_MSG); /* pridani nulove polozky na konec parametru */ snmp_add_null_var(pdu, tabulka, delka_tab); /* ASN type of variable */ pdu->variables->type = 6; /* poslani UDP paketu s pdu */ if ((snmp_send(otevrene_spojeni, pdu)) == 0) return -1; /* cteni odpovedi */ snmp_read(&fdset); /* uvolneni pameti pdu */ snmp_free_pdu(pdu); /* posilani prikazu GET */ pdu = snmp_pdu_create(GET_REQ_MSG); tabulka[9] = 3; snmp_add_null_var(pdu, tabulka, delka_tab); pdu->variables->type = 6; if ((snmp_send(otevrene_spojeni, pdu)) == 0) return -1; snmp_read(&fdset); snmp_free_pdu(pdu); tabulka[9] = 1; /* posilani prikazu GET */ pdu = snmp_pdu_create(GET_REQ_MSG); snmp_add_null_var(pdu, tabulka, delka_tab); pdu->variables->type = 6; if ((snmp_send(otevrene_spojeni, pdu)) == 0) return 255; snmp_read(&fdset); snmp_free_pdu(pdu); tabulka[9] = 2; } if ((snmp_close(nove_spojeni)) == 0) return 255; free((void *)nove_spojeni); free((void *)otevrene_spojeni); } /* hlavni funkce programu */ int main(int argc,char *argv[]) { switch (argc) { case 1: // nebyly zadany parametry host a community hostname = (char *) malloc(9+1, sizeof(char)); strcpy(hostname, "localhost"); community = (char *) malloc(6+1, sizeof(char)); strcpy(community, "public"); break; case 2: // zadan pouze host name -> community automaticky public hostname = (char *) malloc(strlen(argv[1])+1, sizeof(char)); strcpy(hostname, argv[1]); community = (char *) malloc(6+1, sizeof(char)); strcpy(community, "public"); break; case 3: // zadan host i community hostname = (char *) malloc(strlen(argv[1])+1, sizeof(char)); strcpy(hostname, argv[1]); community = (char *) malloc(strlen(argv[2])+1, sizeof(char)); strcpy(community, argv[2]); break; default: printf("\nProgram nebyl spravne spusten!\n"); printf("\nSpravne spusteni: vypis_at \n"); return(0); break; } vypis_hlavicku(); vypis_at_table(); return 0; }