Как выяснить, находится ли запрошенный OID в таблице с net-snmp API? - PullRequest
0 голосов
/ 12 июня 2018

Я работаю над решением для расширения агента SNMP для Windows.Одновременно я использую Net-SNMP для чтения и загрузки OID из файлов MIB.Сопоставление старых объектов SNMP с объектами Net-SNMP - сложная работа в C ++, и я серьезно это сделал.Теперь возникает множество проблем с запросами Set, Get-Next для объектов Table.

Важным моментом является то, как установить OID, который теперь ссылается на записи таблицы или поля.

Как проверить, еслизапрошенный OID для запроса Get или Set - это поле или записи таблицы в MIB с Net-SNMP API?

1 Ответ

0 голосов
/ 18 июня 2018

Вот некоторая функция, которую я готовлю для выяснения элементов таблицы:

Если Oid является полем таблицы:

BOOL IsInTable(AsnObjectIdentifier pAsnOid) {
    char *          szOidTemp;
    char *          pch;
    oid             root[MAX_OID_LEN];
    size_t          rootlen;

    SnmpMgrOidToStr(&pAsnOid, &szOidTemp);

    memset(root, 0, sizeof(root));
    rootlen = MAX_OID_LEN;
    if (snmp_parse_oid(szOidTemp, root, &rootlen) == NULL) {
        snmp_perror(szOidTemp);
        //exit(1);
        return false;
    }

    struct tree    *tbl = NULL;
    tbl = get_tree(root, rootlen, get_tree_head());

    if (tbl) {
        if (tbl->parent && strstr(strlwr(tbl->parent->label), "entry") > 0) {
            return true;
        }
    }
    return false;
}

Если Oid является корнем таблицы:

BOOL IsTableRoot(AsnObjectIdentifier pAsnOid) {
    char *          szOidTemp;
    char *          pch;
    oid             root[MAX_OID_LEN];
    size_t          rootlen;

    SnmpMgrOidToStr(&pAsnOid, &szOidTemp);

    memset(root, 0, sizeof(root));
    rootlen = MAX_OID_LEN;
    if (snmp_parse_oid(szOidTemp, root, &rootlen) == NULL) {
        snmp_perror(szOidTemp);
        //exit(1);
        return false;
    }

    struct tree    *tbl = NULL;
    tbl = get_tree(root, rootlen, get_tree_head());

    if (tbl) {
        if (strstr(strlwr(tbl->label), "table") > 0) {
            return true;
        }
    }
    return false;
}

Если Oid является записью или первым дочерним элементом таблицы:

BOOL IsTableEntry(AsnObjectIdentifier pAsnOid) {
    char *          szOidTemp;
    char *          pch;
    oid             root[MAX_OID_LEN];
    size_t          rootlen;

    SnmpMgrOidToStr(&pAsnOid, &szOidTemp);

    memset(root, 0, sizeof(root));
    rootlen = MAX_OID_LEN;
    if (snmp_parse_oid(szOidTemp, root, &rootlen) == NULL) {
        snmp_perror(szOidTemp);
        //exit(1);
        return false;
    }

    struct tree    *tbl = NULL;
    tbl = get_tree(root, rootlen, get_tree_head());

    if (tbl) {
        if (strstr(strlwr(tbl->label), "entry") > 0) {
            return true;
        }
    }
    return false;
}
...