/* * Dump IP statistics structure. */ void ip_stats(void) { oid varname[MAX_OID_LEN], *ipentry; int varname_len; netsnmp_variable_list *var; int count; struct stat_table *sp = ip_stattab; memmove(varname, oid_ipstats, sizeof(oid_ipstats)); varname_len = sizeof(oid_ipstats) / sizeof(oid); ipentry = varname + 7; printf("ip:\n"); count = sizeof(ip_stattab) / sizeof(struct stat_table); while (count--) { *ipentry = sp->entry; var = getvarbyname(Session, varname, varname_len); if (var && var->val.integer) { putchar('\t'); printf(sp->description, *var->val.integer, plural((int) *var->val.integer)); putchar('\n'); } if (var) snmp_free_var(var); sp++; } }
/* * Print a running summary of interface statistics. * Repeat display every interval seconds, showing statistics * collected over that interval. Assumes that interval is non-zero. * First line printed at top of screen is always cumulative. */ static void sidewaysintpr(unsigned int interval) { register struct iftot *ip, *total; register int line; struct iftot *lastif, *sum, *interesting, ifnow, *now = &ifnow; struct variable_list *var; oid varname[MAX_OID_LEN], *instance, *ifentry; size_t varname_len; int ifnum, cfg_nnets; lastif = iftot; sum = iftot + MAXIF - 1; total = sum - 1; interesting = iftot; var = getvarbyname(Session, oid_cfg_nnets, sizeof(oid_cfg_nnets) / sizeof(oid)); if (var) { cfg_nnets = *var->val.integer; snmp_free_var(var); } else return; memmove(varname, oid_ifname, sizeof(oid_ifname)); varname_len = sizeof(oid_ifname) / sizeof(oid); for (ifnum = 1, ip = iftot; ifnum <= cfg_nnets; ifnum++) { char *cp; ip->ift_name[0] = '('; varname[10] = ifnum; var = getvarbyname(Session, varname, varname_len); if (var){ if (var->val_len >= (sizeof(ip->ift_name) - 3)) var->val_len = (sizeof(ip->ift_name) - 4); memmove(ip->ift_name + 1, var->val.string, var->val_len); snmp_free_var(var); } cp = (char *) strchr(ip->ift_name, ' '); if ( cp != NULL ) *cp = '\0'; if (intrface && strcmp(ip->ift_name + 1, intrface) == 0) interesting = ip; ip->ift_name[15] = '\0'; cp = (char *) strchr(ip->ift_name, '\0'); sprintf(cp, ")"); ip++; if (ip >= iftot + MAXIF - 2) break; } lastif = ip; timerSet(interval); banner: printf(" input %-6.6s output ", interesting->ift_name); if (lastif - iftot > 0) printf(" input (Total) output"); for (ip = iftot; ip < iftot + MAXIF; ip++) { ip->ift_ip = 0; ip->ift_ie = 0; ip->ift_op = 0; ip->ift_oe = 0; ip->ift_co = 0; } putchar('\n'); printf("%10.10s %8.8s %10.10s %8.8s %8.8s ", "packets", "errs", "packets", "errs", "colls"); if (lastif - iftot > 0) printf("%10.10s %8.8s %10.10s %8.8s %8.8s ", "packets", "errs", "packets", "errs", "colls"); putchar('\n'); fflush(stdout); line = 0; loop: sum->ift_ip = 0; sum->ift_ie = 0; sum->ift_op = 0; sum->ift_oe = 0; sum->ift_co = 0; memmove(varname, oid_ifinucastpkts, sizeof(oid_ifinucastpkts)); varname_len = sizeof(oid_ifinucastpkts) / sizeof(oid); ifentry = varname + 9; instance = varname + 10; for (ifnum = 1, ip = iftot; ifnum <= cfg_nnets && ip < lastif; ip++, ifnum++) { memset(now, 0, sizeof(*now)); *instance = ifnum; *ifentry = INUCASTPKTS; var = getvarbyname(Session, varname, varname_len); if (var) { now->ift_ip = *var->val.integer; snmp_free_var(var); } *ifentry = INNUCASTPKTS; var = getvarbyname(Session, varname, varname_len); if (var) { now->ift_ip += *var->val.integer; snmp_free_var(var); } *ifentry = INERRORS; var = getvarbyname(Session, varname, varname_len); if (var) { now->ift_ie = *var->val.integer; snmp_free_var(var); } *ifentry = OUTUCASTPKTS; var = getvarbyname(Session, varname, varname_len); if (var) { now->ift_op = *var->val.integer; snmp_free_var(var); } *ifentry = OUTNUCASTPKTS; var = getvarbyname(Session, varname, varname_len); if (var) { now->ift_op += *var->val.integer; snmp_free_var(var); } *ifentry = OUTERRORS; var = getvarbyname(Session, varname, varname_len); if (var) { now->ift_oe = *var->val.integer; snmp_free_var(var); } if (ip == interesting) printf("%10d %8d %10d %8d %8d ", now->ift_ip - ip->ift_ip, now->ift_ie - ip->ift_ie, now->ift_op - ip->ift_op, now->ift_oe - ip->ift_oe, now->ift_co - ip->ift_co); ip->ift_ip = now->ift_ip; ip->ift_ie = now->ift_ie; ip->ift_op = now->ift_op; ip->ift_oe = now->ift_oe; ip->ift_co = now->ift_co; sum->ift_ip += ip->ift_ip; sum->ift_ie += ip->ift_ie; sum->ift_op += ip->ift_op; sum->ift_oe += ip->ift_oe; sum->ift_co += ip->ift_co; } if (lastif - iftot > 0) printf("%10d %8d %10d %8d %8d ", sum->ift_ip - total->ift_ip, sum->ift_ie - total->ift_ie, sum->ift_op - total->ift_op, sum->ift_oe - total->ift_oe, sum->ift_co - total->ift_co); *total = *sum; putchar('\n'); fflush(stdout); line++; timerPause(); timerSet(interval); if (line == 21) goto banner; goto loop; /*NOTREACHED*/ }
/* * Print a description of the network interfaces. */ void intpro(int interval) { oid varname[MAX_OID_LEN], *instance, *ifentry; size_t varname_len; int ifnum, cfg_nnets; oid curifip [4]; struct variable_list *var; struct snmp_pdu *request, *response; int status; int ifindex, oldindex = 0; struct _if_info { int ifindex; char name[128]; char ip[128], route[128]; char ioctets[20], ierrs[20], ooctets[20], oerrs[20], outqueue[20]; int operstatus; u_long netmask; struct in_addr ifip, ifroute; } *if_table, *cur_if; int max_name = 4, max_route = 7, max_ip = 7, max_ioctets = 7, max_ooctets = 7; int i; if (interval) { sidewaysintpr((unsigned)interval); return; } var = getvarbyname(Session, oid_cfg_nnets, sizeof(oid_cfg_nnets) / sizeof(oid)); if (var && var->val.integer) { cfg_nnets = *var->val.integer; snmp_free_var(var); } else { fprintf (stderr, "No response when requesting number of interfaces.\n"); return; } DEBUGMSGTL (("netstat:if", "cfg_nnets = %d\n", cfg_nnets)); memset (curifip, 0, sizeof (curifip)); if_table = (struct _if_info *) calloc (cfg_nnets, sizeof (*if_table)); cur_if = if_table; for (ifnum = 1; ifnum <= cfg_nnets; ifnum++) { register char *cp; request = snmp_pdu_create (SNMP_MSG_GETNEXT); memmove (varname, oid_ipadentaddr, sizeof (oid_ipadentaddr)); varname_len = sizeof (oid_ipadentaddr) / sizeof (oid); instance = varname + 9; memmove (varname + 10, curifip, sizeof (curifip)); *instance = IPIFINDEX; snmp_add_null_var (request, varname, varname_len); *instance = IPADDR; snmp_add_null_var (request, varname, varname_len); *instance = IPNETMASK; snmp_add_null_var (request, varname, varname_len); status = snmp_synch_response (Session, request, &response); if (status != STAT_SUCCESS || response->errstat != SNMP_ERR_NOERROR) { fprintf (stderr, "SNMP request failed for interface %d, variable %ld out of %d interfaces (IP)\n", ifnum, response->errindex, cfg_nnets); cfg_nnets = ifnum; break; } for (var = response->variables; var; var = var->next_variable) { if (snmp_get_do_debugging()) { print_variable (var->name, var->name_length, var); } switch (var->name [9]) { case IPIFINDEX: ifindex = *var->val.integer; for (cur_if = if_table; cur_if->ifindex != ifindex && cur_if->ifindex != 0; cur_if++); cur_if->ifindex = ifindex; break; case IPADDR: memmove (curifip, var->name+10, sizeof (curifip)); memmove (&cur_if->ifip, var->val.string, sizeof (u_long)); break; case IPNETMASK: memmove (&cur_if->netmask, var->val.string, sizeof (u_long)); } } cur_if->ifroute.s_addr = cur_if->ifip.s_addr & cur_if->netmask; if (cur_if->ifroute.s_addr) strcpy(cur_if->route, netname (cur_if->ifroute, cur_if->netmask)); else strcpy(cur_if->route, "none"); if ((i = strlen(cur_if->route)) > max_route) max_route = i; if (cur_if->ifip.s_addr) strcpy(cur_if->ip, routename (cur_if->ifip)); else strcpy(cur_if->ip, "none"); if ((i = strlen(cur_if->ip)) > max_ip) max_ip = i; snmp_free_pdu (response); memmove (varname, oid_ifname, sizeof(oid_ifname)); varname_len = sizeof(oid_ifname) / sizeof(oid); ifentry = varname + 9; instance = varname + 10; request = snmp_pdu_create (SNMP_MSG_GETNEXT); *instance = oldindex; *ifentry = IFINDEX; snmp_add_null_var (request, varname, varname_len); *ifentry = IFNAME; snmp_add_null_var (request, varname, varname_len); *ifentry = IFOPERSTATUS; snmp_add_null_var (request, varname, varname_len); *ifentry = INOCTETS; snmp_add_null_var (request, varname, varname_len); *ifentry = OUTOCTETS; snmp_add_null_var (request, varname, varname_len); while ((status = snmp_synch_response (Session, request, &response)) == STAT_SUCCESS) { if (response->errstat != SNMP_ERR_NOSUCHNAME) break; if ((request = snmp_fix_pdu(response, SNMP_MSG_GETNEXT)) == NULL) break; snmp_free_pdu(response); } if (status != STAT_SUCCESS || response->errstat != SNMP_ERR_NOERROR) { fprintf (stderr, "SNMP request failed for interface %d, variable %ld out of %d interfaces (IF)\n", ifnum, response->errindex, cfg_nnets); cfg_nnets = ifnum; break; } for (var = response->variables; var; var = var->next_variable) { if (snmp_get_do_debugging()) { print_variable (var->name, var->name_length, var); } if (!var->val.integer) continue; switch (var->name [9]) { case IFINDEX: ifindex = *var->val.integer; for (cur_if = if_table; cur_if->ifindex != ifindex && cur_if->ifindex != 0; cur_if++); cur_if->ifindex = ifindex; break; case INOCTETS: sprintf(cur_if->ioctets, "%lu", *var->val.integer); i = strlen(cur_if->ioctets); if (i > max_ioctets) max_ioctets = i; break; case OUTOCTETS: sprintf(cur_if->ooctets, "%lu", *var->val.integer); i = strlen(cur_if->ooctets); if (i > max_ooctets) max_ooctets = i; break; case IFNAME: oldindex = var->name[10]; if (var->val_len >= sizeof(cur_if->name)) var->val_len = sizeof(cur_if->name) - 1; memmove (cur_if->name, var->val.string, var->val_len); cur_if->name [var->val_len] = 0; if ((i = strlen(cur_if->name)+1) > max_name) max_name = i; break; case IFOPERSTATUS: cur_if->operstatus = *var->val.integer; break; } } snmp_free_pdu (response); if (intrface != NULL && strcmp(cur_if->name, intrface) != 0) { cur_if->name [0] = 0; continue; } if (cur_if->operstatus != MIB_IFSTATUS_UP) { cp = strchr(cur_if->name, '\0'); *cp++ = '*'; *cp = '\0'; } } printf("%*.*s %*.*s %*.*s %*.*s %*.*s ", -max_name, max_name, "Name", -max_route, max_route, "Network", -max_ip, max_ip, "Address", max_ioctets, max_ioctets, "Ioctets", max_ooctets, max_ooctets, "Ooctets"); putchar('\n'); for (ifnum = 0, cur_if = if_table; ifnum < cfg_nnets; ifnum++, cur_if++) { if (cur_if->name [0] == 0) continue; printf("%*.*s ", -max_name, max_name, cur_if->name); printf("%*.*s ", -max_route, max_route, cur_if->route); printf("%*.*s ", -max_ip, max_ip, cur_if->ip); printf("%*s %*s", max_ioctets, cur_if->ioctets, max_ioctets, cur_if->ooctets); putchar('\n'); } free(if_table); }
/* * Dump ICMP statistics. */ void icmp_stats(void) { oid varname[MAX_OID_LEN], *icmpentry; int varname_len; netsnmp_variable_list *var; int count, first; struct stat_table *sp; memmove(varname, oid_icmpstats, sizeof(oid_icmpstats)); varname_len = sizeof(oid_icmpstats) / sizeof(oid); icmpentry = varname + 7; printf("icmp:\n"); sp = icmp_stattab; count = sizeof(icmp_stattab) / sizeof(struct stat_table); while (count--) { *icmpentry = sp->entry; var = getvarbyname(Session, varname, varname_len); if (var && var->val.integer) { putchar('\t'); printf(sp->description, *var->val.integer, plural((int) *var->val.integer)); putchar('\n'); } if (var) snmp_free_var(var); sp++; } sp = icmp_outhistogram; first = 1; count = sizeof(icmp_outhistogram) / sizeof(struct stat_table); while (count--) { *icmpentry = sp->entry; var = getvarbyname(Session, varname, varname_len); if (var && var->val.integer && *var->val.integer != 0) { if (first) { printf("\tOutput Histogram:\n"); first = 0; } printf("\t\t"); printf(sp->description, *var->val.integer, plural((int) *var->val.integer)); putchar('\n'); } if (var) snmp_free_var(var); sp++; } sp = icmp_inhistogram; first = 1; count = sizeof(icmp_inhistogram) / sizeof(struct stat_table); while (count--) { *icmpentry = sp->entry; var = getvarbyname(Session, varname, varname_len); if (var && var->val.integer && *var->val.integer != 0) { if (first) { printf("\tInput Histogram:\n"); first = 0; } printf("\t\t"); printf(sp->description, *var->val.integer, plural((int) *var->val.integer)); putchar('\n'); } if (var) snmp_free_var(var); sp++; } }