4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 only,
8 * as published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License version 2 for more details (a copy is included
14 * in the LICENSE file that accompanied this code).
16 * You should have received a copy of the GNU General Public License
17 * version 2 along with this program; If not, see
18 * http://www.gnu.org/licenses/gpl-2.0.html
23 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
24 * Use is subject to license terms.
26 * Copyright (c) 2012, Intel Corporation.
29 * This file is part of Lustre, http://www.lustre.org/
30 * Lustre is a trademark of Sun Microsystems, Inc.
34 * Author: PJ Kirner <pjkirner@clusterfs.com>
37 #include <net-snmp/net-snmp-config.h>
38 #include <net-snmp/net-snmp-includes.h>
39 #include <net-snmp/agent/net-snmp-agent-includes.h>
40 #include <net-snmp/utilities.h>
42 #include "lustre-snmp.h"
44 #include <libcfs/util/param.h>
46 #define LNET_CHECK_INTERVAL 500
49 * clusterFileSystems_variables_oid:
50 * this is the top level oid that we want to register under. This
51 * is essentially a prefix, with the suffix appearing in the
56 oid clusterFileSystems_variables_oid[] = { 1,3,6,1,4,1,13140 };
60 * variable7 clusterFileSystems_variables:
61 * this variable defines function callbacks and type return information
62 * for the clusterFileSystems mib section
66 struct variable7 clusterFileSystems_variables[] = {
67 /* systemInformation 2.1.1. */
70 .type = ASN_OCTET_STR,
72 .findVar = var_clusterFileSystems,
74 .name = { 2, 1, 1, 1 }
77 .magic = SYSKERNELVERSION,
78 .type = ASN_OCTET_STR,
80 .findVar = var_clusterFileSystems,
82 .name = { 2, 1, 1, 2 }
85 .magic = SYSHEALTHCHECK,
86 .type = ASN_OCTET_STR,
88 .findVar = var_clusterFileSystems,
90 .name = { 2, 1, 1, 3 }
96 .findVar = var_clusterFileSystems,
98 .name = { 2, 1, 1, 4 }
101 /* objectStorageTargets 2.1.2 */
104 .type = ASN_UNSIGNED,
106 .findVar = var_clusterFileSystems,
108 .name = { 2, 1, 2, 1 }
111 /* objectStorageTargets.osdTable.osdEntry 2.1.2.2.1 */
114 .type = ASN_OCTET_STR,
116 .findVar = var_osdTable,
118 .name = { 2, 1, 2, 2, 1, 2 }
121 .magic = OSDCOMMONNAME,
122 .type = ASN_OCTET_STR,
124 .findVar = var_osdTable,
126 .name = { 2, 1, 2, 2, 1, 3 }
129 .magic = OSDCAPACITY,
130 .type = ASN_COUNTER64,
132 .findVar = var_osdTable,
134 .name = { 2, 1, 2, 2, 1, 4 }
137 .magic = OSDFREECAPACITY,
138 .type = ASN_COUNTER64,
140 .findVar = var_osdTable,
142 .name = { 2, 1, 2, 2, 1, 5 }
146 .type = ASN_COUNTER64,
148 .findVar = var_osdTable,
150 .name = { 2, 1, 2, 2, 1, 6 }
153 .magic = OSDFREEOBJECTS,
154 .type = ASN_COUNTER64,
156 .findVar = var_osdTable,
158 .name = { 2, 1, 2, 2, 1, 7 }
161 /* objectStorageClients 2.1.3 */
164 .type = ASN_UNSIGNED,
166 .findVar = var_clusterFileSystems,
168 .name = { 2, 1, 3, 1 }
171 /* objectStorageClients.oscTable.oscEntry 2.1.3.2.1 */
174 .type = ASN_OCTET_STR,
176 .findVar = var_oscTable,
178 .name = { 2, 1, 3, 2, 1, 2 }
181 .magic = OSCCOMMONNAME,
182 .type = ASN_OCTET_STR,
184 .findVar = var_oscTable,
186 .name = { 2, 1, 3, 2, 1, 3 }
189 .magic = OSCOSTSERVERUUID,
190 .type = ASN_OCTET_STR,
192 .findVar = var_oscTable,
194 .name = { 2, 1, 3, 2, 1, 4 }
197 .magic = OSCCAPACITY,
198 .type = ASN_COUNTER64,
200 .findVar = var_oscTable,
202 .name = { 2, 1, 3, 2, 1, 5 }
205 .magic = OSCFREECAPACITY,
206 .type = ASN_COUNTER64,
208 .findVar = var_oscTable,
210 .name = { 2, 1, 3, 2, 1, 6 }
214 .type = ASN_COUNTER64,
216 .findVar = var_oscTable,
218 .name = { 2, 1, 3, 2, 1, 7 }
221 .magic = OSCFREEOBJECTS,
222 .type = ASN_COUNTER64,
224 .findVar = var_oscTable,
226 .name = { 2, 1, 3, 2, 1, 8 }
230 /* metaDataServers 2.1.4 */
233 .type = ASN_UNSIGNED,
235 .findVar = var_clusterFileSystems,
237 .name = { 2, 1, 4, 1 }
240 /* metaDataServers.mddTable.mddEntry 2.1.4.2.1 */
243 .type = ASN_OCTET_STR,
245 .findVar = var_mdsTable,
247 .name = { 2, 1, 4, 2, 1, 2 }
250 .magic = MDDCOMMONNAME,
251 .type = ASN_OCTET_STR,
253 .findVar = var_mdsTable,
255 .name = { 2, 1, 4, 2, 1, 3 }
258 .magic = MDDCAPACITY,
259 .type = ASN_COUNTER64,
261 .findVar = var_mdsTable,
263 .name = { 2, 1, 4, 2, 1, 4 }
266 .magic = MDDFREECAPACITY,
267 .type = ASN_COUNTER64,
269 .findVar = var_mdsTable,
271 .name = { 2, 1, 4, 2, 1, 5 }
275 .type = ASN_COUNTER64,
277 .findVar = var_mdsTable,
279 .name = { 2, 1, 4, 2, 1, 6 }
282 .magic = MDDFREEFILES,
283 .type = ASN_COUNTER64,
285 .findVar = var_mdsTable,
287 .name = { 2, 1, 4, 2, 1, 7 }
290 .magic = MDSNBSAMPLEDREQ,
291 .type = ASN_COUNTER64,
293 .findVar = var_mdsNbSampledReq,
295 .name = { 2, 1, 4, 3 }
298 /* metaDataClients 2.1.5 */
301 .type = ASN_UNSIGNED,
303 .findVar = var_clusterFileSystems,
305 .name = { 2, 1, 5, 1 }
308 /* metaDataClients.mdcTable.mdcEntry 2.1.5.2.1 */
311 .type = ASN_OCTET_STR,
313 .findVar = var_mdcTable,
315 .name = { 2, 1, 5, 2, 1, 2 }
318 .magic = MDCCOMMONNAME,
319 .type = ASN_OCTET_STR,
321 .findVar = var_mdcTable,
323 .name = { 2, 1, 5, 2, 1, 3 }
326 .magic = MDCMDSSERVERUUID,
327 .type = ASN_OCTET_STR,
329 .findVar = var_mdcTable,
331 .name = { 2, 1, 5, 2, 1, 4 }
334 .magic = MDCCAPACITY,
335 .type = ASN_COUNTER64,
337 .findVar = var_mdcTable,
339 .name = { 2, 1, 5, 2, 1, 5 }
342 .magic = MDCFREECAPACITY,
343 .type = ASN_COUNTER64,
345 .findVar = var_mdcTable,
347 .name = { 2, 1, 5, 2, 1, 6 }
351 .type = ASN_COUNTER64,
353 .findVar = var_mdcTable,
355 .name = { 2, 1, 5, 2, 1, 7 }
358 .magic = MDCFREEOBJECTS,
359 .type = ASN_COUNTER64,
361 .findVar = var_mdcTable,
363 .name = { 2, 1, 5, 2, 1, 8 }
366 /* lustreClients 2.1.6 */
368 .magic = CLIMOUNTNUMBER,
369 .type = ASN_UNSIGNED,
371 .findVar = var_clusterFileSystems,
373 .name = { 2, 1, 6, 1 }
376 /* lustreClients.cliMountTable.cliMountEntry 2.1.6.2.1 */
379 .type = ASN_OCTET_STR,
381 .findVar = var_cliTable,
383 .name = { 2, 1, 6, 2, 1, 2 }
386 .magic = CLICOMMONNAME,
387 .type = ASN_OCTET_STR,
389 .findVar = var_cliTable,
391 .name = { 2, 1, 6, 2, 1, 3 }
395 .type = ASN_OCTET_STR,
397 .findVar = var_cliTable,
399 .name = { 2, 1, 6, 2, 1, 4 }
402 .magic = CLIMDCCOMMONNAME,
403 .type = ASN_OCTET_STR,
405 .findVar = var_cliTable,
407 .name = { 2, 1, 6, 2, 1, 5 }
413 .findVar = var_cliTable,
415 .name = { 2, 1, 6, 2, 1, 6 }
419 .type = ASN_OCTET_STR,
421 .findVar = var_cliTable,
423 .name = { 2, 1, 6, 2, 1, 7 }
426 .magic = CLILOVCOMMONNAME,
427 .type = ASN_OCTET_STR,
429 .findVar = var_cliTable,
431 .name = { 2, 1, 6, 2, 1, 8 }
434 /* logicalObjectVolume 2.1.7 */
437 .type = ASN_UNSIGNED,
439 .findVar = var_clusterFileSystems,
441 .name = { 2, 1, 7, 1 }
444 /* logicalObjectVolume.osdTable.lovTable 2.1.7.2.1 */
447 .type = ASN_OCTET_STR,
449 .findVar = var_lovTable,
451 .name = { 2, 1, 7, 2, 1, 2 }
454 .magic = LOVCOMMONNAME,
455 .type = ASN_OCTET_STR,
457 .findVar = var_lovTable,
459 .name = { 2, 1, 7, 2, 1, 3 }
463 .type = ASN_UNSIGNED,
465 .findVar = var_lovTable,
467 .name = { 2, 1, 7, 2, 1, 4 }
470 .magic = LOVNUMACTIVEOBD,
471 .type = ASN_UNSIGNED,
473 .findVar = var_lovTable,
475 .name = { 2, 1, 7, 2, 1, 5 }
478 .magic = LOVCAPACITY,
479 .type = ASN_COUNTER64,
481 .findVar = var_lovTable,
483 .name = { 2, 1, 7, 2, 1, 6 }
486 .magic = LOVFREECAPACITY,
487 .type = ASN_COUNTER64,
489 .findVar = var_lovTable,
491 .name = { 2, 1, 7, 2, 1, 7 }
495 .type = ASN_COUNTER64,
497 .findVar = var_lovTable,
499 .name = { 2, 1, 7, 2, 1, 8 }
502 .magic = LOVFREEFILES,
503 .type = ASN_COUNTER64,
505 .findVar = var_lovTable,
507 .name = { 2, 1, 7, 2, 1, 9 }
510 .magic = LOVSTRIPECOUNT,
511 .type = ASN_UNSIGNED,
513 .findVar = var_lovTable,
515 .name = { 2, 1, 7, 2, 1, 10}
518 .magic = LOVSTRIPEOFFSET,
519 .type = ASN_UNSIGNED,
521 .findVar = var_lovTable,
523 .name = { 2, 1, 7, 2, 1, 11}
526 .magic = LOVSTRIPESIZE,
527 .type = ASN_UNSIGNED,
529 .findVar = var_lovTable,
531 .name = { 2, 1, 7, 2, 1, 12}
534 .magic = LOVSTRIPETYPE,
535 .type = ASN_UNSIGNED,
537 .findVar = var_lovTable,
539 .name = { 2, 1, 7, 2, 1, 13}
542 /* lustreLDLM 2.1.8 */
545 .type = ASN_UNSIGNED,
547 .findVar = var_clusterFileSystems,
549 .name = { 2, 1, 8, 1 }
552 /* lustreLDLM.ldlmTable.ldlmEntry 2.1.8.2.1 */
554 .magic = LDLMNAMESPACE,
555 .type = ASN_OCTET_STR,
557 .findVar = var_ldlmTable,
559 .name = { 2, 1, 8, 2, 1, 2 }
562 .magic = LDLMLOCKCOUNT,
563 .type = ASN_UNSIGNED,
565 .findVar = var_ldlmTable,
567 .name = { 2, 1, 8, 2, 1, 3 }
570 .magic = LDLMUNUSEDLOCKCOUNT,
571 .type = ASN_UNSIGNED,
573 .findVar = var_ldlmTable,
575 .name = { 2, 1, 8, 2, 1, 4 }
578 .magic = LDLMRESOURCECOUNT,
579 .type = ASN_UNSIGNED,
581 .findVar = var_ldlmTable,
583 .name = { 2, 1, 8, 2, 1, 5 }
586 /* lnetInformation 2.1.9 */
588 .magic = LNETMSGSALLOC,
589 .type = ASN_UNSIGNED,
591 .findVar = var_lnetInformation,
593 .name = { 2, 1, 9, 1 }
596 .magic = LNETMSGSMAX,
597 .type = ASN_UNSIGNED,
599 .findVar = var_lnetInformation,
601 .name = { 2, 1, 9, 2 }
605 .type = ASN_UNSIGNED,
607 .findVar = var_lnetInformation,
609 .name = { 2, 1, 9, 3 }
612 .magic = LNETSENDCOUNT,
613 .type = ASN_UNSIGNED,
615 .findVar = var_lnetInformation,
617 .name = { 2, 1, 9, 4 }
620 .magic = LNETRECVCOUNT,
621 .type = ASN_UNSIGNED,
623 .findVar = var_lnetInformation,
625 .name = { 2, 1, 9, 5 }
628 .magic = LNETROUTECOUNT,
629 .type = ASN_UNSIGNED,
631 .findVar = var_lnetInformation,
633 .name = { 2, 1, 9, 6 }
636 .magic = LNETDROPCOUNT,
637 .type = ASN_UNSIGNED,
639 .findVar = var_lnetInformation,
641 .name = { 2, 1, 9, 7 }
644 .magic = LNETSENDBYTES,
645 .type = ASN_COUNTER64,
647 .findVar = var_lnetInformation,
649 .name = { 2, 1, 9, 8 }
652 .magic = LNETRECVBYTES,
653 .type = ASN_COUNTER64,
655 .findVar = var_lnetInformation,
657 .name = { 2, 1, 9, 9 }
660 .magic = LNETROUTEBYTES,
661 .type = ASN_COUNTER64,
663 .findVar = var_lnetInformation,
665 .name = { 2, 1, 9, 10 }
668 .magic = LNETDROPBYTES,
669 .type = ASN_COUNTER64,
671 .findVar = var_lnetInformation,
673 .name = { 2, 1, 9, 11 }
677 /*****************************************************************************
678 * Function: init_cfsNetSNMPPlugin
680 * Description: Called when the agent starts up
686 ****************************************************************************/
688 void init_lustresnmp(void) {
690 /* register ourselves with the agent to handle our mib tree */
691 REGISTER_MIB("clusterFileSystems",
692 clusterFileSystems_variables, variable7,
693 clusterFileSystems_variables_oid);
695 initialize_trap_handler();
697 DEBUGMSGTL(("lsnmpd", "%s %s\n", __func__, "Initialization Done"));
700 /*****************************************************************************
701 * Function: deinit_cfsNetSNMPPlugin
703 * Description: Called when the agent terminates up
709 ****************************************************************************/
711 void deinit_lustresnmp(void) {
713 /* deregister ourselves with the agent */
714 unregister_mib(clusterFileSystems_variables_oid,
715 sizeof(clusterFileSystems_variables_oid)/
716 sizeof(clusterFileSystems_variables_oid));
718 terminate_trap_handler();
720 DEBUGMSGTL(("lsnmpd", "%s %s\n", __func__, "Termination Done"));
723 /*****************************************************************************
724 * Function: var_clusterFileSystems
726 ****************************************************************************/
728 var_clusterFileSystems(struct variable *vp,
733 WriteMethod **write_method)
737 /* variables we may use later */
738 static long long_ret;
739 static u_long ulong_ret;
740 static unsigned char string[SPRINT_MAX_LEN];
745 if (header_generic(vp,name,length,exact,var_len,write_method)
751 * this is where we do the value assignments for the mib results.
756 if (cfs_get_param_paths(&path, "version") != 0)
758 if( SUCCESS != read_string(path.gl_pathv[0], (char *)string,sizeof(string))){
759 cfs_free_param_data(&path);
762 cfs_free_param_data(&path);
763 *var_len = strlen((char *)string);
764 return (unsigned char *) string;
766 case SYSKERNELVERSION:
767 if (cfs_get_param_paths(&path, "kernel_version") != 0)
769 if( SUCCESS != read_string(path.gl_pathv[0], (char *)string,sizeof(string))){
770 cfs_free_param_data(&path);
773 cfs_free_param_data(&path);
774 *var_len = strlen((char *)string);
775 return (unsigned char *) string;
778 if (cfs_get_param_paths(&path, "health_check") != 0)
780 if( SUCCESS != read_string(path.gl_pathv[0], (char *)string,sizeof(string))){
781 cfs_free_param_data(&path);
784 cfs_free_param_data(&path);
785 *var_len = strlen((char*)string);
786 return (unsigned char *) string;
789 *write_method = write_sysStatus;
790 long_ret = (long) get_sysstatus();
791 if (long_ret != ERROR)
792 return (unsigned char *) &long_ret;
796 if (cfs_get_param_paths(&path, "obdfilter") != 0)
798 if( 0 == (dir_list = get_file_list(path.gl_pathv[0], DIR_TYPE, &num))){
799 cfs_free_param_data(&path);
802 DEBUGMSGTL(("lsnmpd","num(%s)=%d\n",path.gl_pathv[0],num));
803 cfs_free_param_data(&path);
806 return (unsigned char *) &ulong_ret;
809 if (cfs_get_param_paths(&path, "osc") != 0)
811 if( 0 == (dir_list = get_file_list(path.gl_pathv[0], DIR_TYPE, &num))){
812 cfs_free_param_data(&path);
815 DEBUGMSGTL(("lsnmpd","num(%s)=%d\n",path.gl_pathv[0],num));
816 cfs_free_param_data(&path);
819 return (unsigned char *) &ulong_ret;
822 if (cfs_get_param_paths(&path, "mds") != 0)
824 if( 0 == (dir_list = get_file_list(path.gl_pathv[0], DIR_TYPE, &num))){
825 cfs_free_param_data(&path);
828 DEBUGMSGTL(("lsnmpd","num(%s)=%d\n",path.gl_pathv[0],num));
829 cfs_free_param_data(&path);
832 return (unsigned char *) &ulong_ret;
835 if (cfs_get_param_paths(&path, "mdc") != 0)
837 if( 0 == (dir_list = get_file_list(path.gl_pathv[0], DIR_TYPE, &num))){
838 cfs_free_param_data(&path);
841 DEBUGMSGTL(("lsnmpd","num(%s)=%d\n",path.gl_pathv[0],num));
842 cfs_free_param_data(&path);
845 return (unsigned char *) &ulong_ret;
848 if (cfs_get_param_paths(&path, "llite") != 0)
850 if( 0 == (dir_list = get_file_list(path.gl_pathv[0], DIR_TYPE, &num))){
851 cfs_free_param_data(&path);
854 DEBUGMSGTL(("lsnmpd","num(%s)=%d\n",path.gl_pathv[0],num));
855 cfs_free_param_data(&path);
858 return (unsigned char *) &ulong_ret;
861 if (cfs_get_param_paths(&path, "lov") != 0)
863 if( 0 == (dir_list = get_file_list(path.gl_pathv[0], DIR_TYPE, &num))){
864 cfs_free_param_data(&path);
867 DEBUGMSGTL(("lsnmpd","num(%s)=%d\n",path.gl_pathv[0],num));
868 cfs_free_param_data(&path);
871 return (unsigned char *) &ulong_ret;
874 if (cfs_get_param_paths(&path, "ldlm/namespaces") != 0)
876 if( 0 == (dir_list = get_file_list(path.gl_pathv[0], DIR_TYPE, &num))){
877 cfs_free_param_data(&path);
880 DEBUGMSGTL(("lsnmpd","num(%s)=%d\n",path.gl_pathv[0],num));
881 cfs_free_param_data(&path);
884 return (unsigned char *) &ulong_ret;
892 struct oid_table osd_table[] = {
895 .name = FILENAME_UUID,
896 .fhandler = oid_table_string_handler
899 .magic = OSDCOMMONNAME,
901 .fhandler = oid_table_obj_name_handler
904 .magic = OSDCAPACITY,
905 .name = FILENAME_KBYTES_TOTAL,
906 .fhandler = oid_table_c64_kb_handler
909 .magic = OSDFREECAPACITY,
910 .name = FILENAME_KBYTES_FREE,
911 .fhandler = oid_table_c64_kb_handler
915 .name = FILENAME_FILES_TOTAL,
916 .fhandler = oid_table_c64_kb_handler
919 .magic = OSDFREEOBJECTS,
920 .name = FILENAME_FILES_FREE,
921 .fhandler = oid_table_c64_kb_handler
931 /*****************************************************************************
932 * Function: var_osdTable
934 ****************************************************************************/
936 var_osdTable(struct variable *vp,
941 WriteMethod **write_method)
943 unsigned char *table;
946 if (cfs_get_param_paths(&path, "obdfilter") != 0)
949 table = var_genericTable(vp,name,length,exact,var_len,write_method,
950 path.gl_pathv[0],osd_table);
951 cfs_free_param_data(&path);
955 struct oid_table osc_table[] = {
958 .name = FILENAME_UUID,
959 .fhandler = oid_table_string_handler
962 .magic = OSCCOMMONNAME,
964 .fhandler = oid_table_obj_name_handler
967 .magic = OSCOSTSERVERUUID,
968 .name = "ost_server_uuid",
969 .fhandler = oid_table_string_handler
972 .magic = OSCCAPACITY,
973 .name = FILENAME_KBYTES_TOTAL,
974 .fhandler = oid_table_c64_kb_handler
977 .magic = OSCFREECAPACITY,
978 .name = FILENAME_KBYTES_FREE,
979 .fhandler = oid_table_c64_kb_handler
983 .name = FILENAME_FILES_TOTAL,
984 .fhandler = oid_table_c64_kb_handler
987 .magic = OSCFREEOBJECTS,
988 .name = FILENAME_FILES_FREE,
989 .fhandler = oid_table_c64_kb_handler
998 /*****************************************************************************
999 * Function: var_oscTable
1001 ****************************************************************************/
1003 var_oscTable(struct variable *vp,
1008 WriteMethod **write_method)
1010 unsigned char *table;
1013 if (cfs_get_param_paths(&path, "osc") != 0)
1016 table = var_genericTable(vp,name,length,exact,var_len,write_method,
1017 path.gl_pathv[0],osd_table);
1018 cfs_free_param_data(&path);
1022 struct oid_table mds_table[] = {
1025 .name = FILENAME_UUID,
1026 .fhandler = oid_table_string_handler
1029 .magic = MDDCOMMONNAME,
1031 .fhandler = oid_table_obj_name_handler
1034 .magic = MDDCAPACITY,
1035 .name = FILENAME_KBYTES_TOTAL,
1036 .fhandler = oid_table_c64_kb_handler
1039 .magic = MDDFREECAPACITY,
1040 .name = FILENAME_KBYTES_FREE,
1041 .fhandler = oid_table_c64_kb_handler
1045 .name = FILENAME_FILES_TOTAL,
1046 .fhandler = oid_table_c64_kb_handler
1049 .magic = MDDFREEFILES,
1050 .name = FILENAME_FILES_FREE,
1051 .fhandler = oid_table_c64_kb_handler
1060 /*****************************************************************************
1061 * Function: var_mdsTable
1063 ****************************************************************************/
1065 var_mdsTable(struct variable *vp,
1070 WriteMethod **write_method)
1072 unsigned char *table;
1075 if (cfs_get_param_paths(&path, "mds") != 0)
1078 table = var_genericTable(vp,name,length,exact,var_len,write_method,
1079 path.gl_pathv[0],osd_table);
1080 cfs_free_param_data(&path);
1084 struct oid_table mdc_table[] = {
1087 .name = FILENAME_UUID,
1088 .fhandler = oid_table_string_handler
1091 .magic = MDCCOMMONNAME,
1093 .fhandler = oid_table_obj_name_handler
1096 .magic = MDCMDSSERVERUUID,
1097 .name = "mds_server_uuid",
1098 .fhandler = oid_table_string_handler
1101 .magic = MDCCAPACITY,
1102 .name = FILENAME_KBYTES_TOTAL,
1103 .fhandler = oid_table_c64_kb_handler
1106 .magic = MDCFREECAPACITY,
1107 .name = FILENAME_KBYTES_FREE,
1108 .fhandler = oid_table_c64_kb_handler
1111 .magic = MDCOBJECTS,
1112 .name = FILENAME_FILES_TOTAL,
1113 .fhandler = oid_table_c64_kb_handler
1116 .magic = MDCFREEOBJECTS,
1117 .name = FILENAME_FILES_FREE,
1118 .fhandler = oid_table_c64_kb_handler
1128 /*****************************************************************************
1129 * Function: var_mdcTable
1131 ****************************************************************************/
1133 var_mdcTable(struct variable *vp,
1138 WriteMethod **write_method)
1140 unsigned char *table;
1143 if (cfs_get_param_paths(&path, "mdc") != 0)
1146 table = var_genericTable(vp,name,length,exact,var_len,write_method,
1147 path.gl_pathv[0],osd_table);
1148 cfs_free_param_data(&path);
1152 struct oid_table cli_table[] = {
1155 .name = FILENAME_UUID,
1156 .fhandler = oid_table_string_handler
1159 .magic = CLICOMMONNAME,
1161 .fhandler = oid_table_obj_name_handler
1164 .magic = CLIMDCUUID,
1165 .name = "mdc/" FILENAME_UUID,
1166 .fhandler = oid_table_string_handler
1169 .magic = CLIMDCCOMMONNAME,
1170 .name = "mdc/" FILENAME_COMMON_NAME,
1171 .fhandler = oid_table_string_handler
1174 .magic = CLIUSESLOV,
1176 .fhandler = oid_table_is_directory_handler
1179 .magic = CLILOVUUID,
1180 .name = "lov/" FILENAME_UUID,
1181 .fhandler = oid_table_string_handler
1184 .magic = CLILOVCOMMONNAME,
1185 .name = "lov/" FILENAME_COMMON_NAME,
1186 .fhandler = oid_table_string_handler
1195 /*****************************************************************************
1196 * Function: var_cliTable
1198 ****************************************************************************/
1200 var_cliTable(struct variable *vp,
1205 WriteMethod **write_method)
1207 unsigned char *table;
1210 if (cfs_get_param_paths(&path, "llite") != 0)
1213 table = var_genericTable(vp,name,length,exact,var_len,write_method,
1214 path.gl_pathv[0],osd_table);
1215 cfs_free_param_data(&path);
1219 struct oid_table lov_table[] = {
1222 .name = FILENAME_UUID,
1223 .fhandler = oid_table_string_handler
1226 .magic = LOVCOMMONNAME,
1228 .fhandler = oid_table_obj_name_handler
1233 .fhandler = oid_table_ulong_handler
1236 .magic = LOVNUMACTIVEOBD,
1237 .name = "activeobd",
1238 .fhandler = oid_table_ulong_handler
1241 .magic = LOVCAPACITY,
1242 .name = FILENAME_KBYTES_TOTAL,
1243 .fhandler = oid_table_c64_kb_handler
1246 .magic = LOVFREECAPACITY,
1247 .name = FILENAME_KBYTES_FREE,
1248 .fhandler = oid_table_c64_kb_handler
1252 .name = FILENAME_FILES_TOTAL,
1253 .fhandler = oid_table_c64_kb_handler
1256 .magic = LOVFREEFILES,
1257 .name = FILENAME_FILES_FREE,
1258 .fhandler = oid_table_c64_kb_handler
1261 .magic = LOVSTRIPECOUNT,
1262 .name = "stripecount",
1263 .fhandler = oid_table_ulong_handler
1266 .magic = LOVSTRIPEOFFSET,
1267 .name = "stripeoffset",
1268 .fhandler = oid_table_ulong_handler
1271 .magic = LOVSTRIPESIZE,
1272 .name = "stripesize",
1273 .fhandler = oid_table_ulong_handler
1276 .magic = LOVSTRIPETYPE,
1277 .name = "stripetype",
1278 .fhandler = oid_table_ulong_handler
1288 /*****************************************************************************
1289 * Function: var_lovTable
1291 ****************************************************************************/
1293 var_lovTable(struct variable *vp,
1298 WriteMethod **write_method)
1300 unsigned char *table;
1303 if (cfs_get_param_paths(&path, "lov") != 0)
1306 table = var_genericTable(vp,name,length,exact,var_len,write_method,
1307 path.gl_pathv[0],osd_table);
1308 cfs_free_param_data(&path);
1312 struct oid_table ldlm_table[] = {
1314 .magic = LDLMNAMESPACE,
1316 .fhandler = oid_table_obj_name_handler
1319 .magic = LDLMLOCKCOUNT,
1320 .name = "lock_count",
1321 .fhandler = oid_table_ulong_handler
1324 .magic = LDLMUNUSEDLOCKCOUNT,
1325 .name = "lock_unused_count",
1326 .fhandler = oid_table_ulong_handler
1329 .magic = LDLMRESOURCECOUNT,
1330 .name = "resource_count",
1331 .fhandler = oid_table_ulong_handler
1341 /*****************************************************************************
1342 * Function: var_ldlmTable
1344 ****************************************************************************/
1346 var_ldlmTable(struct variable *vp,
1351 WriteMethod **write_method)
1353 unsigned char *table;
1356 if (cfs_get_param_paths(&path, "ldlm/namespaces") != 0)
1359 table = var_genericTable(vp,name,length,exact,var_len,write_method,
1360 path.gl_pathv[0],osd_table);
1361 cfs_free_param_data(&path);
1365 /*****************************************************************************
1366 * Function: var_lnetInformation
1368 ****************************************************************************/
1370 var_lnetInformation(struct variable *vp,
1375 WriteMethod **write_method)
1377 /* variables we may use later */
1378 static unsigned char string[SPRINT_MAX_LEN];
1379 static unsigned int i[7];
1380 static unsigned long long ull[4];
1381 static unsigned long next_update;
1382 static counter64 c64;
1383 static unsigned int c32;
1384 struct timeval current_tv;
1385 unsigned long current;
1388 /* Update at most every LNET_STATS_INTERVAL milliseconds */
1389 gettimeofday(¤t_tv, NULL);
1390 current = current_tv.tv_sec * 1000000 + current_tv.tv_usec;
1391 if (current >= next_update) {
1392 if (cfs_get_param_paths(&file_path, "stats") != 0)
1394 if (read_string(file_path.gl_pathv[0], (char *) string, sizeof(string))
1396 cfs_free_param_data(&file_path);
1399 cfs_free_param_data(&file_path);
1401 sscanf((char *) string,
1402 "%u %u %u %u %u %u %u %llu %llu %llu %llu",
1403 &i[0], &i[1], &i[2], &i[3], &i[4], &i[5], &i[6],
1404 &ull[0], &ull[1], &ull[2], &ull[3]);
1406 next_update = current + (LNET_CHECK_INTERVAL * 1000);
1409 if (header_generic(vp, name, length, exact, var_len, write_method)
1413 switch (vp->magic) {
1415 *var_len = sizeof(c32);
1417 return (unsigned char *) &c32;
1419 *var_len = sizeof(c32);
1421 return (unsigned char *) &c32;
1423 *var_len = sizeof(c32);
1425 return (unsigned char *) &c32;
1427 *var_len = sizeof(c32);
1429 return (unsigned char *) &c32;
1431 *var_len = sizeof(c32);
1433 return (unsigned char *) &c32;
1434 case LNETROUTECOUNT:
1435 *var_len = sizeof(c32);
1437 return (unsigned char *) &c32;
1439 *var_len = sizeof(c32);
1441 return (unsigned char *) &c32;
1443 convert_ull(&c64, ull[0], var_len);
1444 return (unsigned char *) &c64;
1446 convert_ull(&c64, ull[1], var_len);
1447 return (unsigned char *) &c64;
1448 case LNETROUTEBYTES:
1449 convert_ull(&c64, ull[2], var_len);
1450 return (unsigned char *) &c64;
1452 convert_ull(&c64, ull[3], var_len);
1453 return (unsigned char *) &c64;
1459 /*****************************************************************************
1460 * Function: var_mdsNbSampledReq
1462 ****************************************************************************/
1464 var_mdsNbSampledReq(struct variable *vp,
1469 WriteMethod **write_method)
1471 unsigned long long nb_sample=0,min=0,max=0,sum=0,sum_square=0;
1472 static counter64 c64;
1474 if (header_generic(vp,name,length,exact,var_len,write_method)
1478 if( mds_stats_values(STR_REQ_WAITIME,&nb_sample,&min,&max,&sum,&sum_square) == ERROR) return NULL;
1480 c64.low = (u_long) (0x0FFFFFFFF & nb_sample);
1482 c64.high = (u_long) (0x0FFFFFFFF & nb_sample);
1484 *var_len = sizeof(c64);
1485 return (unsigned char *) &c64;
1489 /*****************************************************************************
1490 * Function: write_sysStatus
1492 ****************************************************************************/
1494 write_sysStatus(int action,
1496 u_char var_val_type,
1502 static long *long_ret;
1509 if (var_val_type != ASN_INTEGER){
1510 fprintf(stderr, "write to sysStatus not ASN_INTEGER\n");
1511 return SNMP_ERR_WRONGTYPE;
1513 if (var_val_len > sizeof(long_ret)){
1514 fprintf(stderr,"write to sysStatus: bad length\n");
1515 return SNMP_ERR_WRONGLENGTH;
1517 if ((*var_val != ONLINE) &&
1518 (*var_val != OFFLINE) &&
1519 (*var_val != RESTART)){
1520 report("%s %s:line %d %s", __FILE__, __FUNCTION__, __LINE__,
1521 "sysStatus value is invalid.");
1522 return SNMP_ERR_WRONGVALUE;
1528 long_ret = (long *) var_val;
1535 /* Release any resources that have been allocated */
1540 /* The variable has been stored in long_ret for
1541 you to use, and you have just been asked to do something with
1542 it. Note that anything done here must be reversable in the UNDO case */
1543 new_value = *(int *) var_val;
1544 switch (new_value) {
1546 lustrefs_ctrl(ONLINE);
1550 lustrefs_ctrl(OFFLINE);
1554 lustrefs_ctrl(RESTART);
1564 /* Back out any changes made in the ACTION case */
1569 /* Things are working well, so it's now safe to make the change
1570 permanently. Make sure that anything done here can't fail! */
1573 return SNMP_ERR_NOERROR;