Esempio n. 1
0
/*
 * 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++;
    }

}
Esempio n. 2
0
/*
 * 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*/
}
Esempio n. 3
0
/*
 * 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);
}
Esempio n. 4
0
/*
 * 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++;
    }
}