xref: /aosp_15_r20/external/libcups/cups/testsnmp.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker  * SNMP test program for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker  *
4*5e7646d2SAndroid Build Coastguard Worker  * Copyright 2008-2014 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker  *
6*5e7646d2SAndroid Build Coastguard Worker  * Licensed under Apache License v2.0.  See the file "LICENSE" for more information.
7*5e7646d2SAndroid Build Coastguard Worker  */
8*5e7646d2SAndroid Build Coastguard Worker 
9*5e7646d2SAndroid Build Coastguard Worker /*
10*5e7646d2SAndroid Build Coastguard Worker  * Include necessary headers...
11*5e7646d2SAndroid Build Coastguard Worker  */
12*5e7646d2SAndroid Build Coastguard Worker 
13*5e7646d2SAndroid Build Coastguard Worker #include "cups-private.h"
14*5e7646d2SAndroid Build Coastguard Worker #include "snmp-private.h"
15*5e7646d2SAndroid Build Coastguard Worker 
16*5e7646d2SAndroid Build Coastguard Worker 
17*5e7646d2SAndroid Build Coastguard Worker /*
18*5e7646d2SAndroid Build Coastguard Worker  * Local functions...
19*5e7646d2SAndroid Build Coastguard Worker  */
20*5e7646d2SAndroid Build Coastguard Worker 
21*5e7646d2SAndroid Build Coastguard Worker static void	print_packet(cups_snmp_t *packet, void *data);
22*5e7646d2SAndroid Build Coastguard Worker static int	show_oid(int fd, const char *community,
23*5e7646d2SAndroid Build Coastguard Worker 		         http_addr_t *addr, const char *s, int walk);
24*5e7646d2SAndroid Build Coastguard Worker static void	usage(void) _CUPS_NORETURN;
25*5e7646d2SAndroid Build Coastguard Worker 
26*5e7646d2SAndroid Build Coastguard Worker 
27*5e7646d2SAndroid Build Coastguard Worker /*
28*5e7646d2SAndroid Build Coastguard Worker  * 'main()' - Main entry.
29*5e7646d2SAndroid Build Coastguard Worker  */
30*5e7646d2SAndroid Build Coastguard Worker 
31*5e7646d2SAndroid Build Coastguard Worker int					/* O - Exit status */
main(int argc,char * argv[])32*5e7646d2SAndroid Build Coastguard Worker main(int  argc,				/* I - Number of command-line args */
33*5e7646d2SAndroid Build Coastguard Worker      char *argv[])			/* I - Command-line arguments */
34*5e7646d2SAndroid Build Coastguard Worker {
35*5e7646d2SAndroid Build Coastguard Worker   int			i;		/* Looping var */
36*5e7646d2SAndroid Build Coastguard Worker   int			fd = -1;	/* SNMP socket */
37*5e7646d2SAndroid Build Coastguard Worker   http_addrlist_t	*host = NULL;	/* Address of host */
38*5e7646d2SAndroid Build Coastguard Worker   int			walk = 0;	/* Walk OIDs? */
39*5e7646d2SAndroid Build Coastguard Worker   char			*oid = NULL;	/* Last OID shown */
40*5e7646d2SAndroid Build Coastguard Worker   const char		*community;	/* Community name */
41*5e7646d2SAndroid Build Coastguard Worker 
42*5e7646d2SAndroid Build Coastguard Worker 
43*5e7646d2SAndroid Build Coastguard Worker   fputs("_cupsSNMPDefaultCommunity: ", stdout);
44*5e7646d2SAndroid Build Coastguard Worker 
45*5e7646d2SAndroid Build Coastguard Worker   if ((community = _cupsSNMPDefaultCommunity()) == NULL)
46*5e7646d2SAndroid Build Coastguard Worker   {
47*5e7646d2SAndroid Build Coastguard Worker     puts("FAIL (NULL community name)");
48*5e7646d2SAndroid Build Coastguard Worker     return (1);
49*5e7646d2SAndroid Build Coastguard Worker   }
50*5e7646d2SAndroid Build Coastguard Worker 
51*5e7646d2SAndroid Build Coastguard Worker   printf("PASS (%s)\n", community);
52*5e7646d2SAndroid Build Coastguard Worker 
53*5e7646d2SAndroid Build Coastguard Worker  /*
54*5e7646d2SAndroid Build Coastguard Worker   * Query OIDs from the command-line...
55*5e7646d2SAndroid Build Coastguard Worker   */
56*5e7646d2SAndroid Build Coastguard Worker 
57*5e7646d2SAndroid Build Coastguard Worker   for (i = 1; i < argc; i ++)
58*5e7646d2SAndroid Build Coastguard Worker     if (!strcmp(argv[i], "-c"))
59*5e7646d2SAndroid Build Coastguard Worker     {
60*5e7646d2SAndroid Build Coastguard Worker       i ++;
61*5e7646d2SAndroid Build Coastguard Worker 
62*5e7646d2SAndroid Build Coastguard Worker       if (i >= argc)
63*5e7646d2SAndroid Build Coastguard Worker         usage();
64*5e7646d2SAndroid Build Coastguard Worker       else
65*5e7646d2SAndroid Build Coastguard Worker         community = argv[i];
66*5e7646d2SAndroid Build Coastguard Worker     }
67*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(argv[i], "-d"))
68*5e7646d2SAndroid Build Coastguard Worker       _cupsSNMPSetDebug(10);
69*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(argv[i], "-w"))
70*5e7646d2SAndroid Build Coastguard Worker       walk = 1;
71*5e7646d2SAndroid Build Coastguard Worker     else if (!host)
72*5e7646d2SAndroid Build Coastguard Worker     {
73*5e7646d2SAndroid Build Coastguard Worker       if ((host = httpAddrGetList(argv[i], AF_UNSPEC, "161")) == NULL)
74*5e7646d2SAndroid Build Coastguard Worker       {
75*5e7646d2SAndroid Build Coastguard Worker 	printf("testsnmp: Unable to find \"%s\"!\n", argv[1]);
76*5e7646d2SAndroid Build Coastguard Worker 	return (1);
77*5e7646d2SAndroid Build Coastguard Worker       }
78*5e7646d2SAndroid Build Coastguard Worker 
79*5e7646d2SAndroid Build Coastguard Worker       if (fd < 0)
80*5e7646d2SAndroid Build Coastguard Worker       {
81*5e7646d2SAndroid Build Coastguard Worker 	fputs("_cupsSNMPOpen: ", stdout);
82*5e7646d2SAndroid Build Coastguard Worker 
83*5e7646d2SAndroid Build Coastguard Worker 	if ((fd = _cupsSNMPOpen(host->addr.addr.sa_family)) < 0)
84*5e7646d2SAndroid Build Coastguard Worker 	{
85*5e7646d2SAndroid Build Coastguard Worker 	  printf("FAIL (%s)\n", strerror(errno));
86*5e7646d2SAndroid Build Coastguard Worker 	  return (1);
87*5e7646d2SAndroid Build Coastguard Worker 	}
88*5e7646d2SAndroid Build Coastguard Worker 
89*5e7646d2SAndroid Build Coastguard Worker 	puts("PASS");
90*5e7646d2SAndroid Build Coastguard Worker       }
91*5e7646d2SAndroid Build Coastguard Worker     }
92*5e7646d2SAndroid Build Coastguard Worker     else if (!show_oid(fd, community, &(host->addr), argv[i], walk))
93*5e7646d2SAndroid Build Coastguard Worker       return (1);
94*5e7646d2SAndroid Build Coastguard Worker     else
95*5e7646d2SAndroid Build Coastguard Worker       oid = argv[i];
96*5e7646d2SAndroid Build Coastguard Worker 
97*5e7646d2SAndroid Build Coastguard Worker   if (!host)
98*5e7646d2SAndroid Build Coastguard Worker     usage();
99*5e7646d2SAndroid Build Coastguard Worker 
100*5e7646d2SAndroid Build Coastguard Worker   if (!oid)
101*5e7646d2SAndroid Build Coastguard Worker   {
102*5e7646d2SAndroid Build Coastguard Worker     if (!show_oid(fd, community,  &(host->addr),
103*5e7646d2SAndroid Build Coastguard Worker                   walk ? ".1.3.6.1.2.1.43" :
104*5e7646d2SAndroid Build Coastguard Worker 		         ".1.3.6.1.2.1.43.10.2.1.4.1.1", walk))
105*5e7646d2SAndroid Build Coastguard Worker       return (1);
106*5e7646d2SAndroid Build Coastguard Worker   }
107*5e7646d2SAndroid Build Coastguard Worker 
108*5e7646d2SAndroid Build Coastguard Worker   return (0);
109*5e7646d2SAndroid Build Coastguard Worker }
110*5e7646d2SAndroid Build Coastguard Worker 
111*5e7646d2SAndroid Build Coastguard Worker 
112*5e7646d2SAndroid Build Coastguard Worker /*
113*5e7646d2SAndroid Build Coastguard Worker  * 'print_packet()' - Print the contents of the response packet.
114*5e7646d2SAndroid Build Coastguard Worker  */
115*5e7646d2SAndroid Build Coastguard Worker 
116*5e7646d2SAndroid Build Coastguard Worker static void
print_packet(cups_snmp_t * packet,void * data)117*5e7646d2SAndroid Build Coastguard Worker print_packet(cups_snmp_t *packet,	/* I - SNMP response packet */
118*5e7646d2SAndroid Build Coastguard Worker              void        *data)		/* I - User data pointer (not used) */
119*5e7646d2SAndroid Build Coastguard Worker {
120*5e7646d2SAndroid Build Coastguard Worker   unsigned	i;			/* Looping var */
121*5e7646d2SAndroid Build Coastguard Worker   char		temp[1024];		/* Temporary OID string */
122*5e7646d2SAndroid Build Coastguard Worker 
123*5e7646d2SAndroid Build Coastguard Worker 
124*5e7646d2SAndroid Build Coastguard Worker   (void)data;
125*5e7646d2SAndroid Build Coastguard Worker 
126*5e7646d2SAndroid Build Coastguard Worker   printf("%s = ", _cupsSNMPOIDToString(packet->object_name, temp, sizeof(temp)));
127*5e7646d2SAndroid Build Coastguard Worker 
128*5e7646d2SAndroid Build Coastguard Worker   switch (packet->object_type)
129*5e7646d2SAndroid Build Coastguard Worker   {
130*5e7646d2SAndroid Build Coastguard Worker     case CUPS_ASN1_BOOLEAN :
131*5e7646d2SAndroid Build Coastguard Worker 	printf("BOOLEAN %s\n",
132*5e7646d2SAndroid Build Coastguard Worker 	       packet->object_value.boolean ? "TRUE" : "FALSE");
133*5e7646d2SAndroid Build Coastguard Worker 	break;
134*5e7646d2SAndroid Build Coastguard Worker 
135*5e7646d2SAndroid Build Coastguard Worker     case CUPS_ASN1_INTEGER :
136*5e7646d2SAndroid Build Coastguard Worker 	printf("INTEGER %d\n", packet->object_value.integer);
137*5e7646d2SAndroid Build Coastguard Worker 	break;
138*5e7646d2SAndroid Build Coastguard Worker 
139*5e7646d2SAndroid Build Coastguard Worker     case CUPS_ASN1_BIT_STRING :
140*5e7646d2SAndroid Build Coastguard Worker 	printf("BIT-STRING \"%s\"\n",
141*5e7646d2SAndroid Build Coastguard Worker 	       (char *)packet->object_value.string.bytes);
142*5e7646d2SAndroid Build Coastguard Worker 	break;
143*5e7646d2SAndroid Build Coastguard Worker 
144*5e7646d2SAndroid Build Coastguard Worker     case CUPS_ASN1_OCTET_STRING :
145*5e7646d2SAndroid Build Coastguard Worker 	printf("OCTET-STRING \"%s\"\n",
146*5e7646d2SAndroid Build Coastguard Worker 	       (char *)packet->object_value.string.bytes);
147*5e7646d2SAndroid Build Coastguard Worker 	break;
148*5e7646d2SAndroid Build Coastguard Worker 
149*5e7646d2SAndroid Build Coastguard Worker     case CUPS_ASN1_NULL_VALUE :
150*5e7646d2SAndroid Build Coastguard Worker 	puts("NULL-VALUE");
151*5e7646d2SAndroid Build Coastguard Worker 	break;
152*5e7646d2SAndroid Build Coastguard Worker 
153*5e7646d2SAndroid Build Coastguard Worker     case CUPS_ASN1_OID :
154*5e7646d2SAndroid Build Coastguard Worker 	printf("OID %s\n", _cupsSNMPOIDToString(packet->object_value.oid,
155*5e7646d2SAndroid Build Coastguard Worker 	                                        temp, sizeof(temp)));
156*5e7646d2SAndroid Build Coastguard Worker 	break;
157*5e7646d2SAndroid Build Coastguard Worker 
158*5e7646d2SAndroid Build Coastguard Worker     case CUPS_ASN1_HEX_STRING :
159*5e7646d2SAndroid Build Coastguard Worker 	fputs("Hex-STRING", stdout);
160*5e7646d2SAndroid Build Coastguard Worker 	for (i = 0; i < packet->object_value.string.num_bytes; i ++)
161*5e7646d2SAndroid Build Coastguard Worker 	  printf(" %02X", packet->object_value.string.bytes[i]);
162*5e7646d2SAndroid Build Coastguard Worker 	putchar('\n');
163*5e7646d2SAndroid Build Coastguard Worker 	break;
164*5e7646d2SAndroid Build Coastguard Worker 
165*5e7646d2SAndroid Build Coastguard Worker     case CUPS_ASN1_COUNTER :
166*5e7646d2SAndroid Build Coastguard Worker 	printf("Counter %d\n", packet->object_value.counter);
167*5e7646d2SAndroid Build Coastguard Worker 	break;
168*5e7646d2SAndroid Build Coastguard Worker 
169*5e7646d2SAndroid Build Coastguard Worker     case CUPS_ASN1_GAUGE :
170*5e7646d2SAndroid Build Coastguard Worker 	printf("Gauge %u\n", packet->object_value.gauge);
171*5e7646d2SAndroid Build Coastguard Worker 	break;
172*5e7646d2SAndroid Build Coastguard Worker 
173*5e7646d2SAndroid Build Coastguard Worker     case CUPS_ASN1_TIMETICKS :
174*5e7646d2SAndroid Build Coastguard Worker 	printf("Timeticks %u days, %u:%02u:%02u.%02u\n",
175*5e7646d2SAndroid Build Coastguard Worker 	       packet->object_value.timeticks / 8640000,
176*5e7646d2SAndroid Build Coastguard Worker 	       (packet->object_value.timeticks / 360000) % 24,
177*5e7646d2SAndroid Build Coastguard Worker 	       (packet->object_value.timeticks / 6000) % 60,
178*5e7646d2SAndroid Build Coastguard Worker 	       (packet->object_value.timeticks / 100) % 60,
179*5e7646d2SAndroid Build Coastguard Worker 	       packet->object_value.timeticks % 100);
180*5e7646d2SAndroid Build Coastguard Worker 	break;
181*5e7646d2SAndroid Build Coastguard Worker 
182*5e7646d2SAndroid Build Coastguard Worker     default :
183*5e7646d2SAndroid Build Coastguard Worker 	printf("Unknown-%X\n", packet->object_type);
184*5e7646d2SAndroid Build Coastguard Worker 	break;
185*5e7646d2SAndroid Build Coastguard Worker   }
186*5e7646d2SAndroid Build Coastguard Worker }
187*5e7646d2SAndroid Build Coastguard Worker 
188*5e7646d2SAndroid Build Coastguard Worker 
189*5e7646d2SAndroid Build Coastguard Worker /*
190*5e7646d2SAndroid Build Coastguard Worker  * 'show_oid()' - Show the specified OID.
191*5e7646d2SAndroid Build Coastguard Worker  */
192*5e7646d2SAndroid Build Coastguard Worker 
193*5e7646d2SAndroid Build Coastguard Worker static int				/* O - 1 on success, 0 on error */
show_oid(int fd,const char * community,http_addr_t * addr,const char * s,int walk)194*5e7646d2SAndroid Build Coastguard Worker show_oid(int         fd,		/* I - SNMP socket */
195*5e7646d2SAndroid Build Coastguard Worker          const char  *community,	/* I - Community name */
196*5e7646d2SAndroid Build Coastguard Worker 	 http_addr_t *addr,		/* I - Address to query */
197*5e7646d2SAndroid Build Coastguard Worker          const char  *s,		/* I - OID to query */
198*5e7646d2SAndroid Build Coastguard Worker 	 int         walk)		/* I - Walk OIDs? */
199*5e7646d2SAndroid Build Coastguard Worker {
200*5e7646d2SAndroid Build Coastguard Worker   int		i;			/* Looping var */
201*5e7646d2SAndroid Build Coastguard Worker   int		oid[CUPS_SNMP_MAX_OID];	/* OID */
202*5e7646d2SAndroid Build Coastguard Worker   cups_snmp_t	packet;			/* SNMP packet */
203*5e7646d2SAndroid Build Coastguard Worker   char		temp[1024];		/* Temporary OID string */
204*5e7646d2SAndroid Build Coastguard Worker 
205*5e7646d2SAndroid Build Coastguard Worker 
206*5e7646d2SAndroid Build Coastguard Worker   if (!_cupsSNMPStringToOID(s, oid, sizeof(oid) / sizeof(oid[0])))
207*5e7646d2SAndroid Build Coastguard Worker   {
208*5e7646d2SAndroid Build Coastguard Worker     puts("testsnmp: Bad OID");
209*5e7646d2SAndroid Build Coastguard Worker     return (0);
210*5e7646d2SAndroid Build Coastguard Worker   }
211*5e7646d2SAndroid Build Coastguard Worker 
212*5e7646d2SAndroid Build Coastguard Worker   if (walk)
213*5e7646d2SAndroid Build Coastguard Worker   {
214*5e7646d2SAndroid Build Coastguard Worker     printf("_cupsSNMPWalk(%s): ", _cupsSNMPOIDToString(oid, temp, sizeof(temp)));
215*5e7646d2SAndroid Build Coastguard Worker 
216*5e7646d2SAndroid Build Coastguard Worker     if (_cupsSNMPWalk(fd, addr, CUPS_SNMP_VERSION_1, community, oid, 5.0,
217*5e7646d2SAndroid Build Coastguard Worker                      print_packet, NULL) < 0)
218*5e7646d2SAndroid Build Coastguard Worker     {
219*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%s)\n", strerror(errno));
220*5e7646d2SAndroid Build Coastguard Worker       return (0);
221*5e7646d2SAndroid Build Coastguard Worker     }
222*5e7646d2SAndroid Build Coastguard Worker   }
223*5e7646d2SAndroid Build Coastguard Worker   else
224*5e7646d2SAndroid Build Coastguard Worker   {
225*5e7646d2SAndroid Build Coastguard Worker     printf("_cupsSNMPWrite(%s): ", _cupsSNMPOIDToString(oid, temp, sizeof(temp)));
226*5e7646d2SAndroid Build Coastguard Worker 
227*5e7646d2SAndroid Build Coastguard Worker     if (!_cupsSNMPWrite(fd, addr, CUPS_SNMP_VERSION_1, community,
228*5e7646d2SAndroid Build Coastguard Worker 		       CUPS_ASN1_GET_REQUEST, 1, oid))
229*5e7646d2SAndroid Build Coastguard Worker     {
230*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%s)\n", strerror(errno));
231*5e7646d2SAndroid Build Coastguard Worker       return (0);
232*5e7646d2SAndroid Build Coastguard Worker     }
233*5e7646d2SAndroid Build Coastguard Worker 
234*5e7646d2SAndroid Build Coastguard Worker     puts("PASS");
235*5e7646d2SAndroid Build Coastguard Worker 
236*5e7646d2SAndroid Build Coastguard Worker     fputs("_cupsSNMPRead(5.0): ", stdout);
237*5e7646d2SAndroid Build Coastguard Worker 
238*5e7646d2SAndroid Build Coastguard Worker     if (!_cupsSNMPRead(fd, &packet, 5.0))
239*5e7646d2SAndroid Build Coastguard Worker     {
240*5e7646d2SAndroid Build Coastguard Worker       puts("FAIL (timeout)");
241*5e7646d2SAndroid Build Coastguard Worker       return (0);
242*5e7646d2SAndroid Build Coastguard Worker     }
243*5e7646d2SAndroid Build Coastguard Worker 
244*5e7646d2SAndroid Build Coastguard Worker     if (!_cupsSNMPIsOID(&packet, oid))
245*5e7646d2SAndroid Build Coastguard Worker     {
246*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (bad OID %d", packet.object_name[0]);
247*5e7646d2SAndroid Build Coastguard Worker       for (i = 1; packet.object_name[i] >= 0; i ++)
248*5e7646d2SAndroid Build Coastguard Worker 	printf(".%d", packet.object_name[i]);
249*5e7646d2SAndroid Build Coastguard Worker       puts(")");
250*5e7646d2SAndroid Build Coastguard Worker       return (0);
251*5e7646d2SAndroid Build Coastguard Worker     }
252*5e7646d2SAndroid Build Coastguard Worker 
253*5e7646d2SAndroid Build Coastguard Worker     if (packet.error)
254*5e7646d2SAndroid Build Coastguard Worker     {
255*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%s)\n", packet.error);
256*5e7646d2SAndroid Build Coastguard Worker       return (0);
257*5e7646d2SAndroid Build Coastguard Worker     }
258*5e7646d2SAndroid Build Coastguard Worker 
259*5e7646d2SAndroid Build Coastguard Worker     puts("PASS");
260*5e7646d2SAndroid Build Coastguard Worker 
261*5e7646d2SAndroid Build Coastguard Worker     print_packet(&packet, NULL);
262*5e7646d2SAndroid Build Coastguard Worker   }
263*5e7646d2SAndroid Build Coastguard Worker 
264*5e7646d2SAndroid Build Coastguard Worker   return (1);
265*5e7646d2SAndroid Build Coastguard Worker }
266*5e7646d2SAndroid Build Coastguard Worker 
267*5e7646d2SAndroid Build Coastguard Worker 
268*5e7646d2SAndroid Build Coastguard Worker /*
269*5e7646d2SAndroid Build Coastguard Worker  * 'usage()' - Show program usage and exit.
270*5e7646d2SAndroid Build Coastguard Worker  */
271*5e7646d2SAndroid Build Coastguard Worker 
272*5e7646d2SAndroid Build Coastguard Worker static void
usage(void)273*5e7646d2SAndroid Build Coastguard Worker usage(void)
274*5e7646d2SAndroid Build Coastguard Worker {
275*5e7646d2SAndroid Build Coastguard Worker   puts("Usage: testsnmp [options] host-or-ip [oid ...]");
276*5e7646d2SAndroid Build Coastguard Worker   puts("");
277*5e7646d2SAndroid Build Coastguard Worker   puts("Options:");
278*5e7646d2SAndroid Build Coastguard Worker   puts("");
279*5e7646d2SAndroid Build Coastguard Worker   puts("  -c community    Set community name");
280*5e7646d2SAndroid Build Coastguard Worker   puts("  -d              Enable debugging");
281*5e7646d2SAndroid Build Coastguard Worker   puts("  -w              Walk all OIDs under the specified one");
282*5e7646d2SAndroid Build Coastguard Worker 
283*5e7646d2SAndroid Build Coastguard Worker   exit (1);
284*5e7646d2SAndroid Build Coastguard Worker }
285