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