Bonjour,

Je développe une application (sous Linux RedHat) devant être supervisée via SNMP. La machine possède un agent SNMP de Net-SNMP, et mon application embarque la lib AgentX++ afin d'implémenter un sous-agent qui gère la MIB dédiée à l'application. Si mon application elle-même n'a que peu à voir avec le développement réseau, le sujet (SNMP) m'a semblé justifié un post ici (mes recherches sur SNMP sur le site m'ont mené à cette section).

J'ai eu des difficultés à trouver des informations précises sur les bonnes pratiques pour la gestion des tables partagées (AgentXSharedTable) ayant plusieurs clés (un exemple va suivre).

L'environnement :
Mon souci vient de table dont la description est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
EquipmentInfoTable OBJECT-TYPE
    SYNTAX      SEQUENCE OF EquipmentInfoEntry
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION
	 "ma Table"
    ::= { Noeud_superieur 6 }

EquipmentInfoEntry OBJECT-TYPE
    SYNTAX      EquipmentInfoDesc
    MAX-ACCESS  not-accessible
    STATUS      current
    DESCRIPTION "XXXX"
    INDEX   { SystemIndex, ComposantIndex, EquipmentInfoIndex }
    ::= { EquipmentInfoTable 1 }
    
EquipmentInfoDesc ::= SEQUENCE {
	EquipmentInfoIndex      INTEGER,
	EquipmentInfo1		INTEGER
}

EquipmentInfoIndex OBJECT-TYPE
    SYNTAX INTEGER (1..16)
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION ""
    ::= { EquipmentInfoEntry 1 }

EquipmentInfo1 OBJECT-TYPE
    SYNTAX INTEGER
    MAX-ACCESS  read-only
    STATUS      current
    DESCRIPTION ""
    ::= { EquipmentInfoEntry 2 }
Dans la suite, je parlerai d'index pour décrire le triplet
Code : Sélectionner tout - Visualiser dans une fenêtre à part
INDEX   { SystemIndex, ComposantIndex, EquipmentInfoIndex }
Et je parlerai de clé pour décrire les objets de type L'indexation des lignes de cette table doit être de cette forme :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
xxx.1.1.1
xxx.1.1.2
xxx.1.1.3
xxx.1.1.4
xxx.1.2.1
...
Avec, contrairement à ce que laisse supposer le fichier descriptif de mib, la clé
EquipmentInfoIndex allant de 1 à 4, et les clés SystemIndex et ComposantIndex allant respectivement de 1 à 1 et de 1 à 20.

La clé EquipmentIndex appartient donc bien à la table en question, et les deux autres clés appartiennent sont les clés formant l'index d'une autre table.


L'objet du délit:
Les docs que j'ai pu lire indiquent d'effectuer une demande d'allocation d'index auprès du master agent avant d'effectuer l'ajout de ligne dans la table lors d'un réveil sur callback 'index_allocated'.

C'est donc là que je me heurte à mon premier problème (du moins le premier que je vais aborder ici, car d'autres points qui fonctionnent m'ont l'air de plus tenir de la bidouille que de la bonne pratique. Mais chaque chose en son temps.). En effet, le master agent, lors de l'allocation des index, cherche manifestement à allouer chaque clé séparément. Donc les lignes d'index 1.1.1, 2.2.2, 3.3.3, etc (du moins si elles existaient, puisque je ne dépasse pas 1.20.4) sont bien allouées, mais dès 1.1.2, puisque les deux premières clés de l'index sont déjà allouées pour l'index de la première ligne, l'allocation échoue.

Or, si j'interroge la table ipNetToMediaTable (OID : .1.3.6.1.2.1.4.22 ) Je vois que cette table est composée d'un index de deux clés, et les 4 lignes présentes affichent toutes une clés ayant la même valeur (2 en l'occurence), et une clés dont la valeur varie (une adresse IP).

J'en déduie donc que ce que je cherche à faire est possible, mais je n'ai aucune idée de la manière de le faire.

Je prends donc tous les conseils sur le problème épineux du SNMP (voir ci après un extrait de mon sous agent).

Merci,
Cordialement,
Simon N.

Sous-agent :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
int wait = 0;
SubAgentXMib* mib;
AgentXSlave* agentx;
AgentXRequestList* reqList;
Request* req;
   
// Signals init.
signal(SIGTERM, sig);
signal(SIGINT, sig);

mib = new SubAgentXMib();
	
agentx = new AgentXSlave();
agentx->set_unix_port_loc("/var/agentx/");
agentx->set_connect_mode(AX_USE_UNIX_SOCKET | AX_USE_TCP_SOCKET);

reqList = new AgentXRequestList(agentx);
mib->set_request_list(reqList);

EquipmentTable* pEquipmentTable = new EquipmentTable("", mib);
/* [test sur allocation pEquipmentTable] */

mib->add_no_reg(pEquipmentTable );

boolean MibReady = mib->init();

Oidx rowOidx = pEquipmentTable->get_next_avail_index();
pEquipmentTable ->add_row(rowOidx);

// Main loop.
while( b_run )
{
	if(!mib->get_agentx()->quit() && MibReady)
	{
		req = reqList->receive(1000);	// Blocking !
		wait += 1000;
		if(req != 0)
		{
			mib->process_request(req);
		}
		else if (wait == 10000)
		{
		  wait = 0;
		  mib->ping_master();
		}
	}
	else
	{
		  // If the subagent lost the connection to the master agent, we try to reconnect.
		MibReady = mib->init();
		usleep(snmpReconnectDelay);

	}
}
Avec pour la table :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

#define INDEX_SIZE 3

/* information about the System index */
#define SYSTEM_TABLE_KEY_OID "1.3.6.1.4.1.XXX.1.1.1"
#define SYSTEM_TABLE_KEY_INFO { sNMP_SYNTAX_INT, FALSE, 1, 1 }

/* information about the Composant index */
#define COMPOSANT_TABLE_KEY_OID "1.3.6.1.4.1.XXX.1.1.2"
#define COMPOSANT_TABLE_KEY_INFO { sNMP_SYNTAX_INT, FALSE, 1, 1}

/* information about the Equipment index */
#define EQUIPMENT_TABLE_KEY_OID "1.3.6.1.4.1.XXX.2.1.1"
#define EQUIPMENT_TABLE_KEY_INFO { sNMP_SYNTAX_INT, FALSE, 1, 1 }

/* definition of the index of the table */

const index_info indTable[INDEX_SIZE ] = {
    SYSTEM_TABLE_KEY_INFO, COMPOSANT_TABLE_KEY_INFO, EQUIPMENT_TABLE_KEY_INFO};

    const Oidx indTableOIDs[INDEX_SIZE ] = {
        SYSTEM_TABLE_KEY_OID, COMPOSANT_TABLE_KEY_OID, EQUIPMENT_TABLE_KEY_OID};

EquipmentInfoTable::EquipmentInfoTable(const OctetStr& context, SubAgentXMib* mib)
    : AgentXSharedTable("1.3.6.1.4.1.XXX.2.1", indTable, INDEX_SIZE, indTableOIDs, mib, context)

{
   
    SystemIndex_ = new SnmpInt32MinMax("1", NOACCESS, 1,1);
    ComposantIndex_ = new SnmpInt32MinMax("2", NOACCESS, 1,20);
    EquipmentInfoIndex_ = new SnmpInt32MinMax("2", NOACCESS, 1,4);
    EquipmentInfo1 = new SnmpInt32("3", READONLY, new SnmpInt32());
        
    add_col(SystemIndex_ );
    add_col(ComposantIndex_ );
    add_col(EquipmentInfoIndex_ );
    add_col(EquipmentInfo1 );

}