#include #include #include #include #include #include #define MAX_STR 50 oid anOID[256] = {1, 3, 6, 1, 2, 1, 25, 2, 3, 1, 3, 0}; oid anOID_len = 12; int main(int argc, char** argv) { struct snmp_session session, *ss; struct snmp_pdu *pdu = NULL; struct snmp_pdu *response = NULL; struct variable_list *vars = NULL; int status; int konec = 0; double pom; char popis[MAX_STR]; long velikost = 0; long pouzito = 0; long dostupne = 0; long pouzito_pr = 0; FILE *log; /* veci pro statistiku */ clock_t zac, kon; struct tms cas; int tiku; float rozdil; float min = 1000000; float max = 0; float celkem = 0; int pocet = 0; struct timeval sendtv, rectv; struct tm *tm; /* inicializace aplikace */ init_snmp("snmp-aplikace"); /* inicializace relace */ snmp_sess_init(&session); session.peername = argv[1]; session.version = SNMP_VERSION_1; session.community = argv[2]; session.community_len = strlen(session.community); /* otevreni spojeni */ ss = snmp_open(&session); if (!ss) { printf ("Spojeni se nepodarilo navazat.\n"); exit (1); } /* zapnuti logovani */ if ((log = fopen ("vypis.log", "w")) == NULL) { printf ("%s\n", "Nepodarilo se vytvorit logovaci soubor."); exit (1); } /* vypis hlavicky */ printf ("\n"); printf ("%s\n", "Vypis tabulky hrStorageTable - 1.3.6.1.2.1.25.2.3"); printf ("\n"); printf ("%s\n", "Sloupec hrStorageDescr - 1.3.6.1.2.1.25.2.3.1.3"); printf ("%s\n", "Sloupec hrStorageSize - 1.3.6.1.2.1.25.2.3.1.5"); printf ("%s\n", "Sloupec hrStorageUsed - 1.3.6.1.2.1.25.2.3.1.6"); printf ("\n"); printf ("%-18s %12s %12s %12s %15s\n", "Popis", "Velikost (kB)", "Pouzito", "Dostupne", "Pouzito (%)"); printf ("--------------------------------------------------------------------------------\n"); /* tiky za sekundu */ tiku = sysconf (_SC_CLK_TCK); while (konec == 0) { pdu = snmp_pdu_create(SNMP_MSG_GETNEXT); snmp_add_null_var(pdu, anOID, anOID_len); pdu->variables->type = 6; /* poslani zpravy + zapis do logu */ zac = times (&cas); gettimeofday (&sendtv, NULL); status = snmp_synch_response(ss, pdu, &response); kon = times (&cas); gettimeofday (&rectv, NULL); rozdil = (kon - zac) / (double) tiku; celkem += rozdil; if (rozdil < min) min = rozdil; if (rozdil > max) max = rozdil; pocet++; fprintf (log, "Budu cist OID: "); fprint_objid (log, anOID, anOID_len); tm = localtime (&sendtv.tv_sec); fprintf (log, "Poslan dotaz v case: %.2d:%.2d:%.2d.%.6d\n", tm->tm_hour, tm->tm_min, tm->tm_sec, (int)sendtv.tv_usec); tm = localtime (&rectv.tv_sec); fprintf(log, "Prijata odpoved v case: %.2d:%.2d:%.2d.%.6d\n", tm->tm_hour, tm->tm_min, tm->tm_sec, (int)rectv.tv_usec); fprintf (log, "\n"); if (status == STAT_SUCCESS && response->errstat == SNMP_ERR_NOERROR) { vars = response->variables; if (vars->type == ASN_OCTET_STR) { vars->val.string[vars->val_len] = '\0'; switch (anOID[10]) { case 3: /* popis */ strncpy (popis, vars->val.string, MAX_STR); break; } } else { /* ulozeni */ switch (anOID[10]) { case 5: /* velikost */ velikost = *vars->val.integer; break; case 6: /* pouzito */ pouzito = *vars->val.integer; } if (anOID[10] == 3) konec = 1; } } else { if (status == STAT_SUCCESS) fprintf(stderr, "Error in packet\nReason: %s\n", snmp_errstring(response->errstat)); else snmp_sess_perror("snmpget", ss); } if (response) snmp_free_pdu (response); /* pokud jsme mimo tabulku, vypis a dalsi zaznam */ if (anOID[10] == 6) { dostupne = velikost - pouzito; pom = velikost / 100; if (pom > 0) pouzito_pr = (long) (pouzito / pom); else pouzito_pr = 0; printf ("%-18s %12ld %12ld %12ld %10ld%%\n", popis, velikost, pouzito, dostupne, pouzito_pr); } /* prejde se na dalsi sloupec */ switch (anOID[10]) { case 3: anOID[10] = 5; break; case 5: anOID[10] = 6; break; case 6: anOID[10] = 3; anOID[11]++; break; } } /* vypis koncovych statistik */ fprintf (log, "\nMinimalni doba odezvy: %.3f [sec]\n", min); fprintf (log, "Maximalni doba odezvy: %.3f [sec]\n", max); fprintf (log, "Prumerna doba odezvy: %.3f [sec]\n", celkem/pocet); /* ukonceni logovani */ fclose (log); snmp_close(ss); return 0; }