[Cluster-devel] conga ./Makefile ./configure ./conga.spec.in.i ...
kupcevic at sourceware.org
kupcevic at sourceware.org
Wed Jun 14 21:44:44 UTC 2006
CVSROOT: /cvs/cluster
Module name: conga
Changes by: kupcevic at sourceware.org 2006-06-14 21:44:37
Modified files:
. : Makefile configure conga.spec.in.in
luci : Makefile configure
luci/init.d : Makefile
make : version.in
ricci : Makefile configure
ricci/init.d : Makefile
ricci/make : defines.mk.in
ricci/modules/cluster/clumon: Makefile
ricci/modules/cluster/clumon/init.d: Makefile
ricci/modules/cluster/clumon/src: Makefile
ricci/modules/cluster/clumon/src/common: Makefile
ricci/oddjobd.conf.d: Makefile
ricci/pam.d : Makefile
ricci/ricci : Makefile
Added files:
. : COPYING INSTALL autogen.sh
luci : autogen.sh
ricci : autogen.sh
ricci/modules/cluster/clumon: COPYING README README.cim
README.snmpd REDHAT-CLUSTER-MIB
REDHAT-MIB
RedHat_ClusterProvider.mof
RedHat_ClusterSchema.mof
ricci/modules/cluster/clumon/src/cim-provider:
ClusterProvider.cpp
ClusterProvider.h
ClusterProviderMain.cpp
Makefile
SmartHandler.h
clusterCIM_test.cpp
clusterCIM_test.h
ricci/modules/cluster/clumon/src/common: ClusterMonitor.cpp
ricci/modules/cluster/clumon/src/include: ClusterMonitor.h
ricci/modules/cluster/clumon/src/snmp-agent: Makefile
clusterMIB.cpp
clusterMIB.h
clusterMonitorSnmp.cpp
clusterMonitorSnmp.h
nodesMIB.cpp
nodesMIB.h
nodesMIB_access.cpp
nodesMIB_access.h
nodesMIB_checkfns.cpp
nodesMIB_checkfns.h
nodesMIB_checkfns_local.cpp
nodesMIB_checkfns_local.h
nodesMIB_columns.h
nodesMIB_enums.h
servicesMIB.cpp
servicesMIB.h
servicesMIB_access.cpp
servicesMIB_access.h
servicesMIB_checkfns.cpp
servicesMIB_checkfns.h
servicesMIB_checkfns_local.cpp
servicesMIB_checkfns_local.h
servicesMIB_columns.h
servicesMIB_enums.h
Log message:
Revamp build system; package cluster-snmp and cluster-cim rpms
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/COPYING.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/INSTALL.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/autogen.sh.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/Makefile.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/configure.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/conga.spec.in.in.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/autogen.sh.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/Makefile.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/configure.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/init.d/Makefile.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/make/version.in.diff?cvsroot=cluster&r1=1.2&r2=1.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/autogen.sh.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/Makefile.diff?cvsroot=cluster&r1=1.6&r2=1.7
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/configure.diff?cvsroot=cluster&r1=1.2&r2=1.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/init.d/Makefile.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/make/defines.mk.in.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/COPYING.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/README.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/README.cim.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/README.snmpd.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/REDHAT-CLUSTER-MIB.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/REDHAT-MIB.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/RedHat_ClusterProvider.mof.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/RedHat_ClusterSchema.mof.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/Makefile.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/init.d/Makefile.diff?cvsroot=cluster&r1=1.2&r2=1.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/Makefile.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/cim-provider/ClusterProvider.cpp.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/cim-provider/ClusterProvider.h.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/cim-provider/ClusterProviderMain.cpp.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/cim-provider/Makefile.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/cim-provider/SmartHandler.h.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/cim-provider/clusterCIM_test.cpp.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/cim-provider/clusterCIM_test.h.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/common/ClusterMonitor.cpp.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/common/Makefile.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/include/ClusterMonitor.h.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/snmp-agent/Makefile.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/snmp-agent/clusterMIB.cpp.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/snmp-agent/clusterMIB.h.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/snmp-agent/clusterMonitorSnmp.cpp.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/snmp-agent/clusterMonitorSnmp.h.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB.cpp.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB.h.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB_access.cpp.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB_access.h.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB_checkfns.cpp.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB_checkfns.h.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB_checkfns_local.cpp.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB_checkfns_local.h.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB_columns.h.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB_enums.h.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB.cpp.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB.h.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB_access.cpp.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB_access.h.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB_checkfns.cpp.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB_checkfns.h.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB_checkfns_local.cpp.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB_checkfns_local.h.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB_columns.h.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB_enums.h.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/oddjobd.conf.d/Makefile.diff?cvsroot=cluster&r1=1.4&r2=1.5
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/pam.d/Makefile.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/ricci/ricci/Makefile.diff?cvsroot=cluster&r1=1.8&r2=1.9
/cvs/cluster/conga/COPYING,v --> standard output
revision 1.1
--- conga/COPYING
+++ - 2006-06-14 21:44:38.069571000 +0000
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
/cvs/cluster/conga/INSTALL,v --> standard output
revision 1.1
--- conga/INSTALL
+++ - 2006-06-14 21:44:38.156362000 +0000
@@ -0,0 +1,17 @@
+
+# installation
+make distclean
+./autogen
+./configure
+make
+su
+make install
+
+# removal (broken - use rpm)
+su
+make uninstall
+
+# SRPM
+make distclean
+./autogen
+make srpm
/cvs/cluster/conga/autogen.sh,v --> standard output
revision 1.1
--- conga/autogen.sh
+++ - 2006-06-14 21:44:38.244958000 +0000
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+# TODO: improve me
+
+
+. make/version.in
+
+sed -e s/@@VERS@@/$VERSION/g conga.spec.in.in | \
+ sed -e s/@@REL@@/$RELEASE/g > conga.spec
+
+
+cd ricci ; ./autogen.sh ; cd ..
+cd luci ; ./autogen.sh ; cd ..
+
+
+echo "Run \`./configure\` to configure conga build"
+echo "or \`make srpm\` to build srpm."
--- conga/Makefile 2006/06/02 00:14:27 1.3
+++ conga/Makefile 2006/06/14 21:44:34 1.4
@@ -16,7 +16,6 @@
-
all:
make -C ricci
make -C luci
@@ -27,6 +26,11 @@
make -C luci install
+clean:
+ make -C ricci clean
+ make -C luci clean
+
+
distclean:
make -C ricci distclean
make -C luci distclean
@@ -34,17 +38,10 @@
rm -f conga*.tar.gz conga*.src.rpm
-clean:
- make -C ricci clean
- make -C luci clean
-
-
-spec:
- sed -e 's/@@VERS@@/${VERSION}/g' conga.spec.in.in > conga.spec.in
- sed -e 's/@@REL@@/${RELEASE}/g' conga.spec.in > conga.spec
+rebuild: clean all
-srpm: distclean spec
+srpm: clean
rm -rf ${TMP_DIR}/${CONGA_DIRNAME}
cp -r . ${TMP_DIR}/${CONGA_DIRNAME}
rm -rf `find ${TMP_DIR}/${CONGA_DIRNAME} -name CVS`
--- conga/configure 2006/06/02 00:14:27 1.1
+++ conga/configure 2006/06/14 21:44:34 1.2
@@ -3,10 +3,10 @@
# TODO: implement me
-
-./ricci/configure
-./luci/configure
+cd ricci ; ./configure $@ ; cd ..
+cd luci ; ./configure $@ ; cd ..
echo "Run 'make' to compile conga"
+
exit 0
--- conga/conga.spec.in.in 2006/06/09 16:32:19 1.3
+++ conga/conga.spec.in.in 2006/06/14 21:44:34 1.4
@@ -18,6 +18,7 @@
%define _libdir /usr/lib64
%endif
+%define PEGASUS_PROVIDERS_DIR %{_libdir}/Pegasus/providers
@@ -38,6 +39,7 @@
BuildRequires: glibc-devel gcc-c++ libxml2-devel make
BuildRequires: openssl-devel dbus-devel pam-devel
+BuildRequires: net-snmp-devel tog-pegasus-devel
%description
conga source rpm
@@ -46,12 +48,14 @@
%setup -q
%build
-./configure --arch=%{_arch} --sbindir=%{_sbindir} --libdir=%{_libdir}
+./autogen.sh
+#./configure --arch=%{_arch} --sbindir=%{_sbindir} --libdir=%{_libdir} --docdir=%{_docdir}
+%configure --arch=%{_arch} --docdir=%{_docdir} --pegasus_providers_dir=%{PEGASUS_PROVIDERS_DIR}
make
%install
rm -rf $RPM_BUILD_ROOT
-make install DESTDIR=$RPM_BUILD_ROOT
+make DESTDIR=$RPM_BUILD_ROOT install
%clean
rm -rf $RPM_BUILD_ROOT
@@ -82,9 +86,20 @@
%files -n luci
%defattr(-,root,root)
-/etc/init.d/luci
+%config /etc/rc.d/init.d/luci
%{_sbindir}/luci_admin
-%attr(-,zope,zope)/var/lib/luci
+%attr(-,luci,root) /var/lib/luci
+%attr(600,luci,root) /var/lib/luci/var/Data.fs
+%config /var/lib/luci/var/Data.fs
+%config /var/lib/luci/etc/zope.conf
+%config(noreplace) /var/lib/luci/etc/logrotate.conf
+%config(noreplace) /var/lib/luci/etc/stunnel.conf
+
+
+%pre -n luci
+/usr/sbin/groupadd -r -f luci >/dev/null 2>&1
+/usr/sbin/useradd -r -M -s /sbin/nologin -g luci luci >/dev/null 2>&1
+exit 0
%post -n luci
@@ -98,15 +113,15 @@
echo -n "admin:{SHA}$i" > /var/lib/luci/inituser
fi
done
+ /bin/chmod 600 /var/lib/luci/inituser
+ /bin/chown luci /var/lib/luci/inituser
fi
-
%preun -n luci
if [ "$1" = 0 ]; then
/sbin/service luci stop >/dev/null 2>$1
/sbin/chkconfig --del luci
-# /usr/sbin/userdel luci
fi
@@ -145,30 +160,36 @@
%files -n ricci
%defattr(-,root,root)
+
# ricci
#%doc README COPYING
+%config /etc/rc.d/init.d/ricci
+%config /etc/oddjobd.conf.d/reboot.conf
+%config(noreplace) /etc/pam.d/ricci
+%attr(-,ricci,root) /var/lib/ricci
%{_sbindir}/ricci
%{_sbindir}/ricci-worker
%attr(4755,root,root) %{_sbindir}/ricci-auth
-/var/lib/ricci
-/etc/init.d/ricci
-%attr(644,root,root) /etc/pam.d/ricci
-%attr(644,root,root) /etc/oddjobd.conf.d/reboot.conf
+
# modrpm
+%config /etc/oddjobd.conf.d/modrpm_rw.conf
%{_sbindir}/ricci-modrpm
%{_sbindir}/ricci-modrpm.exe
-%attr(644,root,root) /etc/oddjobd.conf.d/modrpm_rw.conf
+
+
+%pre -n ricci
+/usr/sbin/groupadd -r -f ricci >/dev/null 2>&1
+/usr/sbin/useradd -r -M -s /sbin/nologin -g ricci ricci >/dev/null 2>&1
+exit 0
%post -n ricci
-/usr/sbin/adduser -r -M -s /sbin/nologin ricci > /dev/null 2>&1
/sbin/chkconfig --add ricci
-/bin/chown -R ricci:ricci /var/lib/ricci
if [ ! -e /var/lib/ricci/certs/privkey.pem ]; then
/usr/bin/openssl genrsa -out /var/lib/ricci/certs/privkey.pem 2048 > /dev/null 2>&1
/usr/bin/openssl req -new -x509 -key /var/lib/ricci/certs/privkey.pem \
-out /var/lib/ricci/certs/cacert.pem -days 1095 -config /var/lib/ricci/certs/cacert.config
- /bin/chown ricci:ricci /var/lib/ricci/certs/*.pem
+ /bin/chown ricci:root /var/lib/ricci/certs/*.pem
/bin/chmod 644 /var/lib/ricci/certs/cacert.pem
/bin/chmod 600 /var/lib/ricci/certs/privkey.pem
fi
@@ -185,9 +206,9 @@
if [ "$1" = 0 ]; then
/sbin/service ricci stop > /dev/null 2>&1
/sbin/chkconfig --del ricci
-# /usr/sbin/userdel ricci
fi
+
%postun -n ricci
if [ "$1" -ge "1" ]; then
/sbin/service ricci condrestart > /dev/null 2>&1
@@ -216,28 +237,27 @@
%files -n ricci-modcluster
%defattr(-,root,root)
-#%doc README README.snmpd COPYING REDHAT-MIB REDHAT-CLUSTER-MIB
-#%{_libdir}/clumon-snmp/
-#%attr(644,root,root) /usr/share/snmp/mibs/REDHAT-MIB
-#%attr(644,root,root) /usr/share/snmp/mibs/REDHAT-CLUSTER-MIB
+#%doc README
+%config /etc/rc.d/init.d/ricci-modclusterd
+%config /etc/oddjobd.conf.d/modcluster_rw.conf
%{_sbindir}/ricci-modcluster
%{_sbindir}/ricci-modcluster.exe
-%attr(644,root,root) /etc/oddjobd.conf.d/modcluster_rw.conf
%{_sbindir}/ricci-modclusterd
-/etc/init.d/ricci-modclusterd
%post -n ricci-modcluster
-/sbin/service oddjobd reload > /dev/null 2>&1
/sbin/chkconfig --add ricci-modclusterd
+/sbin/service oddjobd reload > /dev/null 2>&1
/sbin/service ricci-modclusterd restart > /dev/null 2>&1
+
%preun -n ricci-modcluster
if [ "$1" = 0 ]; then
/sbin/service ricci-modclusterd stop > /dev/null 2>&1
/sbin/chkconfig --del ricci-modclusterd
fi
+
%postun -n ricci-modcluster
if [ "$1" -ge "1" ]; then
/sbin/service ricci-modclusterd condrestart > /dev/null 2>&1
@@ -265,16 +285,15 @@
%files -n ricci-modstorage
%defattr(-,root,root)
-#%doc README README.snmpd COPYING REDHAT-MIB REDHAT-CLUSTER-MIB
+#%doc README
+%config /etc/oddjobd.conf.d/modstorage_rw.conf
%{_sbindir}/ricci-modstorage
%{_sbindir}/ricci-modstorage.exe
-%attr(644,root,root) /etc/oddjobd.conf.d/modstorage_rw.conf
%post -n ricci-modstorage
/sbin/service oddjobd reload > /dev/null 2>&1
exit 0
-
%preun -n ricci-modstorage
%postun -n ricci-modstorage
@@ -301,16 +320,15 @@
%files -n ricci-modservice
%defattr(-,root,root)
-#%doc README README.snmpd COPYING REDHAT-MIB REDHAT-CLUSTER-MIB
+#%doc README
+%config /etc/oddjobd.conf.d/modservice_rw.conf
%{_sbindir}/ricci-modservice
%{_sbindir}/ricci-modservice.exe
-%attr(644,root,root) /etc/oddjobd.conf.d/modservice_rw.conf
%post -n ricci-modservice
/sbin/service oddjobd reload > /dev/null 2>&1
exit 0
-
%preun -n ricci-modservice
%postun -n ricci-modservice
@@ -337,10 +355,10 @@
%files -n ricci-modlog
%defattr(-,root,root)
-#%doc README README.snmpd COPYING REDHAT-MIB REDHAT-CLUSTER-MIB
+#%doc README
+%config /etc/oddjobd.conf.d/modlog_rw.conf
%{_sbindir}/ricci-modlog
%{_sbindir}/ricci-modlog.exe
-%attr(644,root,root) /etc/oddjobd.conf.d/modlog_rw.conf
%post -n ricci-modlog
/sbin/service oddjobd reload > /dev/null 2>&1
@@ -357,12 +375,94 @@
+### cluster-snmp ###
+
+
+%package -n cluster-snmp
+Group: System Environment/Base
+Summary: Red Hat Enterprise Linux Cluster Suite - SNMP agent
+Requires: /bin/bash
+Requires: net-snmp ricci-modcluster
+Requires: oddjob libxml2 openssl
+Provides: cluster-snmp
+Conflicts: clumon-snmp
+
+%description -n cluster-snmp
+SNMP agent for Red Hat Enterprise Linux Cluster Suite
+
+
+%files -n cluster-snmp
+%defattr(-,root,root)
+%{_libdir}/cluster-snmp/
+%attr(644,root,root) %{_datadir}/snmp/mibs/REDHAT-MIB
+%attr(644,root,root) %{_datadir}/snmp/mibs/REDHAT-CLUSTER-MIB
+%{_docdir}/cluster-snmp-%{version}/
+
+%pre -n cluster-snmp
+
+%post -n cluster-snmp
+#/sbin/service oddjobd reload > /dev/null 2>&1
+/sbin/service snmpd condrestart > /dev/null 2>&1
+exit 0
+
+%preun -n cluster-snmp
+
+%postun -n cluster-snmp
+#/sbin/service oddjobd reload > /dev/null 2>&1
+/sbin/service snmpd condrestart > /dev/null 2>&1
+exit 0
+
+
+
+
+
+### cluster-cim ###
+
+
+%package -n cluster-cim
+Group: System Environment/Base
+Summary: Red Hat Enterprise Linux Cluster Suite - CIM provider
+Requires: /bin/bash
+Requires: tog-pegasus ricci-modcluster
+Requires: oddjob libxml2 openssl
+Provides: cluster-cim
+Conflicts: clumon-cim
+
+%description -n cluster-cim
+CIM provider for Red Hat Enterprise Linux Cluster Suite
+
+
+%files -n cluster-cim
+%defattr(-,root,root)
+%{PEGASUS_PROVIDERS_DIR}/libRedHatClusterProvider.so
+%{_docdir}/cluster-cim-%{version}/
+
+%pre -n cluster-cim
+
+%post -n cluster-cim
+#/sbin/service oddjobd reload > /dev/null 2>&1
+/sbin/service tog-pegasus condrestart > /dev/null 2>&1
+exit 0
+
+%preun -n cluster-cim
+
+%postun -n cluster-cim
+#/sbin/service oddjobd reload > /dev/null 2>&1
+/sbin/service tog-pegasus condrestart > /dev/null 2>&1
+exit 0
+
+
+
+
### changelog ###
%changelog
+* Wed Jun 14 2006 Stanko Kupcevic <kupcevic at redhat.com> 0.8-1
+- Packaged cluster-snmp (cluster snmp agent)
+- Packaged cluster-cim (cluster CIM provider)
* Mon Jun 06 2006 Stanko Kupcevic <kupcevic at redhat.com> 0.7-5
- Disable non-https access to Luci, enable https on port 8181
* Mon Jun 02 2006 Stanko Kupcevic <kupcevic at redhat.com> 0.7-1
/cvs/cluster/conga/luci/autogen.sh,v --> standard output
revision 1.1
--- conga/luci/autogen.sh
+++ - 2006-06-14 21:44:38.601019000 +0000
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+# TODO: implement me
+
+
+exit 0
--- conga/luci/Makefile 2006/06/02 00:14:27 1.3
+++ conga/luci/Makefile 2006/06/14 21:44:34 1.4
@@ -1,6 +1,8 @@
-# $Id: Makefile,v 1.3 2006/06/02 00:14:27 kupcevic Exp $
+# $Id: Makefile,v 1.4 2006/06/14 21:44:34 kupcevic Exp $
+all: luci
+
luci:
make -C site
@@ -9,6 +11,9 @@
make -C docs
+rebuild: clean all
+
+
install:
make -C site install
make -C utils install
@@ -54,7 +59,7 @@
ZOPEHTTP=http://localhost:8080/
ZOPEDIRS=cluster storage homebase
-all: tar
+all_old: tar
tar:
--- conga/luci/configure 2006/06/02 00:14:27 1.1
+++ conga/luci/configure 2006/06/14 21:44:34 1.2
@@ -4,6 +4,4 @@
-echo "Run 'make' to compile luci"
-
exit 0
--- conga/luci/init.d/Makefile 2006/06/02 00:14:28 1.1
+++ conga/luci/init.d/Makefile 2006/06/14 21:44:34 1.2
@@ -5,8 +5,8 @@
install:
- install -d ${DESTDIR}/etc/init.d
- install luci ${DESTDIR}/etc/init.d
+ install -d ${DESTDIR}/etc/rc.d/init.d
+ install luci ${DESTDIR}/etc/rc.d/init.d
clean:
--- conga/make/version.in 2006/06/06 21:05:43 1.2
+++ conga/make/version.in 2006/06/14 21:44:34 1.3
@@ -1,2 +1,2 @@
-VERSION=0.7
-RELEASE=5.FC5
+VERSION=0.8
+RELEASE=1.FC5
/cvs/cluster/conga/ricci/autogen.sh,v --> standard output
revision 1.1
--- conga/ricci/autogen.sh
+++ - 2006-06-14 21:44:39.814945000 +0000
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+# TODO: implement me
+
+
+cp make/defines.mk.in make/defines.mk
--- conga/ricci/Makefile 2006/06/02 00:14:29 1.6
+++ conga/ricci/Makefile 2006/06/14 21:44:34 1.7
@@ -10,6 +10,7 @@
#include make/version.in
+include make/defines.mk
@@ -38,21 +39,10 @@
make -C init.d clean
make -C pam.d clean
make -C oddjobd.conf.d clean
- rm -f ricci.spec.in ricci.spec
distclean: clean
-# rm -f make/defines.mk
+ rm -f make/defines.mk
check:
rebuild: clean all
-
-#spec:
-# sed -e 's/@@VERS@@/${VERSION}/g' ricci.spec.in.in > ricci.spec.in
-# sed -e 's/@@REL@@/${RELEASE}/g' ricci.spec.in > ricci.spec
-
-
-#srpm: clean spec
-#srpm:
-# make -C .. ricci-srpm
-# mv ../ricci-${VERSION}-${RELEASE}.src.rpm .
--- conga/ricci/configure 2006/05/26 22:17:35 1.2
+++ conga/ricci/configure 2006/06/14 21:44:34 1.3
@@ -1,17 +1,39 @@
#!/bin/bash
-# TODO: implement me
+# improve me
-LIBDIR_SED=\\/usr\\/lib
+MAKE_DEFINES=make/defines.mk
+
+
+echo "# generated automaticaly by ./configure" > $MAKE_DEFINES
+echo "# modify make/defines.mk.in for permanent changes" >> $MAKE_DEFINES
+echo >> $MAKE_DEFINES
+cat ../make/version.in >> $MAKE_DEFINES
+echo >> $MAKE_DEFINES
+echo "# priority: 1. make's params, 2. configure's params, 3. default params" >> $MAKE_DEFINES
+echo >> $MAKE_DEFINES
+echo >> $MAKE_DEFINES
+
+echo "# configure's params:" >> make/defines.mk
+for arg in $@
+do
+ var=`echo $arg | sed -e s,^--\\\\\(.*\\\\\)=\\\\\(.*\\\\\),\\\1\ ?=\ \\\2,`
+ var=`echo $var | sed -e s,?=\ /,?=\ \\${DESTDIR}/,`
+ echo $var >> $MAKE_DEFINES
+done
+
+
+
+LIBDIR_SED=\\/lib
X86_64_TMP=`uname -a | grep x86_64`
if [ "$X86_64_TMP" ]; then
- LIBDIR_SED=\\/usr\\/lib64
+ LIBDIR_SED=\\/lib64
fi
-sed -e "s/@@LIBDIR@@/$LIBDIR_SED/g" make/defines.mk.in > make/defines.mk
+sed -e "s,@@LIBDIR@@,$LIBDIR_SED,g" $MAKE_DEFINES.in | sed -e "s,@@ARCH@@,`uname -m`,g" >> $MAKE_DEFINES
+
-echo "Run 'make' to compile ricci"
exit 0
--- conga/ricci/init.d/Makefile 2006/03/13 19:03:31 1.1
+++ conga/ricci/init.d/Makefile 2006/06/14 21:44:34 1.2
@@ -18,8 +18,8 @@
all:
install:
- install -d ${DESTDIR}/etc/init.d
- install ${TARGET} ${DESTDIR}/etc/init.d
+ install -d ${sysconfdir}/rc.d/init.d
+ install ${TARGET} ${sysconfdir}/rc.d/init.d
uninstall:
--- conga/ricci/make/defines.mk.in 2006/05/26 22:17:35 1.1
+++ conga/ricci/make/defines.mk.in 2006/06/14 21:44:36 1.2
@@ -1,8 +1,27 @@
-# TODO: implement and integrate with configure
+# default params:
+program-prefix ?=
+prefix ?= ${DESTDIR}/usr
+exec-prefix ?= ${DESTDIR}/usr
+bindir ?= ${exec-prefix}/bin
+sbindir ?= ${exec-prefix}/sbin
+sysconfdir ?= ${DESTDIR}/etc
+datadir ?= ${prefix}/share
+includedir ?= ${prefix}/include
+libdir ?= ${prefix}@@LIBDIR@@
+libexecdir ?= ${prefix}/libexec
+localstatedir ?= ${DESTDIR}/var
+sharedstatedir ?= ${prefix}/com
+mandir ?= ${datadir}/man
+infodir ?= ${datadir}/info
+docdir ?= ${datadir}/doc
+arch ?= @@ARCH@@
+pegasus_providers_dir ?= ${libdir}/Pegasus/providers
+#--build=i686-redhat-linux-gnu
+#--host=i686-redhat-linux-gnu
+#--target=i386-redhat-linux-gnu
-sbindir ?= ${DESTDIR}/usr/sbin
-LIBDIR=@@LIBDIR@@
-RANLIB=ranlib
+RANLIB ?= ranlib
+
/cvs/cluster/conga/ricci/modules/cluster/clumon/COPYING,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/COPYING
+++ - 2006-06-14 21:44:40.278175000 +0000
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
/cvs/cluster/conga/ricci/modules/cluster/clumon/README,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/README
+++ - 2006-06-14 21:44:40.364129000 +0000
@@ -0,0 +1 @@
+Work in progress, everything subject to change, including MIB and CIM schema
/cvs/cluster/conga/ricci/modules/cluster/clumon/README.cim,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/README.cim
+++ - 2006-06-14 21:44:40.443804000 +0000
@@ -0,0 +1,13 @@
+
+To execute following commands, Pegasus CIM server has to be running
+and root account has to be used,
+
+Register Red Hat Cluster provider:
+cimmof -n root/PG_InterOp RedHat_ClusterProvider.mof
+
+Install Red Hat Cluster schema:
+cimmof -n root/cimv2 RedHat_ClusterSchema.mof
+
+
+Refer to Pegasus documentation and /usr/share/doc/tog-pegasus for CIM
+user management and ACL.
/cvs/cluster/conga/ricci/modules/cluster/clumon/README.snmpd,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/README.snmpd
+++ - 2006-06-14 21:44:40.528120000 +0000
@@ -0,0 +1,62 @@
+
+net-snmp configuration:
+
+Refer to net-snmp documentation for ACL configuration (/etc/snmp/snmpd.conf is commented as well).
+To load cluster MIB's shared library, add following line to /etc/snmpd/snmp.conf
+dlmod RedHatCluster /usr/lib/cluster-snmp/libClusterMonitorSnmp.so
+
+
+Sample configurations:
+
+1. cluster info is accessible from anywhere using "public" community (add the following to default /etc/snmp/snmpd.conf):
+
+######################################
+## cluster monitoring configuration ##
+######################################
+
+dlmod RedHatCluster /usr/lib/cluster-snmp/libClusterMonitorSnmp.so
+view systemview included REDHAT-CLUSTER-MIB:RedHatCluster
+
+######################################
+## cluster monitoring done ##
+######################################
+
+
+
+2. cluster info is accessible from localhost and 192.168.0.0/16 using "cluster" community:
+
+######################################
+## cluster monitoring configuration ##
+######################################
+
+dlmod RedHatCluster /usr/lib/cluster-snmp/libClusterMonitorSnmp.so
+
+# sec.name source community
+com2sec local localhost cluster
+com2sec localnet 192.168.0.0/16 cluster
+
+# groupName securityModel securityName
+group clusterGroup v1 local
+group clusterGroup v2c local
+group clusterGroup v1 localnet
+group clusterGroup v2c localnet
+
+# name incl/excl subtree mask(optional)
+view clusterview included REDHAT-CLUSTER-MIB:RedHatCluster
+
+# group context sec.model sec.level prefix read write notif
+access clusterGroup "" any noauth prefix clusterview none none
+
+######################################
+## cluster monitoring done ##
+######################################
+
+
+
+net-snmp client configuration:
+Place REDHAT-MIB and REDHAT-CLUSTER-MIB into ~/.snmp/mibs/, and query cluster using:
+snmpwalk -v 2c -c COMMUNITY NODENAME REDHAT-CLUSTER-MIB::RedHatCluster
+(replace NODENAME with the hostname of one of cluster nodes running software)
+
+
+
/cvs/cluster/conga/ricci/modules/cluster/clumon/REDHAT-CLUSTER-MIB,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/REDHAT-CLUSTER-MIB
+++ - 2006-06-14 21:44:40.631225000 +0000
@@ -0,0 +1,380 @@
+REDHAT-CLUSTER-MIB DEFINITIONS ::= BEGIN
+
+
+IMPORTS
+ RedHat FROM REDHAT-MIB
+ MODULE-IDENTITY, OBJECT-TYPE, Integer32 FROM SNMPv2-SMI;
+
+
+RedHatCluster MODULE-IDENTITY
+ LAST-UPDATED "200512060000Z" -- Dec 06 2005, midnight
+ ORGANIZATION "Red Hat, Inc (www.redhat.com)"
+ CONTACT-INFO "postal: Red Hat, Inc
+ 1801 Varsity Drive
+ Raleigh, North Carolina 27606
+ USA
+
+ email: customerservice at redhat.com
+ "
+ DESCRIPTION "Red Hat Cluster Suite MIB
+ "
+ REVISION "200512060000Z" -- Dec 06 2005, midnight
+ DESCRIPTION "MIB version 1
+ "
+ ::= { RedHat 8 }
+
+
+
+rhcMIBInfo OBJECT IDENTIFIER ::= { RedHatCluster 1 }
+rhcCluster OBJECT IDENTIFIER ::= { RedHatCluster 2 }
+rhcTables OBJECT IDENTIFIER ::= { RedHatCluster 3 }
+
+
+
+
+-- ##### MIB info #####
+
+rhcMIBVersion OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Version of Red Hat Cluster MIB
+ "
+ ::= { rhcMIBInfo 1 }
+
+
+
+-- ##### Cluster ##### --
+
+rhcClusterName OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Cluster name"
+ ::= { rhcCluster 1 }
+
+
+rhcClusterStatusCode OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Cluster status code.
+ ORed values:
+ 1 All services and nodes functional
+ 2 Some services failed
+ 4 Some services not running
+ 8 Some nodes unavailable
+ 16 Not quorate
+ 32 Cluster stopped
+ "
+ ::= { rhcCluster 2 }
+
+rhcClusterStatusDesc OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Cluster status description"
+ ::= { rhcCluster 3 }
+
+
+rhcClusterVotesNeededForQuorum OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Minimum number of votes required for quorum.
+ If cluster is not quorate, all services are stopped."
+ ::= { rhcCluster 4 }
+
+rhcClusterVotes OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Current number of votes"
+ ::= { rhcCluster 5 }
+
+rhcClusterQuorate OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "1 if cluster is quorate, 0 otherwise"
+ ::= { rhcCluster 6 }
+
+
+rhcClusterNodesNum OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Number of nodes configured to participate in cluster"
+ ::= { rhcCluster 7 }
+
+rhcClusterNodesNames OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Names of nodes configured to participate in cluster"
+ ::= { rhcCluster 8 }
+
+rhcClusterAvailNodesNum OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Number of nodes currently participating in cluster"
+ ::= { rhcCluster 9 }
+
+rhcClusterAvailNodesNames OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Names of nodes currently participating in cluster"
+ ::= { rhcCluster 10 }
+
+rhcClusterUnavailNodesNum OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Number of nodes currently NOT participating in cluster"
+ ::= { rhcCluster 11 }
+
+rhcClusterUnavailNodesNames OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Names of nodes currently NOT participating in cluster"
+ ::= { rhcCluster 12 }
+
+
+rhcClusterServicesNum OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Number of configured services"
+ ::= { rhcCluster 13 }
+
+rhcClusterServicesNames OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Names of configured services"
+ ::= { rhcCluster 14 }
+
+rhcClusterRunningServicesNum OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Number of running services"
+ ::= { rhcCluster 15 }
+
+rhcClusterRunningServicesNames OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Names of running services"
+ ::= { rhcCluster 16 }
+
+rhcClusterStoppedServicesNum OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Number of stopped services"
+ ::= { rhcCluster 17 }
+
+rhcClusterStoppedServicesNames OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Names of stopped services"
+ ::= { rhcCluster 18 }
+
+rhcClusterFailedServicesNum OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Number of failed services"
+ ::= { rhcCluster 19 }
+
+rhcClusterFailedServicesNames OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Names of failed services"
+ ::= { rhcCluster 20 }
+
+
+
+-- ##### nodes ##### --
+
+
+rhcNodesTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF RhcNodeEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "Table of cluster nodes"
+ ::= { rhcTables 1 }
+
+rhcNodeEntry OBJECT-TYPE
+ SYNTAX RchNodeEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "Cluster node"
+ INDEX { rhcNodeName }
+ ::= { rhcNodesTable 1 }
+
+RhcNodeEntry ::= SEQUENCE {
+ rhcNodeName OCTET STRING,
+ rhcNodeStatusCode Integer32,
+ rhcNodeStatusDesc OCTET STRING,
+ rhcNodeRunningServicesNum Integer32,
+ rhcNodeRunningServicesNames OCTET STRING
+}
+
+rhcNodeName OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Node name"
+ ::= { rhcNodeEntry 1 }
+
+
+rhcNodeStatusCode OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Node status code.
+ Values:
+ 0 Participating in cluster
+ 1 Running, but not participating in cluster
+ 2 Not running
+ "
+ ::= { rhcNodeEntry 2 }
+
+rhcNodeStatusDesc OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Node status description"
+ ::= { rhcNodeEntry 3 }
+
+
+rhcNodeRunningServicesNum OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Number of services running on node"
+ ::= { rhcNodeEntry 4 }
+
+rhcNodeRunningServicesNames OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Names of services running on node"
+ ::= { rhcNodeEntry 5 }
+
+
+
+-- ##### services ##### --
+
+
+rhcServicesTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF RhcServiceEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "Table of cluster services"
+ ::= { rhcTables 2 }
+
+rhcServiceEntry OBJECT-TYPE
+ SYNTAX RchServiceEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "Cluster service"
+ INDEX { rhcServiceName }
+ ::= { rhcServicesTable 1 }
+
+RhcServiceEntry ::= SEQUENCE {
+ rhcServiceName OCTET STRING,
+ rhcServiceStatusCode Integer32,
+ rhcServiceStatusDesc OCTET STRING,
+ rhcServiceStartMode OCTET STRING,
+ rhcServiceRunningOnNode OCTET STRING
+}
+
+rhcServiceName OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Service name"
+ ::= { rhcServiceEntry 1 }
+
+rhcServiceStatusCode OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Service status code.
+ Codes:
+ 0 running
+ 1 stopped
+ 2 failed
+ "
+ ::= { rhcServiceEntry 2 }
+
+rhcServiceStatusDesc OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Dervice status description"
+ ::= { rhcServiceEntry 3 }
+
+rhcServiceStartMode OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Service start mode, automatic or manual"
+ ::= { rhcServiceEntry 4 }
+
+rhcServiceRunningOnNode OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Name of node the service runs on"
+ ::= { rhcServiceEntry 5 }
+
+
+
+
+END
+
+
/cvs/cluster/conga/ricci/modules/cluster/clumon/REDHAT-MIB,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/REDHAT-MIB
+++ - 2006-06-14 21:44:40.760651000 +0000
@@ -0,0 +1,35 @@
+REDHAT-MIB DEFINITIONS ::= BEGIN
+
+
+IMPORTS
+ enterprises FROM RFC1155-SMI
+ MODULE-IDENTITY FROM SNMPv2-SMI;
+
+
+RedHat MODULE-IDENTITY
+ LAST-UPDATED "200512060000Z" -- Dec 06 2005, midnight
+ ORGANIZATION "Red Hat, Inc (www.redhat.com)"
+ CONTACT-INFO "postal: Red Hat, Inc
+ 1801 Varsity Drive
+ Raleigh, North Carolina 27606
+ USA
+
+ email: customerservice at redhat.com
+ "
+ DESCRIPTION "Red Hat, Inc MIB
+ "
+ REVISION "200512060000Z" -- Dec 06 2005, midnight
+ DESCRIPTION "Initial version.
+ "
+ ::= { enterprises 2312 }
+
+
+
+-- 4 Red Hat OS Development
+-- 5 Red Hat IS/IT
+-- 6 Red Hat Directory Server
+-- 7 Red Hat Network
+-- 8 Red Hat Cluster Suite
+
+
+END
/cvs/cluster/conga/ricci/modules/cluster/clumon/RedHat_ClusterProvider.mof,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/RedHat_ClusterProvider.mof
+++ - 2006-06-14 21:44:40.889311000 +0000
@@ -0,0 +1,92 @@
+instance of PG_ProviderModule
+{
+ Description = "RedHat Cluster Suite Provider Module";
+ Name = "RedHatClusterProviderModule";
+ Vendor = "RedHat";
+ Version = "0.0.1";
+ InterfaceType = "C++Default";
+ InterfaceVersion = "2.1.0";
+ Location = "RedHatClusterProvider";
+};
+
+instance of PG_Provider
+{
+ Name = "RedHatClusterProvider";
+ ProviderModuleName = "RedHatClusterProviderModule";
+};
+
+instance of PG_ProviderCapabilities
+{
+ ProviderModuleName = "RedHatClusterProviderModule";
+ ProviderName = "RedHatClusterProvider";
+ CapabilityID = "1";
+ ClassName = "RedHat_Cluster";
+ Namespaces = {"root/cimv2"};
+ ProviderType = { 2, 3 }; // Instance, Association
+ SupportedProperties = NULL;
+ SupportedMethods = NULL;
+};
+
+instance of PG_ProviderCapabilities
+{
+ ProviderModuleName = "RedHatClusterProviderModule";
+ ProviderName = "RedHatClusterProvider";
+ CapabilityID = "2";
+ ClassName = "RedHat_ClusterNode";
+ Namespaces = {"root/cimv2"};
+ ProviderType = { 2, 3 }; // Instance, Association
+ SupportedProperties = NULL;
+ SupportedMethods = NULL;
+};
+
+instance of PG_ProviderCapabilities
+{
+ ProviderModuleName = "RedHatClusterProviderModule";
+ ProviderName = "RedHatClusterProvider";
+ CapabilityID = "3";
+ ClassName = "RedHat_ClusterParticipatingNode";
+ Namespaces = {"root/cimv2"};
+ ProviderType = { 2, 3 }; // Instance
+ SupportedProperties = NULL;
+ SupportedMethods = NULL;
+};
+
+
+
+
+
+instance of PG_ProviderCapabilities
+{
+ ProviderModuleName = "RedHatClusterProviderModule";
+ ProviderName = "RedHatClusterProvider";
+ CapabilityID = "4";
+ ClassName = "RedHat_ClusterFailoverService";
+ Namespaces = {"root/cimv2"};
+ ProviderType = { 2, 3 }; // Instance, Association
+ SupportedProperties = NULL;
+ SupportedMethods = NULL;
+};
+
+instance of PG_ProviderCapabilities
+{
+ ProviderModuleName = "RedHatClusterProviderModule";
+ ProviderName = "RedHatClusterProvider";
+ CapabilityID = "5";
+ ClassName = "RedHat_ClusterHostingFailoverService";
+ Namespaces = {"root/cimv2"};
+ ProviderType = { 2, 3 }; // Instance
+ SupportedProperties = NULL;
+ SupportedMethods = NULL;
+};
+
+instance of PG_ProviderCapabilities
+{
+ ProviderModuleName = "RedHatClusterProviderModule";
+ ProviderName = "RedHatClusterProvider";
+ CapabilityID = "6";
+ ClassName = "RedHat_ClusterNodeHostingFailoverService";
+ Namespaces = {"root/cimv2"};
+ ProviderType = { 2, 3 }; // Instance
+ SupportedProperties = NULL;
+ SupportedMethods = NULL;
+};
/cvs/cluster/conga/ricci/modules/cluster/clumon/RedHat_ClusterSchema.mof,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/RedHat_ClusterSchema.mof
+++ - 2006-06-14 21:44:41.023401000 +0000
@@ -0,0 +1,129 @@
+
+[ Description ("RedHat Cluster. \nServices are accessible thru RedHat_ClusterHostingFailoverService.\nNodes are accessible thru RedHat_ClusterParticipatingNode.\nIf RequiredQuorum is not fulfilled, all services are stoped and Status is set to Degraded.\nIf some services have failed, Status is set to Stressed."),
+ Version("0.0.2") ]
+class RedHat_Cluster : CIM_Cluster
+{
+ [ Description("Number of available nodes' votes.") ]
+ uint16 Votes;
+
+ [ Description("Minimum quorum required for cluster to be operational.") ]
+ uint16 VotesNeededForQuorum;
+
+
+ [ Description("Number of nodes.") ]
+ uint16 NodesNumber;
+
+ [ Description("Number of available nodes.") ]
+ uint16 AvailableNodesNumber;
+
+ [ Description("Number of unavailable nodes.") ]
+ uint16 UnavailableNodesNumber;
+
+ [ Description("Node Names.") ]
+ string NodesNames[];
+
+ [ Description("Available Nodes.") ]
+ string AvailableNodesNames[];
+
+ [ Description("Unavailable Nodes.") ]
+ string UnavailableNodesNames[];
+
+
+ [ Description("Number of services.") ]
+ uint16 ServicesNumber;
+
+ [ Description("Number of running services.") ]
+ uint16 RunningServicesNumber;
+
+ [ Description("Number of stopped services.") ]
+ uint16 StoppedServicesNumber;
+
+ [ Description("Number of failed services.") ]
+ uint16 FailedServicesNumber;
+
+ [ Description("Names of running services.") ]
+ string ServicesNames[];
+
+ [ Description("Names of running services.") ]
+ string RunningServicesNames[];
+
+ [ Description("Names of stopped services.") ]
+ string StoppedServicesNames[];
+
+ [ Description("Names of failed services.") ]
+ string FailedServicesNames[];
+};
+
+
+[ Description("Cluster Node"),
+ Version("0.0.2") ]
+class RedHat_ClusterNode : CIM_ComputerSystem
+{
+ [ Key, Description("Name of cluster this node participates in.") ]
+ string ClusterName;
+
+ [ Description("Number of services running on this node") ]
+ uint16 RunningServicesNumber;
+
+ [ Description("Services running on this node") ]
+ string RunningServicesNames[];
+};
+
+
+[ Description("Cluster Failover Service"), Version("0.0.1") ]
+class RedHat_ClusterFailoverService : CIM_ClusteringService
+{
+ [ Description("Node service runs on") ]
+ string NodeName;
+
+ [ Description("Cluster Name") ]
+ string ClusterName;
+};
+
+
+
+
+
+
+
+// ### Associations ###
+
+
+/*
+[ Association,
+ Description("Links cluster to cluster nodes."), Version("0.0.1") ]
+class RedHat_ClusterParticipatingNode : CIM_ParticipatingCS
+{
+ [ Override("Antecedent") ]
+ RedHat_ClusterNode REF Antecedent;
+
+ [ Description("Number of node's votes participating in cluster quorum.") ]
+ uint16 QuorumVotes;
+};
+*/
+
+/*
+[ Association,
+ Description("Defines hosting cluster for cluster service.") ]
+class RedHat_ClusterHostingFailoverService : CIM_HostedClusterService
+{
+ [ Override("Antecedent") ]
+ RedHat_Cluster REF Antecedent;
+
+ [ Override("Dependent") ]
+ RedHat_ClusterFailoverService REF Dependent;
+};
+*/
+
+/*
+[ Association,
+ Description("Defines cluster node on which the cluster service is currently executing.") ]
+class RedHat_ClusterNodeHostingFailoverService : CIM_HostedService
+{
+ [ Override("Antecedent") ]
+ RedHat_ClusterNode REF Antecedent;
+
+ [ Override("Dependent") ]
+ RedHat_ClusterFailoverService REF Dependent;
+};
+*/
--- conga/ricci/modules/cluster/clumon/Makefile 2006/03/27 23:15:30 1.1
+++ conga/ricci/modules/cluster/clumon/Makefile 2006/06/14 21:44:36 1.2
@@ -25,10 +25,24 @@
install:
cd src && ${MAKE} install
cd init.d && ${MAKE} install
-# cd man && ${MAKE} install
-# install -d ${DESTDIR}/usr/share/snmp/mibs
-# install REDHAT-MIB ${DESTDIR}/usr/share/snmp/mibs/
-# install REDHAT-CLUSTER-MIB ${DESTDIR}/usr/share/snmp/mibs/
+ cd man && ${MAKE} install
+# snmp
+ install -d ${datadir}/snmp/mibs
+ install REDHAT-MIB ${datadir}/snmp/mibs/
+ install REDHAT-CLUSTER-MIB ${datadir}/snmp/mibs/
+ install -d ${docdir}/cluster-snmp-${VERSION}
+ install README ${docdir}/cluster-snmp-${VERSION}/
+ install README.snmpd ${docdir}/cluster-snmp-${VERSION}/
+ install COPYING ${docdir}/cluster-snmp-${VERSION}/
+ install REDHAT-MIB ${docdir}/cluster-snmp-${VERSION}/
+ install REDHAT-CLUSTER-MIB ${docdir}/cluster-snmp-${VERSION}/
+# cim
+ install -d ${docdir}/cluster-cim-${VERSION}
+ install README ${docdir}/cluster-cim-${VERSION}/
+ install README.cim ${docdir}/cluster-cim-${VERSION}/
+ install RedHat_ClusterProvider.mof ${docdir}/cluster-cim-${VERSION}/
+ install RedHat_ClusterSchema.mof ${docdir}/cluster-cim-${VERSION}/
+
uninstall:
cd src && ${MAKE} uninstall
--- conga/ricci/modules/cluster/clumon/init.d/Makefile 2006/03/28 15:46:57 1.2
+++ conga/ricci/modules/cluster/clumon/init.d/Makefile 2006/06/14 21:44:36 1.3
@@ -19,8 +19,8 @@
clean:
install:
- install -d ${DESTDIR}/etc/init.d
- install ${TARGET} ${DESTDIR}/etc/init.d
+ install -d ${sysconfdir}/rc.d/init.d
+ install ${TARGET} ${sysconfdir}/rc.d/init.d
uninstall:
${UNINSTALL} ${TARGET} ${DESTDIR}/etc/init.d
--- conga/ricci/modules/cluster/clumon/src/Makefile 2006/03/27 23:15:30 1.1
+++ conga/ricci/modules/cluster/clumon/src/Makefile 2006/06/14 21:44:36 1.2
@@ -14,14 +14,14 @@
all:
cd common && ${MAKE} all
cd daemon && ${MAKE} all
-# cd snmp-agent && ${MAKE} all
-# cd cim-provider && ${MAKE} all
+ cd snmp-agent && ${MAKE} all
+ cd cim-provider && ${MAKE} all
clean:
cd common && ${MAKE} clean
cd daemon && ${MAKE} clean
-# cd snmp-agent && ${MAKE} clean
-# cd cim-provider && ${MAKE} clean
+ cd snmp-agent && ${MAKE} clean
+ cd cim-provider && ${MAKE} clean
check:
cd common && ${MAKE} check
@@ -34,8 +34,8 @@
install:
cd common && ${MAKE} install
cd daemon && ${MAKE} install
-# cd snmp-agent && ${MAKE} install
-# cd cim-provider && ${MAKE} install
+ cd snmp-agent && ${MAKE} install
+ cd cim-provider && ${MAKE} install
uninstall:
cd common && ${MAKE} uninstall
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/cim-provider/ClusterProvider.cpp,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/cim-provider/ClusterProvider.cpp
+++ - 2006-06-14 21:44:41.460315000 +0000
@@ -0,0 +1,1222 @@
+/*
+ Copyright Red Hat, Inc. 2005
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+
+
+#include "ClusterProvider.h"
+#include "SmartHandler.h"
+#include "Cluster.h"
+#include "Logger.h"
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/utsname.h>
+
+#include <algorithm>
+#include <functional>
+#include <vector>
+
+
+
+using namespace std;
+using namespace Pegasus;
+using namespace ClusterMonitoring;
+
+
+static CIMInstance
+buildClusterInstance(counting_auto_ptr<Cluster>& cluster, Boolean qual, Boolean orig);
+static CIMInstance
+buildNodeInstance(counting_auto_ptr<Node>& node, Boolean qual, Boolean orig);
+static CIMInstance
+buildServiceInstance(counting_auto_ptr<Service>& service, Boolean qual, Boolean orig);
+
+
+static CIMObjectPath
+buildClusterInstancePath(counting_auto_ptr<Cluster>& cluster, const CIMNamespaceName& nameSpace);
+static CIMObjectPath
+buildNodeInstancePath(counting_auto_ptr<Node>& node, const CIMNamespaceName& nameSpace);
+static CIMObjectPath
+buildServiceInstancePath(counting_auto_ptr<Service>& service, const CIMNamespaceName& nameSpace);
+
+
+static String
+hostname(void);
+
+
+ClusterProvider::ClusterProvider(void) throw()
+{
+ //set_logger(counting_auto_ptr<Logger>(Logger(LOG_FILE, "ClusterProvider", LogBasic)));
+ log("ClusterProvider Created");
+}
+
+ClusterProvider::~ClusterProvider(void) throw()
+{
+ set_logger(counting_auto_ptr<Logger>(new Logger()));
+}
+
+
+// CIMProvider interface
+void
+ClusterProvider::initialize (CIMOMHandle& cimom)
+{
+ log("ClusterProvider::initialize called");
+}
+
+void
+ClusterProvider::terminate (void)
+{
+ log("ClusterProvider::terminate called");
+ delete this;
+}
+
+
+// CIMInstanceProvider interface
+void
+ClusterProvider::getInstance(const OperationContext &context,
+ const CIMObjectPath &ref,
+ const Boolean includeQualifiers,
+ const Boolean includeClassOrigin,
+ const CIMPropertyList &propertyList,
+ InstanceResponseHandler &handler)
+{
+ counting_auto_ptr<Cluster> cluster = _monitor.get_cluster();
+
+ SmartHandler<InstanceResponseHandler> t(handler);
+
+ CIMName className(ref.getClassName());
+
+ log("getInstance(... " + className.getString() + " ...) called");
+
+ if(className.equal(CLUSTER_CLASSNAME))
+ {
+ if(cluster.get() == NULL)
+ return;
+ CIMObjectPath path = buildClusterInstancePath(cluster,
+ ref.getNameSpace());
+ if(path.identical(ref))
+ {
+ CIMInstance inst = buildClusterInstance(cluster,
+ includeQualifiers,
+ includeClassOrigin);
+ handler.deliver(inst);
+ }
+ }
+ else if(className.equal(CLUSTER_NODE_CLASSNAME))
+ {
+ if(cluster.get() == NULL)
+ return;
+ list<counting_auto_ptr<Node> > nodes = cluster->nodes();
+ for(list<counting_auto_ptr<Node> >::iterator iter = nodes.begin();
+ iter != nodes.end();
+ iter++)
+ {
+ CIMObjectPath path = buildNodeInstancePath(*iter,
+ ref.getNameSpace());
+ if(path.identical(ref))
+ {
+ CIMInstance inst = buildNodeInstance(*iter,
+ includeQualifiers,
+ includeClassOrigin);
+ handler.deliver(inst);
+ }
+ }
+ }
+ else if(className.equal(CLUSTER_SERVICE_CLASSNAME))
+ {
+ if(cluster.get() == NULL)
+ return;
+ list<counting_auto_ptr<Service> > services = cluster->services();
+ for(list<counting_auto_ptr<Service> >::iterator iter = services.begin();
+ iter != services.end();
+ iter++)
+ {
+ CIMObjectPath path = buildServiceInstancePath(*iter,
+ ref.getNameSpace());
+ if(path.identical(ref))
+ {
+ CIMInstance inst = buildServiceInstance(*iter,
+ includeQualifiers,
+ includeClassOrigin);
+ handler.deliver(inst);
+ }
+ }
+ }
+ else
+ throw CIMInvalidParameterException(ref.toString());
+}
+
+void
+ClusterProvider::enumerateInstances(const OperationContext &context,
+ const CIMObjectPath &ref,
+ const Boolean includeQualifiers,
+ const Boolean includeClassOrigin,
+ const CIMPropertyList &propertyList,
+ InstanceResponseHandler &handler)
+{
+ counting_auto_ptr<Cluster> cluster = _monitor.get_cluster();
+
+ SmartHandler<InstanceResponseHandler> t(handler);
+
+ CIMName className(ref.getClassName());
+
+ log("enumerateInstances(... " + className.getString() + " ...) called");
+
+ if(className.equal(CLUSTER_CLASSNAME))
+ {
+ if(cluster.get() == NULL)
+ return;
+ CIMInstance inst = buildClusterInstance(cluster,
+ includeQualifiers,
+ includeClassOrigin);
+ handler.deliver(inst);
+ }
+ else if(className.equal(CLUSTER_NODE_CLASSNAME))
+ {
+ if(cluster.get() == NULL)
+ return;
+ list<counting_auto_ptr<Node> > nodes = cluster->nodes();
+ for(list<counting_auto_ptr<Node> >::iterator iter = nodes.begin();
+ iter != nodes.end();
+ iter++)
+ {
+ CIMInstance inst = buildNodeInstance(*iter,
+ includeQualifiers,
+ includeClassOrigin);
+ handler.deliver(inst);
+ }
+ }
+ else if(className.equal(CLUSTER_SERVICE_CLASSNAME))
+ {
+ if(cluster.get() == NULL)
+ return;
+ list<counting_auto_ptr<Service> > services = cluster->services();
+ for(list<counting_auto_ptr<Service> >::iterator iter = services.begin();
+ iter != services.end();
+ iter++)
+ {
+ CIMInstance inst = buildServiceInstance(*iter,
+ includeQualifiers,
+ includeClassOrigin);
+ handler.deliver(inst);
+ }
+ }
+ else
+ throw CIMInvalidParameterException(ref.toString());
+}
+
+void
+ClusterProvider::enumerateInstanceNames(const OperationContext &context,
+ const CIMObjectPath &classRef,
+ ObjectPathResponseHandler &handler)
+{
+ counting_auto_ptr<Cluster> cluster = _monitor.get_cluster();
+
+ SmartHandler<ObjectPathResponseHandler> t(handler);
+
+ CIMName className(classRef.getClassName());
+
+ log("enumerateInstanceNames(... " + className.getString() + " ...) called");
+
+ if(className.equal(CLUSTER_CLASSNAME))
+ {
+ if(cluster.get() == NULL)
+ return;
+ CIMObjectPath path = buildClusterInstancePath(cluster,
+ classRef.getNameSpace());
+ handler.deliver(path);
+ }
+ else if(className.equal(CLUSTER_NODE_CLASSNAME))
+ {
+ if(cluster.get() == NULL)
+ return;
+ list<counting_auto_ptr<Node> > nodes = cluster->nodes();
+ for(list<counting_auto_ptr<Node> >::iterator iter = nodes.begin();
+ iter != nodes.end();
+ iter++)
+ {
+ CIMObjectPath path = buildNodeInstancePath(*iter,
+ classRef.getNameSpace());
+ handler.deliver(path);
+ }
+ }
+ else if(className.equal(CLUSTER_SERVICE_CLASSNAME))
+ {
+ if(cluster.get() == NULL)
+ return;
+ list<counting_auto_ptr<Service> > services = cluster->services();
+ for(list<counting_auto_ptr<Service> >::iterator iter = services.begin();
+ iter != services.end();
+ iter++)
+ {
+ CIMObjectPath path = buildServiceInstancePath(*iter,
+ classRef.getNameSpace());
+ handler.deliver(path);
+ }
+ }
+ else
+ throw CIMInvalidParameterException(classRef.toString());
+}
+
+
+void
+ClusterProvider::createInstance(const OperationContext &context,
+ const CIMObjectPath &ref,
+ const CIMInstance &obj,
+ ObjectPathResponseHandler &handler)
+{
+ throw CIMNotSupportedException(CLUSTER_PROVIDER_CLASSNAME + "::createInstance");
+}
+
+void
+ClusterProvider::modifyInstance(const OperationContext &context,
+ const CIMObjectPath &ref,
+ const CIMInstance &obj,
+ const Boolean includeQualifiers,
+ const CIMPropertyList &propertyList,
+ ResponseHandler &handler)
+{
+ throw CIMNotSupportedException(CLUSTER_PROVIDER_CLASSNAME + "::modifyInstance");
+}
+
+void
+ClusterProvider::deleteInstance(const OperationContext &context,
+ const CIMObjectPath &ref,
+ ResponseHandler &handler)
+{
+ throw CIMNotSupportedException(CLUSTER_PROVIDER_CLASSNAME + "::deleteInstance");
+}
+
+
+
+
+// private
+
+void
+ClusterProvider::log(const String& str)
+{
+ ::log((const char*) str.getCString());
+}
+
+
+
+
+
+
+CIMInstance
+buildClusterInstance(counting_auto_ptr<Cluster>& cluster, Boolean qual, Boolean orig)
+{
+ CIMInstance inst(CIMName(CLUSTER_CLASSNAME));
+
+ // Name
+ inst.addProperty(CIMProperty(
+ CIMName("Name"),
+ CIMValue(String(cluster->name().c_str()))));
+
+ // Caption
+ //inst.addProperty(CIMProperty(
+ // CIMName("Caption"),
+ // CIMValue(String(cluster.name.c_str()))));
+ // Description
+ //inst.addProperty(CIMProperty(
+ // CIMName("Description"),
+ // CIMValue(String(cluster.name.c_str()))));
+
+ // *** Votes ***
+
+ inst.addProperty(CIMProperty(
+ CIMName("Votes"),
+ CIMValue(Uint16(cluster->votes()))));
+ inst.addProperty(CIMProperty(
+ CIMName("VotesNeededForQuorum"),
+ CIMValue(Uint16(cluster->minQuorum()))));
+
+
+ // *** Nodes ***
+
+ list<counting_auto_ptr<Node> > nodes = cluster->nodes();
+ Array<String> names;
+ Array<String> namesA;
+ Array<String> namesU;
+ for(list<counting_auto_ptr<Node> >::iterator iterN = nodes.begin();
+ iterN != nodes.end();
+ iterN++)
+ {
+ counting_auto_ptr<Node>& node = *iterN;
+ String name(node->name().c_str());
+ names.append(name);
+ if(node->clustered())
+ namesA.append(name);
+ else
+ namesU.append(name);
+ }
+ inst.addProperty(CIMProperty(
+ CIMName("MaxNumberOfNodes"),
+ CIMValue(Uint32(0)))); // unlimited
+ inst.addProperty(CIMProperty(
+ CIMName("NodesNumber"),
+ CIMValue(Uint16(nodes.size()))));
+ inst.addProperty(CIMProperty(
+ CIMName("AvailableNodesNumber"),
+ CIMValue(Uint16(cluster->clusteredNodes().size()))));
+ inst.addProperty(CIMProperty(
+ CIMName("UnavailableNodesNumber"),
+ CIMValue(Uint16(cluster->unclusteredNodes().size()))));
+ inst.addProperty(CIMProperty(
+ CIMName("NodesNames"),
+ CIMValue(names)));
+ inst.addProperty(CIMProperty(
+ CIMName("AvailableNodesNames"),
+ CIMValue(namesA)));
+ inst.addProperty(CIMProperty(
+ CIMName("UnavailableNodesNames"),
+ CIMValue(namesU)));
+
+ // *** services ***
+
+ list<counting_auto_ptr<Service> > services = cluster->services();
+ names.clear();
+ Array<String> namesR;
+ Array<String> namesF;
+ Array<String> namesS;
+ for(list<counting_auto_ptr<Service> >::iterator iterS = services.begin();
+ iterS != services.end();
+ iterS++)
+ {
+ counting_auto_ptr<Service>& service = *iterS;
+ String name(service->name().c_str());
+ names.append(name);
+ if(service->running())
+ namesR.append(name);
+ else
+ namesS.append(name);
+ if(service->failed())
+ namesF.append(name);
+ }
+ inst.addProperty(CIMProperty(
+ CIMName("ServicesNumber"),
+ CIMValue(Uint16(cluster->services().size()))));
+ inst.addProperty(CIMProperty(
+ CIMName("RunningServicesNumber"),
+ CIMValue(Uint16(cluster->runningServices().size()))));
+ inst.addProperty(CIMProperty(
+ CIMName("StoppedServicesNumber"),
+ CIMValue(Uint16(cluster->stoppedServices().size()))));
+ inst.addProperty(CIMProperty(
+ CIMName("FailedServicesNumber"),
+ CIMValue(Uint16(cluster->failedServices().size()))));
+ inst.addProperty(CIMProperty(
+ CIMName("ServicesNames"),
+ CIMValue(names)));
+ inst.addProperty(CIMProperty(
+ CIMName("RunningServicesNames"),
+ CIMValue(namesR)));
+ inst.addProperty(CIMProperty(
+ CIMName("StoppedServicesNames"),
+ CIMValue(namesS)));
+ inst.addProperty(CIMProperty(
+ CIMName("FailedServicesNames"),
+ CIMValue(namesF)));
+
+
+ // *** status begin ***
+
+ bool online = cluster->clusteredNodes().size() > 0;
+ bool failedServices = cluster->failedServices().size() != 0;
+ bool stoppedServices = cluster->stoppedServices().size() != 0;
+ bool unclusteredNodes = cluster->unclusteredNodes().size() != 0;
+ bool quorate = cluster->quorate();
+ Array<Uint16> Ostatus; // OperationalStatus
+ Array<String> statusD; // StatusDescription
+ if(online)
+ {
+ if(quorate)
+ {
+ if(!unclusteredNodes && !failedServices && !stoppedServices)
+ {
+ // OK
+ Ostatus.append(2);
+ statusD.append("All services and nodes functional");
+ }
+ else
+ {
+ if(failedServices)
+ {
+ // Error
+ Ostatus.append(6);
+ statusD.append("Some services failed");
+ }
+ if(stoppedServices)
+ {
+ // Stressed
+ Ostatus.append(4);
+ statusD.append("Some services not running");
+ }
+ if(unclusteredNodes)
+ {
+ // Stressed
+ Ostatus.append(4);
+ statusD.append("Some nodes unavailable");
+ }
+ }
+ }
+ else
+ {
+ // Degraded
+ Ostatus.append(3);
+ statusD.append("All services stopped, not quorate");
+ }
+ }
+ else
+ {
+ // Stopped
+ Ostatus.append(10);
+ statusD.append("Cluster stopped");
+ }
+
+ //inst.addProperty(CIMProperty(
+ // CIMName("Status"),
+ // CIMValue(status)));
+ inst.addProperty(CIMProperty(
+ CIMName("OperationalStatus"),
+ CIMValue(Ostatus)));
+ inst.addProperty(CIMProperty(
+ CIMName("StatusDescriptions"),
+ CIMValue(statusD)));
+
+ CIMValue clusterState;
+ if(online)
+ clusterState = CIMValue(Uint16(2)); // online
+ else
+ clusterState = CIMValue(Uint16(3)); // offline
+ inst.addProperty(CIMProperty(
+ CIMName("ClusterState"),
+ clusterState));
+
+ // *** status done ***
+
+
+ // Types
+ Array<Uint16> types;
+ types.append(2); // failover
+ inst.addProperty(CIMProperty(
+ CIMName("Types"),
+ CIMValue(types)));
+
+
+ // CreationClassName
+ inst.addProperty(CIMProperty(
+ CIMName("CreationClassName"),
+ CIMValue(String(CLUSTER_CLASSNAME))));
+
+ // ResetCapability
+ //inst.addProperty(CIMProperty(
+ // CIMName("ResetCapability"),
+ // CIMValue(Uint16(5)))); // not implemented - cluster :)
+ // PowerManagementCapabilities
+
+ // ElementName
+ // InstallDate
+
+ // EnabledState
+ // OtherEnabledState
+ // EnabledDefault
+
+ // RequestedState
+ // TimeOfLastStateChange
+
+ // Roles
+
+ // NameFormat
+
+ // PrimaryOwnerContact
+ // PrimaryOwnerName
+ // OtherIdentifingInfo
+ // IdentifyingDescription
+
+ // Dedicated
+ // OtherDedicatedDescription
+
+
+ // Interconnect
+ // InterconnectAddress
+
+ return inst;
+}
+
+CIMInstance
+buildNodeInstance(counting_auto_ptr<Node>& node, Boolean qual, Boolean orig)
+{
+ CIMInstance inst(CIMName(CLUSTER_NODE_CLASSNAME));
+ /*
+ [ Key, Description("Name of cluster this node participates in.") ]
+ string ClusterName;
+
+ [ Description("Number of services running on this node") ]
+ uint16 RunningServicesNumber;
+
+ [ Description("Services running on this node") ]
+ uint16 RunningServicesNames;
+ */
+
+ // ClusterName
+ inst.addProperty(CIMProperty(
+ CIMName("ClusterName"),
+ CIMValue(String(node->clustername().c_str()))));
+
+ // Name
+ inst.addProperty(CIMProperty(
+ CIMName("Name"),
+ CIMValue(String(node->name().c_str()))));
+
+ // Caption
+ //inst.addProperty(CIMProperty(
+ // CIMName("Caption"),
+ // CIMValue(String(cluster.name.c_str()))));
+ // Description
+ //inst.addProperty(CIMProperty(
+ // CIMName("Description"),
+ // CIMValue(String(cluster.name.c_str()))));
+
+
+ // *** Votes ***
+
+ inst.addProperty(CIMProperty(
+ CIMName("Votes"),
+ CIMValue(Uint16(node->votes()))));
+
+ // *** services ***
+
+ list<counting_auto_ptr<Service> > services = node->services();
+ Array<String> names;
+ for(list<counting_auto_ptr<Service> >::iterator iter = services.begin();
+ iter != services.end();
+ iter++)
+ {
+ String name((*iter)->name().c_str());
+ names.append(name);
+ }
+ inst.addProperty(CIMProperty(
+ CIMName("RunningServicesNumber"),
+ CIMValue(Uint16(node->services().size()))));
+ inst.addProperty(CIMProperty(
+ CIMName("RunningServicesNames"),
+ CIMValue(names)));
+
+
+ // *** status begin ***
+
+ Array<Uint16> Ostatus; // OperationalStatus
+ Array<String> statusD; // StatusDescription
+ if(node->online() && node->clustered())
+ {
+ // OK
+ Ostatus.append(2);
+ statusD.append("Node available to cluster");
+ }
+ else if(node->online())
+ {
+ // Error
+ Ostatus.append(6);
+ statusD.append("Node running, but unavailable to cluster");
+ }
+ else
+ {
+ // Stopped
+ Ostatus.append(10);
+ statusD.append("Node not running");
+ }
+
+ //inst.addProperty(CIMProperty(
+ // CIMName("Status"),
+ // CIMValue(status)));
+ inst.addProperty(CIMProperty(
+ CIMName("OperationalStatus"),
+ CIMValue(Ostatus)));
+ inst.addProperty(CIMProperty(
+ CIMName("StatusDescriptions"),
+ CIMValue(statusD)));
+
+
+ // CreationClassName
+ inst.addProperty(CIMProperty(
+ CIMName("CreationClassName"),
+ CIMValue(String(CLUSTER_NODE_CLASSNAME))));
+
+ // ResetCapability
+ //inst.addProperty(CIMProperty(
+ // CIMName("ResetCapability"),
+ // CIMValue(Uint16(5)))); // not implemented - cluster :)
+ // PowerManagementCapabilities
+
+ // ElementName
+ // InstallDate
+
+ // EnabledState
+ // OtherEnabledState
+ // EnabledDefault
+
+ // RequestedState
+ // TimeOfLastStateChange
+
+ // Roles
+
+ // NameFormat
+
+ // PrimaryOwnerContact
+ // PrimaryOwnerName
+ // OtherIdentifingInfo
+ // IdentifyingDescription
+
+ // Dedicated
+ // OtherDedicatedDescription
+
+ return inst;
+}
+
+CIMInstance
+buildServiceInstance(counting_auto_ptr<Service>& service, Boolean qual, Boolean orig)
+{
+ CIMInstance inst(CIMName(CLUSTER_SERVICE_CLASSNAME));
+
+ // Name
+ inst.addProperty(CIMProperty(
+ CIMName("Name"),
+ CIMValue(String(service->name().c_str()))));
+
+ // Caption
+ //inst.addProperty(CIMProperty(
+ // CIMName("Caption"),
+ // CIMValue(String(cluster.name.c_str()))));
+ // Description
+ //inst.addProperty(CIMProperty(
+ // CIMName("Description"),
+ // CIMValue(String(cluster.name.c_str()))));
+
+ // ClusterName
+ inst.addProperty(CIMProperty(
+ CIMName("ClusterName"),
+ CIMValue(String(service->clustername().c_str()))));
+
+ // Started
+ inst.addProperty(CIMProperty(
+ CIMName("Started"),
+ CIMValue(service->running())));
+ // StartMode
+ String autostart;
+ if(service->autostart())
+ autostart = "Automatic";
+ else
+ autostart = "Manual";
+ inst.addProperty(CIMProperty(
+ CIMName("StartMode"),
+ CIMValue(autostart)));
+
+ // NodeName
+ if(service->running())
+ {
+ String nodeName = String(service->nodename().c_str());
+ inst.addProperty(CIMProperty(
+ CIMName("NodeName"),
+ CIMValue(nodeName)));
+ }
+
+ // *** status begin ***
+
+ Array<Uint16> Ostatus; // OperationalStatus
+ Array<String> statusD; // StatusDescription
+ if(service->failed())
+ {
+ // Error
+ Ostatus.append(6);
+ statusD.append("Failed");
+ }
+ else if(!service->running())
+ {
+ // Stopped
+ Ostatus.append(10);
+ statusD.append("Stopped");
+ }
+ else
+ {
+ // OK
+ Ostatus.append(2);
+ statusD.append("Running");
+ }
+ //inst.addProperty(CIMProperty(
+ // CIMName("Status"),
+ // CIMValue(status)));
+ inst.addProperty(CIMProperty(
+ CIMName("OperationalStatus"),
+ CIMValue(Ostatus)));
+ inst.addProperty(CIMProperty(
+ CIMName("StatusDescriptions"),
+ CIMValue(statusD)));
+ // *** status done ***
+
+ // CreationClassName
+ inst.addProperty(CIMProperty(
+ CIMName("CreationClassName"),
+ CIMValue(String(CLUSTER_SERVICE_CLASSNAME))));
+
+ // SystemCreationClassName
+ inst.addProperty(CIMProperty(
+ CIMName("SystemCreationClassName"),
+ CIMValue(String(CLUSTER_CLASSNAME))));
+
+ // SystemName
+ inst.addProperty(CIMProperty(
+ CIMName("SystemName"),
+ CIMValue(String(service->clustername().c_str()))));
+
+
+ // ElementName
+ // InstallDate
+
+ // EnabledState
+ // OtherEnabledState
+ // EnabledDefault
+
+ // RequestedState
+ // TimeOfLastStateChange
+
+ // PrimaryOwnerContact
+ // PrimaryOwnerName
+ // OtherIdentifingInfo
+ // IdentifyingDescription
+
+ return inst;
+}
+
+
+
+
+CIMObjectPath
+buildClusterInstancePath(counting_auto_ptr<Cluster>& cluster,
+ const CIMNamespaceName& nameSpace)
+{
+ Array<CIMKeyBinding> keys;
+ keys.append(CIMKeyBinding("CreationClassName",
+ String(CLUSTER_CLASSNAME),
+ CIMKeyBinding::STRING));
+ keys.append(CIMKeyBinding("Name",
+ String(cluster->name().c_str()),
+ CIMKeyBinding::STRING));
+ return CIMObjectPath(hostname(), nameSpace, CLUSTER_CLASSNAME, keys);
+}
+
+CIMObjectPath
+buildNodeInstancePath(counting_auto_ptr<Node>& node,
+ const CIMNamespaceName& nameSpace)
+{
+ Array<CIMKeyBinding> keys;
+ keys.append(CIMKeyBinding("CreationClassName",
+ String(CLUSTER_NODE_CLASSNAME),
+ CIMKeyBinding::STRING));
+ keys.append(CIMKeyBinding("Name",
+ String(node->name().c_str()),
+ CIMKeyBinding::STRING));
+ keys.append(CIMKeyBinding("ClusterName",
+ String(node->clustername().c_str()),
+ CIMKeyBinding::STRING));
+ return CIMObjectPath(hostname(), nameSpace, CLUSTER_NODE_CLASSNAME, keys);
+}
+
+CIMObjectPath
+buildServiceInstancePath(counting_auto_ptr<Service>& service,
+ const CIMNamespaceName& nameSpace)
+{
+ Array<CIMKeyBinding> keys;
+ keys.append(CIMKeyBinding("CreationClassName",
+ String(CLUSTER_SERVICE_CLASSNAME),
+ CIMKeyBinding::STRING));
+ keys.append(CIMKeyBinding("Name",
+ String(service->name().c_str()),
+ CIMKeyBinding::STRING));
+ keys.append(CIMKeyBinding("SystemCreationClassName",
+ String(CLUSTER_CLASSNAME),
+ CIMKeyBinding::STRING));
+ keys.append(CIMKeyBinding("SystemName",
+ String(service->clustername().c_str()),
+ CIMKeyBinding::STRING));
+ return CIMObjectPath(hostname(), nameSpace, CLUSTER_SERVICE_CLASSNAME, keys);
+}
+
+
+String
+hostname()
+{
+ String hostname;
+ struct utsname uts;
+
+ if (uname(&uts) == 0)
+ hostname = uts.nodename;
+ else
+ hostname = "unknown";
+
+ return hostname;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/*
+ ### Implement later ###
+
+
+
+
+class Association
+{
+public:
+ Association(CIMInstance assoc, CIMObjectPath assocPath,
+ CIMInstance ante, CIMObjectPath antePath,
+ CIMInstance dep, CIMObjectPath depPath) :
+ assoc(assoc), assocPath(assocPath),
+ ante(ante), antePath(antePath),
+ dep(dep), depPath(depPath) {}
+
+ CIMInstance assoc;
+ CIMObjectPath assocPath;
+ CIMInstance ante;
+ CIMObjectPath antePath;
+ CIMInstance dep;
+ CIMObjectPath depPath;
+};
+
+vector<Association>
+buildAssociations(Cluster& cluster,
+ const CIMNamespaceName& nameSpace,
+ Boolean quals,
+ Boolean orig);
+
+
+
+static CIMInstance
+buildClusterParticipatingNodeInstance(Cluster& cluster,
+ Node& node,
+ const CIMNamespaceName& nameSpace,
+ Boolean qual,
+ Boolean orig);
+static CIMObjectPath
+buildClusterParticipatingNodeInstancePath(Cluster& cluster,
+ Node& node,
+ const CIMNamespaceName& nameSpace);
+
+
+
+// CIMAssociationProvider interface
+void
+ClusterProvider::associatorNames(const OperationContext& context,
+ const CIMObjectPath& objectName,
+ const CIMName& associationClass,
+ const CIMName& resultClass,
+ const String& role,
+ const String& resultRole,
+ ObjectPathResponseHandler& handler)
+{
+ counting_auto_ptr<Cluster> cluster = _monitor.get_cluster();
+
+ SmartHandler<ObjectPathResponseHandler> t(handler);
+
+ log("associatorNames(" + objectName.toString() + ", " +
+ associationClass.getString() + ", " +
+ resultClass.getString() + ", " +
+ role + ", " +
+ resultRole + ", ...) called");
+ return;
+
+}
+
+void
+ClusterProvider::associators(const OperationContext& context,
+ const CIMObjectPath& objectName,
+ const CIMName& associationClass,
+ const CIMName& resultClass,
+ const String& role,
+ const String& resultRole,
+ const Boolean includeQualifiers,
+ const Boolean includeClassOrigin,
+ const CIMPropertyList& propertyList,
+ ObjectResponseHandler& handler)
+{
+ counting_auto_ptr<Cluster> cluster = _monitor.get_cluster();
+
+ SmartHandler<ObjectResponseHandler> t(handler);
+
+ log("associatorNames(" + objectName.toString() + ", " +
+ associationClass.getString() + ", " +
+ resultClass.getString() + ", " +
+ role + ", " +
+ resultRole + ", ...) called");
+ return;
+
+}
+
+void
+ClusterProvider::referenceNames(const OperationContext& context,
+ const CIMObjectPath& objectName,
+ const CIMName& resultClass,
+ const String& role,
+ ObjectPathResponseHandler& handler)
+{
+ counting_auto_ptr<Cluster> cluster = _monitor.get_cluster();
+
+ SmartHandler<ObjectPathResponseHandler> t(handler);
+
+ CIMName className(objectName.toString());
+
+ log("referenceNames(" + objectName.toString() + ", " +
+ resultClass.getString() + ", " +
+ role + ", ...) called");
+ return;
+
+
+ if(! className.equal(CLUSTER_CLASSNAME) ||
+ ! className.equal(CLUSTER_NODE_CLASSNAME) ||
+ ! className.equal(CLUSTER_SERVICE_CLASSNAME))
+ throw CIMInvalidParameterException(className.getString());
+ if(role.size()!=0 &&
+ !role.equalNoCase(role, "Dependent") &&
+ !role.equalNoCase(role, "Antecedent"))
+ throw CIMInvalidParameterException(className.getString());
+
+
+ if(cluster.get() == NULL)
+ return;
+
+ vector<Association> assocs = buildAssociations(*cluster,
+ objectName.getNameSpace(),
+ false,
+ false);
+
+ for(unsigned int i=0; i<assocs.size(); i++)
+ {
+ Association& assoc = assocs[i];
+
+ if(!objectName.identical(assoc.antePath) && !objectName.identical(assoc.depPath))
+ continue;
+
+ if(!resultClass.isNull() && !resultClass.equal(assoc.assocPath.getClassName()))
+ continue;
+
+ if(role.size()!=0 &&
+ !(role.equalNoCase(role, "Dependent") && objectName.identical(assoc.depPath)) &&
+ !(role.equalNoCase(role, "Antecedent") && objectName.identical(assoc.antePath)))
+ continue;
+
+ handler.deliver(assoc.assocPath);
+ }
+}
+
+void
+ClusterProvider::references(const OperationContext& context,
+ const CIMObjectPath& objectName,
+ const CIMName& resultClass,
+ const String& role,
+ const Boolean includeQualifiers,
+ const Boolean includeClassOrigin,
+ const CIMPropertyList& propertyList,
+ ObjectResponseHandler& handler)
+{
+ counting_auto_ptr<Cluster> cluster = _monitor.get_cluster();
+
+ SmartHandler<ObjectResponseHandler> t(handler);
+
+ CIMName className(objectName.toString());
+
+ log("references(" + objectName.toString() + ", " +
+ resultClass.getString() + ", " +
+ role + ", ...) called");
+ return;
+
+
+ if(! className.equal(CLUSTER_CLASSNAME) ||
+ ! className.equal(CLUSTER_NODE_CLASSNAME) ||
+ ! className.equal(CLUSTER_SERVICE_CLASSNAME))
+ throw CIMInvalidParameterException(className.getString());
+ if(role.size()!=0 &&
+ !role.equalNoCase(role, "Dependent") &&
+ !role.equalNoCase(role, "Antecedent"))
+ throw CIMInvalidParameterException(className.getString());
+
+ if(cluster.get() == NULL)
+ return;
+
+
+ vector<Association> assocs = buildAssociations(*cluster,
+ objectName.getNameSpace(),
+ includeQualifiers,
+ includeClassOrigin);
+
+ for(unsigned int i=0; i<assocs.size(); i++)
+ {
+ Association& assoc = assocs[i];
+
+ if(!objectName.identical(assoc.antePath) && !objectName.identical(assoc.depPath))
+ continue;
+
+ if(!resultClass.isNull() && !resultClass.equal(assoc.assocPath.getClassName()))
+ continue;
+
+ if(role.size()!=0 &&
+ !(role.equalNoCase(role, "Dependent") && objectName.identical(assoc.depPath)) &&
+ !(role.equalNoCase(role, "Antecedent") && objectName.identical(assoc.antePath)))
+ continue;
+
+ handler.deliver(assoc.assoc);
+ }
+}
+
+CIMInstance
+buildClusterParticipatingNodeInstance(Cluster& cluster,
+ Node& node,
+ const CIMNamespaceName& nameSpace,
+ Boolean qual,
+ Boolean orig)
+{
+ CIMInstance inst(CIMName(CLUSTER_PARTICIPATING_NODE_CLASSNAME));
+
+ // *** localy defined ***
+
+ inst.addProperty(CIMProperty(
+ CIMName("QuorumVotes"),
+ CIMValue(Uint16(node.votes))));
+
+ // *** inherited ***
+
+ inst.addProperty(CIMProperty(
+ CIMName("Antecedent"),
+ CIMValue(buildNodeInstancePath(node, nameSpace))));
+
+ inst.addProperty(CIMProperty(
+ CIMName("Dependent"),
+ CIMValue(buildClusterInstancePath(cluster, nameSpace))));
+
+ inst.addProperty(CIMProperty(
+ CIMName("RoleOfNode"),
+ CIMValue(Uint16(2)))); // peers
+
+ // StateOfNode
+ int state;
+ if(node.clustered)
+ state = 4; // clustered
+ else
+ state = 5; // unclustered
+ inst.addProperty(CIMProperty(CIMName("StateOfNode"),
+ CIMValue(Uint16(state))));
+
+ return inst;
+}
+
+CIMObjectPath
+buildClusterParticipatingNodeInstancePath(Cluster& cluster,
+ Node& node,
+ const CIMNamespaceName& nameSpace)
+{
+ Array<CIMKeyBinding> keys;
+ keys.append(CIMKeyBinding("Dependent",
+ String(buildClusterInstancePath(cluster, nameSpace).toString()),
+ CIMKeyBinding::REFERENCE));
+ keys.append(CIMKeyBinding("Antecedent",
+ String(buildNodeInstancePath(node, nameSpace).toString()),
+ CIMKeyBinding::REFERENCE));
+ return CIMObjectPath(hostname(), nameSpace, CLUSTER_PARTICIPATING_NODE_CLASSNAME, keys);
+}
+
+vector<Association>
+buildAssociations(Cluster& cluster,
+ const CIMNamespaceName& nameSpace,
+ Boolean quals,
+ Boolean orig)
+{
+ vector<Association> assocs;
+
+ // cluster - node
+ list<Node>::iterator iter = cluster.getNodes().begin();
+ for( ; iter != cluster.getNodes().end(); iter++)
+ {
+ // association
+ CIMInstance inst = buildClusterParticipatingNodeInstance(cluster,
+ *iter,
+ nameSpace,
+ quals,
+ orig);
+ CIMObjectPath instPath = buildClusterParticipatingNodeInstancePath(cluster,
+ *iter,
+ nameSpace);
+ // ante
+ CIMInstance ante = buildNodeInstance(*iter,
+ quals,
+ orig);
+ CIMObjectPath antePath = buildNodeInstancePath(*iter,
+ nameSpace);
+ // dep
+ CIMInstance dep = buildClusterInstance(cluster,
+ quals,
+ orig);
+ CIMObjectPath depPath = buildClusterInstancePath(cluster,
+ nameSpace);
+
+ Association assoc(inst, instPath,
+ ante, antePath,
+ dep, depPath);
+
+ assocs.push_back(assoc);
+ }
+
+ // cluster - service
+
+
+ // node - service
+
+
+
+ return assocs;
+}
+*/
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/cim-provider/ClusterProvider.h,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/cim-provider/ClusterProvider.h
+++ - 2006-06-14 21:44:41.548757000 +0000
@@ -0,0 +1,144 @@
+/*
+ Copyright Red Hat, Inc. 2005
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+
+
+#ifndef ClusterProvider_h
+#define ClusterProvider_h
+
+#include <Pegasus/Common/Config.h>
+#include <Pegasus/Provider/CIMInstanceProvider.h>
+#include <Pegasus/Provider/CIMAssociationProvider.h>
+
+#include "Cluster.h"
+#include "ClusterMonitor.h"
+
+
+namespace ClusterMonitoring
+{
+
+
+#define CLUSTER_PROVIDER_CLASSNAME Pegasus::String("RedHatClusterProvider")
+#define CLUSTER_SERVICE_CLASSNAME "RedHat_ClusterFailoverService"
+#define CLUSTER_NODE_CLASSNAME "RedHat_ClusterNode"
+#define CLUSTER_CLASSNAME "RedHat_Cluster"
+//#define CLUSTER_PARTICIPATING_NODE_CLASSNAME "RedHat_ClusterParticipatingNode"
+//#define CLUSTER_HOSTING_FAILOVER_SERVICE_CLASSNAME "RedHat_ClusterHostingFailoverService"
+//#define CLUSTER_NODE_HOSTING_FAILOVER_SERVICE_CLASSNAME "RedHat_ClusterNodeHostingFailoverService"
+
+
+
+class ClusterProvider :
+ public Pegasus::CIMInstanceProvider //, public Pegasus::CIMAssociationProvider
+{
+ public:
+ ClusterProvider (void) throw ();
+ virtual ~ClusterProvider (void) throw ();
+
+ // CIMProvider interface
+ virtual void initialize (Pegasus::CIMOMHandle& cimom);
+ virtual void terminate (void);
+
+ // CIMInstanceProvider interface
+ virtual void getInstance(
+ const Pegasus::OperationContext & context,
+ const Pegasus::CIMObjectPath & ref,
+ const Pegasus::Boolean includeQualifiers,
+ const Pegasus::Boolean includeClassOrigin,
+ const Pegasus::CIMPropertyList & propertyList,
+ Pegasus::InstanceResponseHandler & handler);
+ virtual void enumerateInstances(
+ const Pegasus::OperationContext & context,
+ const Pegasus::CIMObjectPath & ref,
+ const Pegasus::Boolean includeQualifiers,
+ const Pegasus::Boolean includeClassOrigin,
+ const Pegasus::CIMPropertyList & propertyList,
+ Pegasus::InstanceResponseHandler & handler);
+ virtual void enumerateInstanceNames(
+ const Pegasus::OperationContext & context,
+ const Pegasus::CIMObjectPath & ref,
+ Pegasus::ObjectPathResponseHandler & handler);
+ virtual void modifyInstance(
+ const Pegasus::OperationContext & context,
+ const Pegasus::CIMObjectPath & ref,
+ const Pegasus::CIMInstance & obj,
+ const Pegasus::Boolean includeQualifiers,
+ const Pegasus::CIMPropertyList & propertyList,
+ Pegasus::ResponseHandler & handler);
+ virtual void createInstance(
+ const Pegasus::OperationContext & context,
+ const Pegasus::CIMObjectPath & ref,
+ const Pegasus::CIMInstance & obj,
+ Pegasus::ObjectPathResponseHandler & handler);
+ virtual void deleteInstance(
+ const Pegasus::OperationContext & context,
+ const Pegasus::CIMObjectPath & ref,
+ Pegasus::ResponseHandler & handler);
+
+ /*
+ // CIMAssociationProvider
+ virtual void associatorNames(
+ const Pegasus::OperationContext& context,
+ const Pegasus::CIMObjectPath& objectName,
+ const Pegasus::CIMName& associationClass,
+ const Pegasus::CIMName& resultClass,
+ const Pegasus::String& role,
+ const Pegasus::String& resultRole,
+ Pegasus::ObjectPathResponseHandler& handler) ;
+
+ virtual void associators(const Pegasus::OperationContext& context,
+ const Pegasus::CIMObjectPath& objectName,
+ const Pegasus::CIMName& associationClass,
+ const Pegasus::CIMName& resultClass,
+ const Pegasus::String& role,
+ const Pegasus::String& resultRole,
+ const Pegasus::Boolean includeQualifiers,
+ const Pegasus::Boolean includeClassOrigin,
+ const Pegasus::CIMPropertyList& propertyList,
+ Pegasus::ObjectResponseHandler& handler);
+
+ virtual void referenceNames(const Pegasus::OperationContext& context,
+ const Pegasus::CIMObjectPath& objectName,
+ const Pegasus::CIMName& resultClass,
+ const Pegasus::String& role,
+ Pegasus::ObjectPathResponseHandler& handler);
+
+ virtual void references(const Pegasus::OperationContext& context,
+ const Pegasus::CIMObjectPath& objectName,
+ const Pegasus::CIMName& resultClass,
+ const Pegasus::String& role,
+ const Pegasus::Boolean includeQualifiers,
+ const Pegasus::Boolean includeClassOrigin,
+ const Pegasus::CIMPropertyList& propertyList,
+ Pegasus::ObjectResponseHandler& handler);
+ */
+
+ private:
+ void log(const Pegasus::String& str);
+ ClusterMonitor _monitor;
+
+}; // class ClusterProvider
+
+
+}; // namespace ClusterMonitoring
+
+
+#endif
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/cim-provider/ClusterProviderMain.cpp,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/cim-provider/ClusterProviderMain.cpp
+++ - 2006-06-14 21:44:41.628941000 +0000
@@ -0,0 +1,40 @@
+/*
+ Copyright Red Hat, Inc. 2005
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+
+
+#include <Pegasus/Common/Config.h>
+#include <Pegasus/Common/String.h>
+
+#include "ClusterProvider.h"
+
+
+using namespace Pegasus;
+
+extern "C" PEGASUS_EXPORT Pegasus::CIMProvider* PegasusCreateProvider(const String &providerName)
+{
+ if (String::equalNoCase(providerName, "RedHatClusterProvider"))
+ {
+ return new ClusterMonitoring::ClusterProvider();
+ }
+
+ return (0);
+}
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/cim-provider/Makefile,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/cim-provider/Makefile
+++ - 2006-06-14 21:44:41.709957000 +0000
@@ -0,0 +1,89 @@
+################################################################################################################################################################
+##
+## Copyright (C) 2005 Red Hat, Inc. All rights reserved.
+##
+## This copyrighted material is made available to anyone wishing to use,
+## modify, copy, or redistribute it subject to the terms and conditions
+## of the GNU General Public License v.2.
+##
+##############################################################################################################################################################
+
+top_srcdir=../../../../..
+UNINSTALL = ${top_srcdir}/scripts/uninstall.pl
+
+INCLUDE = -I $(top_srcdir)/include -I ../include `xml2-config --cflags`
+
+include ${top_srcdir}/make/defines.mk
+#INCLUDE += -I ${INCLUDE_DIR}
+
+ifeq ($(arch),i386)
+PEGASUS_CXXFLAGS = -DPEGASUS_PLATFORM_LINUX_IX86_GNU
+endif
+ifeq ($(arch),i586)
+PEGASUS_CXXFLAGS = -DPEGASUS_PLATFORM_LINUX_IX86_GNU
+endif
+ifeq ($(arch),i686)
+PEGASUS_CXXFLAGS = -DPEGASUS_PLATFORM_LINUX_IX86_GNU
+endif
+ifeq ($(arch),athlon)
+PEGASUS_CXXFLAGS = -DPEGASUS_PLATFORM_LINUX_IX86_GNU
+endif
+ifeq ($(arch),ia64)
+PEGASUS_CXXFLAGS = -DPEGASUS_PLATFORM_LINUX_IA64_GNU
+endif
+ifeq ($(arch),x86_64)
+PEGASUS_CXXFLAGS = -DPEGASUS_PLATFORM_LINUX_IA64_GNU
+endif
+
+ifeq ($(arch),ppc)
+PEGASUS_CXXFLAGS = -DPEGASUS_PLATFORM_LINUX_PPC_GNU
+endif
+ifeq ($(arch),ppc64)
+PEGASUS_CXXFLAGS = -DPEGASUS_PLATFORM_LINUX_PPC64_GNU
+endif
+
+ifeq ($(arch),s390)
+PEGASUS_CXXFLAGS = -DPEGASUS_PLATFORM_LINUX_ZSERIES_GNU
+endif
+ifeq ($(arch),s390x)
+PEGASUS_CXXFLAGS = -DPEGASUS_PLATFORM_LINUX_ZSERIES64_GNU
+endif
+
+
+
+CXXFLAGS += $(PEGASUS_CXXFLAGS) ${INCLUDE}
+
+#LDFLAGS += -fPIC -shared -ldl -lpthread -lcrypt \
+# -L${top_srcdir}/src/common -lClusterMonitor `xml2-config --libs`
+LDFLAGS += -fPIC -shared -ldl -lpthread -lcrypt \
+ ${top_srcdir}/common/*.o ../common/*.o `xml2-config --libs`
+
+OBJECTS = ClusterProviderMain.o ClusterProvider.o
+
+TARGET = libRedHatClusterProvider.so
+TARGET_TEST = clusterCIM_test
+
+
+
+all: ${TARGET} $(TARGET_TEST)
+
+install:
+ install -d ${pegasus_providers_dir}
+ install ${TARGET} ${pegasus_providers_dir}
+
+uninstall:
+ ${UNINSTALL} ${TARGET} ${pegasus_providers_dir}
+
+clean:
+ rm -f $(OBJECTS) $(TARGET) $(TARGET_TEST)
+
+check:
+
+rebuild: clean all
+
+
+$(TARGET): $(OBJECTS)
+ $(CXX) $(LDFLAGS) -o $@ $(OBJECTS)
+
+$(TARGET_TEST): clusterCIM_test.*
+ $(CXX) -Wall -Wno-unused ${INCLUDE} $(PEGASUS_CXXFLAGS) -lpegcommon -lpegclient -lpthread -lcrypt -o $@ $@.cpp
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/cim-provider/SmartHandler.h,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/cim-provider/SmartHandler.h
+++ - 2006-06-14 21:44:41.792310000 +0000
@@ -0,0 +1,48 @@
+/*
+ Copyright Red Hat, Inc. 2005
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+
+
+#ifndef SmartHandler_h
+#define SmartHandler_h
+
+
+namespace ClusterMonitoring
+{
+
+
+template<class cl>
+class SmartHandler
+{
+ public:
+ SmartHandler(cl &handler) : _handler(handler) { _handler.processing(); }
+ virtual ~SmartHandler(void) { _handler.complete(); }
+
+ private:
+ cl& _handler;
+
+}; // class SmartHandler
+
+
+}; // namespace ClusterMonitoring
+
+
+#endif
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/cim-provider/clusterCIM_test.cpp,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/cim-provider/clusterCIM_test.cpp
+++ - 2006-06-14 21:44:41.872232000 +0000
@@ -0,0 +1,161 @@
+#include "clusterCIM_test.h"
+
+#include <Pegasus/Common/SSLContext.h>
+
+
+PEGASUS_USING_PEGASUS;
+PEGASUS_USING_STD;
+
+
+int
+main(int argc, char** argv)
+{
+ try
+ {
+ CIMClient client;
+ string hostname;
+
+ if (argc == 1) {
+ cout << "Enter hostname: ";
+ cin >> hostname;
+ }
+ else if (argc == 2)
+ hostname = argv[1];
+ else {
+ cout << "Usage:" << endl;
+ cout << " " << argv[0] << " <hostname>" << endl;
+ return 1;
+ }
+
+ // connect
+
+ if (hostname == "localhost")
+ client.connectLocal();
+ else {
+ string username, password;
+ cout << "Enter username: ";
+ cin >> username;
+ cout << "Enter password for user \"" + username + "\" on \"" + hostname + "\": ";
+ cin >> password;
+
+ client.connect(hostname.c_str(),
+ PEGASUS_PORT,
+ SSLContext("", NULL),
+ username.c_str(),
+ password.c_str());
+ }
+
+ // print
+
+ printClusters(client);
+ printNodes(client);
+ printServices(client);
+ }
+ catch(Exception& e)
+ {
+ cerr << "Error: " << e.getMessage() << endl;
+ exit(1);
+ }
+
+ return 0;
+}
+
+
+void
+printClusters(CIMClient& client)
+{
+ const CIMNamespaceName NAMESPACE = CIMNamespaceName("root/cimv2");
+ const CIMName CLASSNAME = CIMName("RedHat_Cluster");
+
+ Boolean deepInheritance = true;
+ Boolean localOnly = true;
+ Boolean includeQualifiers = false;
+ Boolean includeClassOrigin = false;
+ Array<CIMInstance> cimInstances;
+
+ //
+ // Enumerate Instances.
+ //
+ cimInstances = client.enumerateInstances(NAMESPACE,
+ CLASSNAME,
+ deepInheritance,
+ localOnly,
+ includeQualifiers,
+ includeClassOrigin );
+ int size = cimInstances.size();
+ if (size == 0)
+ cout << "Cluster info is not accessible" << endl;
+ for (int i=0; i<size; i++) {
+ cout << "Cluster: " << endl;
+ printInstance("\t", cimInstances[i]);
+ }
+}
+
+void
+printNodes(CIMClient& client)
+{
+ const CIMNamespaceName NAMESPACE = CIMNamespaceName("root/cimv2");
+ const CIMName CLASSNAME = CIMName("RedHat_ClusterNode");
+
+ Boolean deepInheritance = true;
+ Boolean localOnly = true;
+ Boolean includeQualifiers = false;
+ Boolean includeClassOrigin = false;
+ Array<CIMInstance> cimInstances;
+
+ //
+ // Enumerate Instances.
+ //
+ cimInstances = client.enumerateInstances(NAMESPACE,
+ CLASSNAME,
+ deepInheritance,
+ localOnly,
+ includeQualifiers,
+ includeClassOrigin );
+ int size = cimInstances.size();
+ for (int i=0; i<size; i++) {
+ cout << "\tNode: " << endl;
+ printInstance("\t\t", cimInstances[i]);
+ }
+}
+
+void
+printServices(CIMClient& client)
+{
+ const CIMNamespaceName NAMESPACE = CIMNamespaceName("root/cimv2");
+ const CIMName CLASSNAME = CIMName("RedHat_ClusterFailoverService");
+
+ Boolean deepInheritance = true;
+ Boolean localOnly = true;
+ Boolean includeQualifiers = false;
+ Boolean includeClassOrigin = false;
+ Array<CIMInstance> cimInstances;
+
+ //
+ // Enumerate Instances.
+ //
+ cimInstances = client.enumerateInstances(NAMESPACE,
+ CLASSNAME,
+ deepInheritance,
+ localOnly,
+ includeQualifiers,
+ includeClassOrigin );
+ int size = cimInstances.size();
+ for (int i=0; i<size; i++) {
+ cout << "\tService: " << endl;
+ printInstance("\t\t", cimInstances[i]);
+ }
+}
+
+void
+printInstance(string tab, CIMInstance& inst)
+{
+ int size = inst.getPropertyCount();
+ for (int i=0; i<size; i++) {
+ CIMProperty prop = inst.getProperty(i);
+
+ cout << tab << prop.getName().getString() << ": ";
+ cout << prop.getValue().toString() << endl;
+
+ }
+}
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/cim-provider/clusterCIM_test.h,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/cim-provider/clusterCIM_test.h
+++ - 2006-06-14 21:44:41.955896000 +0000
@@ -0,0 +1,23 @@
+#ifndef ClusterClient_h
+#define ClusterClient_h
+
+#include <Pegasus/Common/Config.h>
+#include <Pegasus/Common/CIMInstance.h>
+#include <Pegasus/Client/CIMClient.h>
+
+
+PEGASUS_USING_PEGASUS;
+PEGASUS_USING_STD;
+
+
+#define PEGASUS_PORT 5989
+
+
+void printClusters(CIMClient& client);
+void printNodes(CIMClient& client);
+void printServices(CIMClient& client);
+
+void printInstance(string tab, CIMInstance& inst);
+
+
+#endif
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/common/ClusterMonitor.cpp,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/common/ClusterMonitor.cpp
+++ - 2006-06-14 21:44:42.037451000 +0000
@@ -0,0 +1,84 @@
+/*
+ Copyright Red Hat, Inc. 2005
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+
+
+#include "ClusterMonitor.h"
+#include "Socket.h"
+#include "Time.h"
+
+#include <sys/poll.h>
+#include <errno.h>
+
+
+using namespace ClusterMonitoring;
+
+
+ClusterMonitor::ClusterMonitor(const std::string& socket_path) :
+ _sock_path(socket_path)
+{}
+
+ClusterMonitor::~ClusterMonitor()
+{}
+
+
+counting_auto_ptr<Cluster>
+ClusterMonitor::get_cluster()
+{
+ try {
+ ClientSocket sock(_sock_path);
+
+ if(sock.send("GET").size())
+ throw int();
+
+ std::string xml;
+ unsigned int timeout = 1000;
+ while (timeout > 0) {
+ struct pollfd poll_data;
+ poll_data.fd = sock.get_sock();
+ poll_data.events = POLLIN;
+ poll_data.revents = 0;
+
+ unsigned int time_start = time_mil();
+ int ret = poll(&poll_data, 1, timeout);
+ timeout -= (time_mil() - time_start);
+ if (ret == 0)
+ continue;
+ else if (ret == -1) {
+ if (errno == EINTR)
+ continue;
+ else
+ throw std::string("get_cluster(): poll() error");
+ }
+ if (poll_data.revents & POLLIN) {
+ xml += sock.recv();
+ if (xml.find("\n\n") != xml.npos)
+ break;
+ continue;
+ }
+ if (poll_data.revents & (POLLERR | POLLHUP | POLLNVAL))
+ throw std::string("get_cluster(): socket error");
+ }
+ return xml2cluster(xml);
+ } catch ( ... ) {
+ return counting_auto_ptr<Cluster>();
+ }
+}
--- conga/ricci/modules/cluster/clumon/src/common/Makefile 2006/03/27 23:15:30 1.1
+++ conga/ricci/modules/cluster/clumon/src/common/Makefile 2006/06/14 21:44:37 1.2
@@ -25,7 +25,7 @@
# Logger.o \
# Time.o
-OBJECTS = Cluster.o Node.o Service.o
+OBJECTS = Cluster.o Node.o Service.o ClusterMonitor.o
CXXFLAGS = -Wall $(INCLUDE)
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/include/ClusterMonitor.h,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/include/ClusterMonitor.h
+++ - 2006-06-14 21:44:42.206131000 +0000
@@ -0,0 +1,58 @@
+/*
+ Copyright Red Hat, Inc. 2005
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+
+
+#ifndef ClusterMonitor_h
+#define ClusterMonitor_h
+
+#include "Cluster.h"
+#include "counting_auto_ptr.h"
+#include "clumond_globals.h"
+
+#include <string>
+
+
+namespace ClusterMonitoring
+{
+
+
+class ClusterMonitor
+{
+ public:
+ ClusterMonitor(const std::string& socket_path=MONITORING_CLIENT_SOCKET);
+ virtual ~ClusterMonitor();
+
+ counting_auto_ptr<Cluster> get_cluster();
+
+ private:
+ std::string _sock_path;
+
+ ClusterMonitor(const ClusterMonitor&);
+ ClusterMonitor& operator= (const ClusterMonitor&);
+
+}; // class ClusterMonitor
+
+
+}; // namespace ClusterMonitoring
+
+
+#endif
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/snmp-agent/Makefile,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/snmp-agent/Makefile
+++ - 2006-06-14 21:44:42.288681000 +0000
@@ -0,0 +1,66 @@
+################################################################################################################################################################
+##
+## Copyright (C) 2005 Red Hat, Inc. All rights reserved.
+##
+## This copyrighted material is made available to anyone wishing to use,
+## modify, copy, or redistribute it subject to the terms and conditions
+## of the GNU General Public License v.2.
+##
+##############################################################################################################################################################
+
+top_srcdir=../../../../..
+UNINSTALL = ${top_srcdir}/scripts/uninstall.pl
+
+INCLUDE += -I $(top_srcdir)/include -I ../include `xml2-config --cflags`
+
+include ${top_srcdir}/make/defines.mk
+#INCLUDE += -I ${INCLUDE_DIR}
+
+
+SNMP_CFLAGS = `net-snmp-config --cflags`
+CXXFLAGS += $(SNMP_CFLAGS) $(INCLUDE)
+
+
+#LDFLAGS += -fPIC -shared -lpthread \
+# -L${top_srcdir}/src/common -lClusterMonitor \
+# `net-snmp-config --libs` \
+# `xml2-config --libs`
+
+LDFLAGS += -fPIC -shared -lssl -lpthread \
+ ${top_srcdir}/common/*.o ../common/*.o \
+ `net-snmp-config --libs` \
+ `xml2-config --libs`
+
+
+
+OBJECTS = clusterMonitorSnmp.o \
+ clusterMIB.o \
+ nodesMIB.o nodesMIB_access.o nodesMIB_checkfns.o \
+ nodesMIB_checkfns_local.o \
+ servicesMIB.o servicesMIB_access.o \
+ servicesMIB_checkfns.o servicesMIB_checkfns_local.o
+
+TARGET = libClusterMonitorSnmp.so
+
+
+
+all: ${TARGET}
+
+
+install:
+ install -d ${libdir}/cluster-snmp
+ install ${TARGET} ${libdir}/cluster-snmp
+
+uninstall:
+ ${UNINSTALL} ${TARGET} ${libdir}/cluster-snmp
+
+clean:
+ rm -f $(OBJECTS) $(TARGET)
+
+check:
+
+rebuild: clean all
+
+
+$(TARGET): $(OBJECTS)
+ $(CXX) $(LDFLAGS) -o $@ $(OBJECTS)
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/snmp-agent/clusterMIB.cpp,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/snmp-agent/clusterMIB.cpp
+++ - 2006-06-14 21:44:42.370115000 +0000
@@ -0,0 +1,1279 @@
+/*
+ Copyright Red Hat, Inc. 2005
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+/*
+ * Note: this file originally auto-generated by mib2c using
+ * : mib2c.scalar.conf,v 1.7 2003/04/08 14:57:04 dts12 Exp $
+ */
+
+
+#include "clusterMIB.h"
+#include "clusterMonitorSnmp.h"
+
+
+using namespace ClusterMonitoring;
+using namespace std;
+
+
+static unsigned int getStatusCode();
+static string getStatusDescription(unsigned int code);
+
+
+void
+initialize_clusterMIB(void)
+{
+ static oid rhcMIBVersion_oid[] =
+ { 1, 3, 6, 1, 4, 1, 2312, 8, 1, 1 };
+
+ static oid rhcClusterName_oid[] =
+ { 1, 3, 6, 1, 4, 1, 2312, 8, 2, 1 };
+ static oid rhcClusterStatusCode_oid[] =
+ { 1, 3, 6, 1, 4, 1, 2312, 8, 2, 2 };
+ static oid rhcClusterStatusDesc_oid[] =
+ { 1, 3, 6, 1, 4, 1, 2312, 8, 2, 3 };
+ static oid rhcClusterVotesNeededForQuorum_oid[] =
+ { 1, 3, 6, 1, 4, 1, 2312, 8, 2, 4 };
+ static oid rhcClusterVotes_oid[] =
+ { 1, 3, 6, 1, 4, 1, 2312, 8, 2, 5 };
+ static oid rhcClusterQuorate_oid[] =
+ { 1, 3, 6, 1, 4, 1, 2312, 8, 2, 6 };
+ static oid rhcClusterNodesNum_oid[] =
+ { 1, 3, 6, 1, 4, 1, 2312, 8, 2, 7 };
+ static oid rhcClusterNodesNames_oid[] =
+ { 1, 3, 6, 1, 4, 1, 2312, 8, 2, 8 };
+ static oid rhcClusterAvailNodesNum_oid[] =
+ { 1, 3, 6, 1, 4, 1, 2312, 8, 2, 9 };
+ static oid rhcClusterAvailNodesNames_oid[] =
+ { 1, 3, 6, 1, 4, 1, 2312, 8, 2, 10 };
+ static oid rhcClusterUnavailNodesNum_oid[] =
+ { 1, 3, 6, 1, 4, 1, 2312, 8, 2, 11 };
+ static oid rhcClusterUnavailNodesNames_oid[] =
+ { 1, 3, 6, 1, 4, 1, 2312, 8, 2, 12 };
+ static oid rhcClusterServicesNum_oid[] =
+ { 1, 3, 6, 1, 4, 1, 2312, 8, 2, 13 };
+ static oid rhcClusterServicesNames_oid[] =
+ { 1, 3, 6, 1, 4, 1, 2312, 8, 2, 14 };
+ static oid rhcClusterRunningServicesNum_oid[] =
+ { 1, 3, 6, 1, 4, 1, 2312, 8, 2, 15 };
+ static oid rhcClusterRunningServicesNames_oid[] =
+ { 1, 3, 6, 1, 4, 1, 2312, 8, 2, 16 };
+ static oid rhcClusterStoppedServicesNum_oid[] =
+ { 1, 3, 6, 1, 4, 1, 2312, 8, 2, 17 };
+ static oid rhcClusterStoppedServicesNames_oid[] =
+ { 1, 3, 6, 1, 4, 1, 2312, 8, 2, 18 };
+ static oid rhcClusterFailedServicesNum_oid[] =
+ { 1, 3, 6, 1, 4, 1, 2312, 8, 2, 19 };
+ static oid rhcClusterFailedServicesNames_oid[] =
+ { 1, 3, 6, 1, 4, 1, 2312, 8, 2, 20 };
+
+ DEBUGMSGTL(("libClusterMonitorSnmp", "Initializing\n"));
+
+ netsnmp_register_scalar(netsnmp_create_handler_registration
+ ("rhcMIBVersion",
+ handle_rhcMIBVersion,
+ rhcMIBVersion_oid,
+ OID_LENGTH(rhcMIBVersion_oid),
+ HANDLER_CAN_RONLY));
+ netsnmp_register_scalar(netsnmp_create_handler_registration
+ ("rhcClusterFailedServicesNum",
+ handle_rhcClusterFailedServicesNum,
+ rhcClusterFailedServicesNum_oid,
+ OID_LENGTH(rhcClusterFailedServicesNum_oid),
+ HANDLER_CAN_RONLY));
+ netsnmp_register_scalar(netsnmp_create_handler_registration
+ ("rhcClusterFailedServicesNames",
+ handle_rhcClusterFailedServicesNames,
+ rhcClusterFailedServicesNames_oid,
+ OID_LENGTH(rhcClusterFailedServicesNames_oid),
+ HANDLER_CAN_RONLY));
+ netsnmp_register_scalar(netsnmp_create_handler_registration
+ ("rhcClusterStatusDesc",
+ handle_rhcClusterStatusDesc,
+ rhcClusterStatusDesc_oid,
+ OID_LENGTH(rhcClusterStatusDesc_oid),
+ HANDLER_CAN_RONLY));
+ netsnmp_register_scalar(netsnmp_create_handler_registration
+ ("rhcClusterVotes", handle_rhcClusterVotes,
+ rhcClusterVotes_oid,
+ OID_LENGTH(rhcClusterVotes_oid),
+ HANDLER_CAN_RONLY));
+ netsnmp_register_scalar(netsnmp_create_handler_registration
+ ("rhcClusterQuorate", handle_rhcClusterQuorate,
+ rhcClusterQuorate_oid,
+ OID_LENGTH(rhcClusterQuorate_oid),
+ HANDLER_CAN_RONLY));
+ netsnmp_register_scalar(netsnmp_create_handler_registration
+ ("rhcClusterStoppedServicesNum",
+ handle_rhcClusterStoppedServicesNum,
+ rhcClusterStoppedServicesNum_oid,
+ OID_LENGTH(rhcClusterStoppedServicesNum_oid),
+ HANDLER_CAN_RONLY));
+ netsnmp_register_scalar(netsnmp_create_handler_registration
+ ("rhcClusterStoppedServicesNames",
+ handle_rhcClusterStoppedServicesNames,
+ rhcClusterStoppedServicesNames_oid,
+ OID_LENGTH(rhcClusterStoppedServicesNames_oid),
+ HANDLER_CAN_RONLY));
+ netsnmp_register_scalar(netsnmp_create_handler_registration
+ ("rhcClusterAvailNodesNum",
+ handle_rhcClusterAvailNodesNum,
+ rhcClusterAvailNodesNum_oid,
+ OID_LENGTH(rhcClusterAvailNodesNum_oid),
+ HANDLER_CAN_RONLY));
+ netsnmp_register_scalar(netsnmp_create_handler_registration
+ ("rhcClusterAvailNodesNames",
+ handle_rhcClusterAvailNodesNames,
+ rhcClusterAvailNodesNames_oid,
+ OID_LENGTH(rhcClusterAvailNodesNames_oid),
+ HANDLER_CAN_RONLY));
+ netsnmp_register_scalar(netsnmp_create_handler_registration
+ ("rhcClusterServicesNum",
+ handle_rhcClusterServicesNum,
+ rhcClusterServicesNum_oid,
+ OID_LENGTH(rhcClusterServicesNum_oid),
+ HANDLER_CAN_RONLY));
+ netsnmp_register_scalar(netsnmp_create_handler_registration
+ ("rhcClusterServicesNames",
+ handle_rhcClusterServicesNames,
+ rhcClusterServicesNames_oid,
+ OID_LENGTH(rhcClusterServicesNames_oid),
+ HANDLER_CAN_RONLY));
+ netsnmp_register_scalar(netsnmp_create_handler_registration
+ ("rhcClusterName", handle_rhcClusterName,
+ rhcClusterName_oid,
+ OID_LENGTH(rhcClusterName_oid),
+ HANDLER_CAN_RONLY));
+ netsnmp_register_scalar(netsnmp_create_handler_registration
+ ("rhcClusterStatusCode",
+ handle_rhcClusterStatusCode,
+ rhcClusterStatusCode_oid,
+ OID_LENGTH(rhcClusterStatusCode_oid),
+ HANDLER_CAN_RONLY));
+ netsnmp_register_scalar(netsnmp_create_handler_registration
+ ("rhcClusterUnavailNodesNum",
+ handle_rhcClusterUnavailNodesNum,
+ rhcClusterUnavailNodesNum_oid,
+ OID_LENGTH(rhcClusterUnavailNodesNum_oid),
+ HANDLER_CAN_RONLY));
+ netsnmp_register_scalar(netsnmp_create_handler_registration
+ ("rhcClusterUnavailNodesNames",
+ handle_rhcClusterUnavailNodesNames,
+ rhcClusterUnavailNodesNames_oid,
+ OID_LENGTH(rhcClusterUnavailNodesNames_oid),
+ HANDLER_CAN_RONLY));
+ netsnmp_register_scalar(netsnmp_create_handler_registration
+ ("rhcClusterNodesNum",
+ handle_rhcClusterNodesNum,
+ rhcClusterNodesNum_oid,
+ OID_LENGTH(rhcClusterNodesNum_oid),
+ HANDLER_CAN_RONLY));
+ netsnmp_register_scalar(netsnmp_create_handler_registration
+ ("rhcClusterNodesNames",
+ handle_rhcClusterNodesNames,
+ rhcClusterNodesNames_oid,
+ OID_LENGTH(rhcClusterNodesNames_oid),
+ HANDLER_CAN_RONLY));
+ netsnmp_register_scalar(netsnmp_create_handler_registration
+ ("rhcClusterRunningServicesNum",
+ handle_rhcClusterRunningServicesNum,
+ rhcClusterRunningServicesNum_oid,
+ OID_LENGTH(rhcClusterRunningServicesNum_oid),
+ HANDLER_CAN_RONLY));
+ netsnmp_register_scalar(netsnmp_create_handler_registration
+ ("rhcClusterRunningServicesNames",
+ handle_rhcClusterRunningServicesNames,
+ rhcClusterRunningServicesNames_oid,
+ OID_LENGTH(rhcClusterRunningServicesNames_oid),
+ HANDLER_CAN_RONLY));
+ netsnmp_register_scalar(netsnmp_create_handler_registration
+ ("rhcClusterVotesNeededForQuorum",
+ handle_rhcClusterVotesNeededForQuorum,
+ rhcClusterVotesNeededForQuorum_oid,
+ OID_LENGTH
+ (rhcClusterVotesNeededForQuorum_oid),
+ HANDLER_CAN_RONLY));
+}
+
+
+unsigned int
+getStatusCode(Cluster* cluster)
+{
+ unsigned int code = 1; // OK
+
+ if (cluster->failedServices().size() != 0)
+ // service failed
+ code = (code & ~1) | 2;
+
+ if (cluster->stoppedServices().size() != 0)
+ // service not running
+ code = (code & ~1) | 4;
+
+ if (cluster->unclusteredNodes().size() != 0)
+ // unavailable node
+ code = (code & ~1) | 8;
+
+ if (cluster->votes() < cluster->minQuorum())
+ // not quorate
+ code = (code & ~1) | 16;
+
+ if (cluster->unclusteredNodes().size() == cluster->nodes().size())
+ // cluster stopped
+ code = (code & ~1) | 32;
+
+ return code;
+}
+
+string
+getStatusDescription(unsigned int code)
+{
+ if (code == 1)
+ return "All services and nodes functional";
+ if (code & 32)
+ return "Cluster stopped (all services stopped)";
+ if (code & 16)
+ return "Not quorate (all services stopped)";
+
+ string descr;
+ if (code & 2) {
+ string c = "Some services failed";
+ if (descr.size() == 0)
+ descr = c;
+ else
+ descr += ", " + c;
+ }
+ if (code & 4) {
+ string c = "Some services not running";
+ if (descr.size() == 0)
+ descr = c;
+ else
+ descr += ", " + c;
+ }
+ if (code & 8) {
+ string c = "Some nodes unavailable";
+ if (descr.size() == 0)
+ descr = c;
+ else
+ descr += ", " + c;
+ }
+ return descr;
+}
+
+
+int
+handle_rhcMIBVersion(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests)
+{
+ try {
+
+ unsigned int num = 1; // MIB version 1
+
+ /*
+ * We are never called for a GETNEXT if it's registered as a
+ * "instance", as it's "magically" handled for us.
+ */
+
+ /*
+ * a instance handler also only hands us one request at a time, so
+ * we don't need to loop over a list of requests; we'll only get one.
+ */
+
+ switch (reqinfo->mode) {
+
+ case MODE_GET:
+ snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
+ (u_char *)
+ &num,
+ sizeof(num));
+ break;
+
+ default:
+ /*
+ * we should never get here, so this is a really bad error
+ */
+ return SNMP_ERR_GENERR;
+ }
+ }
+ catch( ... ) {
+ return SNMP_ERR_GENERR;
+ }
+ return SNMP_ERR_NOERROR;
+}
+
+int
+handle_rhcClusterFailedServicesNum(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests)
+{
+ try {
+ counting_auto_ptr<Cluster> cluster = monitor.get_cluster();
+ if(cluster.get() == NULL)
+ return SNMP_ERR_NOERROR;
+
+ unsigned int num = cluster->failedServices().size();
+
+ /*
+ * We are never called for a GETNEXT if it's registered as a
+ * "instance", as it's "magically" handled for us.
+ */
+
+ /*
+ * a instance handler also only hands us one request at a time, so
+ * we don't need to loop over a list of requests; we'll only get one.
+ */
+
+ switch (reqinfo->mode) {
+
+ case MODE_GET:
+ snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
+ (u_char *)
+ &num,
+ sizeof(num));
+ break;
+
+ default:
+ /*
+ * we should never get here, so this is a really bad error
+ */
+ return SNMP_ERR_GENERR;
+ }
+ }
+ catch( ... ) {
+ return SNMP_ERR_GENERR;
+ }
+ return SNMP_ERR_NOERROR;
+}
+
+int
+handle_rhcClusterFailedServicesNames(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests)
+{
+ try {
+ counting_auto_ptr<Cluster> cluster = monitor.get_cluster();
+ if(cluster.get() == NULL)
+ return SNMP_ERR_NOERROR;
+
+ list<counting_auto_ptr<Service> > l = cluster->failedServices();
+ string str;
+ for (list<counting_auto_ptr<Service> >::iterator iter = l.begin();
+ iter != l.end();
+ iter++)
+ if (str.empty())
+ str = (*iter)->name();
+ else
+ str += ", " + (*iter)->name();
+
+ /*
+ * We are never called for a GETNEXT if it's registered as a
+ * "instance", as it's "magically" handled for us.
+ */
+
+ /*
+ * a instance handler also only hands us one request at a time, so
+ * we don't need to loop over a list of requests; we'll only get one.
+ */
+
+ switch (reqinfo->mode) {
+
+ case MODE_GET:
+ snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
+ (u_char *)
+ str.c_str(),
+ str.size());
+ break;
+
+ default:
+ /*
+ * we should never get here, so this is a really bad error
+ */
+ return SNMP_ERR_GENERR;
+ }
+ }
+ catch( ... ) {
+ return SNMP_ERR_GENERR;
+ }
+ return SNMP_ERR_NOERROR;
+}
+
+int
+handle_rhcClusterStatusDesc(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests)
+{
+ try {
+ counting_auto_ptr<Cluster> cluster = monitor.get_cluster();
+ if(cluster.get() == NULL)
+ return SNMP_ERR_NOERROR;
+
+ unsigned int code = getStatusCode(cluster.get());
+ string str = getStatusDescription(code);
+
+ /*
+ * We are never called for a GETNEXT if it's registered as a
+ * "instance", as it's "magically" handled for us.
+ */
+
+ /*
+ * a instance handler also only hands us one request at a time, so
+ * we don't need to loop over a list of requests; we'll only get one.
+ */
+
+ switch (reqinfo->mode) {
+
+ case MODE_GET:
+ snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
+ (u_char *)
+ str.c_str(),
+ str.size());
+ break;
+
+ default:
+ /*
+ * we should never get here, so this is a really bad error
+ */
+ return SNMP_ERR_GENERR;
+ }
+ }
+ catch( ... ) {
+ return SNMP_ERR_GENERR;
+ }
+ return SNMP_ERR_NOERROR;
+}
+
+int
+handle_rhcClusterVotes(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests)
+{
+ try {
+ counting_auto_ptr<Cluster> cluster = monitor.get_cluster();
+ if(cluster.get() == NULL)
+ return SNMP_ERR_NOERROR;
+
+ unsigned int num = cluster->votes();
+
+ /*
+ * We are never called for a GETNEXT if it's registered as a
+ * "instance", as it's "magically" handled for us.
+ */
+
+ /*
+ * a instance handler also only hands us one request at a time, so
+ * we don't need to loop over a list of requests; we'll only get one.
+ */
+
+ switch (reqinfo->mode) {
+
+ case MODE_GET:
+ snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
+ (u_char *)
+ &num,
+ sizeof(num));
+ break;
+
+ default:
+ /*
+ * we should never get here, so this is a really bad error
+ */
+ return SNMP_ERR_GENERR;
+ }
+ }
+ catch( ... ) {
+ return SNMP_ERR_GENERR;
+ }
+ return SNMP_ERR_NOERROR;
+}
+
+int
+handle_rhcClusterStoppedServicesNum(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests)
+{
+ try {
+ counting_auto_ptr<Cluster> cluster = monitor.get_cluster();
+ if(cluster.get() == NULL)
+ return SNMP_ERR_NOERROR;
+
+ unsigned int num = cluster->stoppedServices().size();
+
+ /*
+ * We are never called for a GETNEXT if it's registered as a
+ * "instance", as it's "magically" handled for us.
+ */
+
+ /*
+ * a instance handler also only hands us one request at a time, so
+ * we don't need to loop over a list of requests; we'll only get one.
+ */
+
+ switch (reqinfo->mode) {
+
+ case MODE_GET:
+ snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
+ (u_char *)
+ &num,
+ sizeof(num));
+ break;
+
+ default:
+ /*
+ * we should never get here, so this is a really bad error
+ */
+ return SNMP_ERR_GENERR;
+ }
+ }
+ catch( ... ) {
+ return SNMP_ERR_GENERR;
+ }
+ return SNMP_ERR_NOERROR;
+}
+
+int
+handle_rhcClusterStoppedServicesNames(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests)
+{
+ try {
+ counting_auto_ptr<Cluster> cluster = monitor.get_cluster();
+ if(cluster.get() == NULL)
+ return SNMP_ERR_NOERROR;
+
+ list<counting_auto_ptr<Service> > l = cluster->stoppedServices();
+ string str;
+ for (list<counting_auto_ptr<Service> >::iterator iter = l.begin();
+ iter != l.end();
+ iter++)
+ if (str.empty())
+ str = (*iter)->name();
+ else
+ str += ", " + (*iter)->name();
+
+ /*
+ * We are never called for a GETNEXT if it's registered as a
+ * "instance", as it's "magically" handled for us.
+ */
+
+ /*
+ * a instance handler also only hands us one request at a time, so
+ * we don't need to loop over a list of requests; we'll only get one.
+ */
+
+ switch (reqinfo->mode) {
+
+ case MODE_GET:
+ snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
+ (u_char *)
+ str.c_str(),
+ str.size());
+ break;
+
+ default:
+ /*
+ * we should never get here, so this is a really bad error
+ */
+ return SNMP_ERR_GENERR;
+ }
+ }
+ catch( ... ) {
+ return SNMP_ERR_GENERR;
+ }
+ return SNMP_ERR_NOERROR;
+}
+
+int
+handle_rhcClusterAvailNodesNum(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests)
+{
+ try {
+ counting_auto_ptr<Cluster> cluster = monitor.get_cluster();
+ if(cluster.get() == NULL)
+ return SNMP_ERR_NOERROR;
+
+ unsigned int num = cluster->clusteredNodes().size();
+
+ /*
+ * We are never called for a GETNEXT if it's registered as a
+ * "instance", as it's "magically" handled for us.
+ */
+
+ /*
+ * a instance handler also only hands us one request at a time, so
+ * we don't need to loop over a list of requests; we'll only get one.
+ */
+
+ switch (reqinfo->mode) {
+
+ case MODE_GET:
+ snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
+ (u_char *)
+ &num,
+ sizeof(num));
+ break;
+
+ default:
+ /*
+ * we should never get here, so this is a really bad error
+ */
+ return SNMP_ERR_GENERR;
+ }
+ }
+ catch( ... ) {
+ return SNMP_ERR_GENERR;
+ }
+ return SNMP_ERR_NOERROR;
+}
+
+int
+handle_rhcClusterAvailNodesNames(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests)
+{
+ try {
+ counting_auto_ptr<Cluster> cluster = monitor.get_cluster();
+ if(cluster.get() == NULL)
+ return SNMP_ERR_NOERROR;
+
+ list<counting_auto_ptr<Node> > l = cluster->clusteredNodes();
+ string str;
+ for (list<counting_auto_ptr<Node> >::iterator iter = l.begin();
+ iter != l.end();
+ iter++)
+ if (str.empty())
+ str = (*iter)->name();
+ else
+ str += ", " + (*iter)->name();
+
+ /*
+ * We are never called for a GETNEXT if it's registered as a
+ * "instance", as it's "magically" handled for us.
+ */
+
+ /*
+ * a instance handler also only hands us one request at a time, so
+ * we don't need to loop over a list of requests; we'll only get one.
+ */
+
+ switch (reqinfo->mode) {
+
+ case MODE_GET:
+ snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
+ (u_char *)
+ str.c_str(),
+ str.size());
+ break;
+
+ default:
+ /*
+ * we should never get here, so this is a really bad error
+ */
+ return SNMP_ERR_GENERR;
+ }
+ }
+ catch( ... ) {
+ return SNMP_ERR_GENERR;
+ }
+ return SNMP_ERR_NOERROR;
+}
+
+int
+handle_rhcClusterServicesNum(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests)
+{
+ try {
+ counting_auto_ptr<Cluster> cluster = monitor.get_cluster();
+ if(cluster.get() == NULL)
+ return SNMP_ERR_NOERROR;
+
+ unsigned int num = cluster->services().size();
+
+ /*
+ * We are never called for a GETNEXT if it's registered as a
+ * "instance", as it's "magically" handled for us.
+ */
+
+ /*
+ * a instance handler also only hands us one request at a time, so
+ * we don't need to loop over a list of requests; we'll only get one.
+ */
+
+ switch (reqinfo->mode) {
+
+ case MODE_GET:
+ snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
+ (u_char *)
+ &num,
+ sizeof(num));
+ break;
+
+ default:
+ /*
+ * we should never get here, so this is a really bad error
+ */
+ return SNMP_ERR_GENERR;
+ }
+ }
+ catch( ... ) {
+ return SNMP_ERR_GENERR;
+ }
+ return SNMP_ERR_NOERROR;
+}
+
+int
+handle_rhcClusterServicesNames(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests)
+{
+ try {
+ counting_auto_ptr<Cluster> cluster = monitor.get_cluster();
+ if(cluster.get() == NULL)
+ return SNMP_ERR_NOERROR;
+
+ list<counting_auto_ptr<Service> > l = cluster->services();
+ string str;
+ for (list<counting_auto_ptr<Service> >::iterator iter = l.begin();
+ iter != l.end();
+ iter++)
+ if (str.empty())
+ str = (*iter)->name();
+ else
+ str += ", " + (*iter)->name();
+
+ /*
+ * We are never called for a GETNEXT if it's registered as a
+ * "instance", as it's "magically" handled for us.
+ */
+
+ /*
+ * a instance handler also only hands us one request at a time, so
+ * we don't need to loop over a list of requests; we'll only get one.
+ */
+
+ switch (reqinfo->mode) {
+
+ case MODE_GET:
+ snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
+ (u_char *)
+ str.c_str(),
+ str.size());
+ break;
+
+ default:
+ /*
+ * we should never get here, so this is a really bad error
+ */
+ return SNMP_ERR_GENERR;
+ }
+ }
+ catch( ... ) {
+ return SNMP_ERR_GENERR;
+ }
+ return SNMP_ERR_NOERROR;
+}
+
+int
+handle_rhcClusterName(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests)
+{
+ try {
+ counting_auto_ptr<Cluster> cluster = monitor.get_cluster();
+ if(cluster.get() == NULL)
+ return SNMP_ERR_NOERROR;
+
+ string name = cluster->name();
+
+ /*
+ * We are never called for a GETNEXT if it's registered as a
+ * "instance", as it's "magically" handled for us.
+ */
+
+ /*
+ * a instance handler also only hands us one request at a time, so
+ * we don't need to loop over a list of requests; we'll only get one.
+ */
+
+ switch (reqinfo->mode) {
+
+ case MODE_GET:
+ snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
+ (u_char *)
+ name.c_str(),
+ name.size());
+ break;
+
+ default:
+ /*
+ * we should never get here, so this is a really bad error
+ */
+ return SNMP_ERR_GENERR;
+ }
+ }
+ catch( ... ) {
+ return SNMP_ERR_GENERR;
+ }
+ return SNMP_ERR_NOERROR;
+}
+
+int
+handle_rhcClusterStatusCode(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests)
+{
+ try {
+ counting_auto_ptr<Cluster> cluster = monitor.get_cluster();
+ if(cluster.get() == NULL)
+ return SNMP_ERR_NOERROR;
+
+ unsigned int code = getStatusCode(cluster.get());
+
+ /*
+ * We are never called for a GETNEXT if it's registered as a
+ * "instance", as it's "magically" handled for us.
+ */
+
+ /*
+ * a instance handler also only hands us one request at a time, so
+ * we don't need to loop over a list of requests; we'll only get one.
+ */
+
+ switch (reqinfo->mode) {
+
+ case MODE_GET:
+ snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
+ (u_char *)
+ &code,
+ sizeof(code));
+ break;
+
+ default:
+ /*
+ * we should never get here, so this is a really bad error
+ */
+ return SNMP_ERR_GENERR;
+ }
+ }
+ catch( ... ) {
+ return SNMP_ERR_GENERR;
+ }
+ return SNMP_ERR_NOERROR;
+}
+
+int
+handle_rhcClusterUnavailNodesNum(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests)
+{
+ try {
+ counting_auto_ptr<Cluster> cluster = monitor.get_cluster();
+ if(cluster.get() == NULL)
+ return SNMP_ERR_NOERROR;
+
+ unsigned int num = cluster->unclusteredNodes().size();
+
+ /*
+ * We are never called for a GETNEXT if it's registered as a
+ * "instance", as it's "magically" handled for us.
+ */
+
+ /*
+ * a instance handler also only hands us one request at a time, so
+ * we don't need to loop over a list of requests; we'll only get one.
+ */
+
+ switch (reqinfo->mode) {
+
+ case MODE_GET:
+ snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
+ (u_char *)
+ &num,
+ sizeof(num));
+ break;
+
+ default:
+ /*
+ * we should never get here, so this is a really bad error
+ */
+ return SNMP_ERR_GENERR;
+ }
+ }
+ catch( ... ) {
+ return SNMP_ERR_GENERR;
+ }
+ return SNMP_ERR_NOERROR;
+}
+
+int
+handle_rhcClusterUnavailNodesNames(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests)
+{
+ try {
+ counting_auto_ptr<Cluster> cluster = monitor.get_cluster();
+ if(cluster.get() == NULL)
+ return SNMP_ERR_NOERROR;
+
+ list<counting_auto_ptr<Node> > l = cluster->unclusteredNodes();
+ string str;
+ for (list<counting_auto_ptr<Node> >::iterator iter = l.begin();
+ iter != l.end();
+ iter++)
+ if (str.empty())
+ str = (*iter)->name();
+ else
+ str += ", " + (*iter)->name();
+
+ /*
+ * We are never called for a GETNEXT if it's registered as a
+ * "instance", as it's "magically" handled for us.
+ */
+
+ /*
+ * a instance handler also only hands us one request at a time, so
+ * we don't need to loop over a list of requests; we'll only get one.
+ */
+
+ switch (reqinfo->mode) {
+
+ case MODE_GET:
+ snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
+ (u_char *)
+ str.c_str(),
+ str.size());
+ break;
+
+ default:
+ /*
+ * we should never get here, so this is a really bad error
+ */
+ return SNMP_ERR_GENERR;
+ }
+ }
+ catch( ... ) {
+ return SNMP_ERR_GENERR;
+ }
+ return SNMP_ERR_NOERROR;
+}
+
+int
+handle_rhcClusterNodesNum(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests)
+{
+ try {
+ counting_auto_ptr<Cluster> cluster = monitor.get_cluster();
+ if(cluster.get() == NULL)
+ return SNMP_ERR_NOERROR;
+
+ unsigned int num = cluster->nodes().size();
+
+ /*
+ * We are never called for a GETNEXT if it's registered as a
+ * "instance", as it's "magically" handled for us.
+ */
+
+ /*
+ * a instance handler also only hands us one request at a time, so
+ * we don't need to loop over a list of requests; we'll only get one.
+ */
+
+ switch (reqinfo->mode) {
+
+ case MODE_GET:
+ snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
+ (u_char *)
+ &num,
+ sizeof(num));
+ break;
+
+ default:
+ /*
+ * we should never get here, so this is a really bad error
+ */
+ return SNMP_ERR_GENERR;
+ }
+ }
+ catch( ... ) {
+ return SNMP_ERR_GENERR;
+ }
+ return SNMP_ERR_NOERROR;
+}
+
+int
+handle_rhcClusterNodesNames(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests)
+{
+ try {
+ counting_auto_ptr<Cluster> cluster = monitor.get_cluster();
+ if(cluster.get() == NULL)
+ return SNMP_ERR_NOERROR;
+
+ list<counting_auto_ptr<Node> > l = cluster->nodes();
+ string str;
+ for (list<counting_auto_ptr<Node> >::iterator iter = l.begin();
+ iter != l.end();
+ iter++)
+ if (str.empty())
+ str = (*iter)->name();
+ else
+ str += ", " + (*iter)->name();
+
+ /*
+ * We are never called for a GETNEXT if it's registered as a
+ * "instance", as it's "magically" handled for us.
+ */
+
+ /*
+ * a instance handler also only hands us one request at a time, so
+ * we don't need to loop over a list of requests; we'll only get one.
+ */
+
+ switch (reqinfo->mode) {
+
+ case MODE_GET:
+ snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
+ (u_char *)
+ str.c_str(),
+ str.size());
+ break;
+
+ default:
+ /*
+ * we should never get here, so this is a really bad error
+ */
+ return SNMP_ERR_GENERR;
+ }
+ }
+ catch( ... ) {
+ return SNMP_ERR_GENERR;
+ }
+ return SNMP_ERR_NOERROR;
+}
+
+int
+handle_rhcClusterRunningServicesNum(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests)
+{
+ try {
+ counting_auto_ptr<Cluster> cluster = monitor.get_cluster();
+ if(cluster.get() == NULL)
+ return SNMP_ERR_NOERROR;
+
+ unsigned int num = cluster->runningServices().size();
+
+ /*
+ * We are never called for a GETNEXT if it's registered as a
+ * "instance", as it's "magically" handled for us.
+ */
+
+ /*
+ * a instance handler also only hands us one request at a time, so
+ * we don't need to loop over a list of requests; we'll only get one.
+ */
+
+ switch (reqinfo->mode) {
+
+ case MODE_GET:
+ snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
+ (u_char *)
+ &num,
+ sizeof(num));
+ break;
+
+ default:
+ /*
+ * we should never get here, so this is a really bad error
+ */
+ return SNMP_ERR_GENERR;
+ }
+ }
+ catch( ... ) {
+ return SNMP_ERR_GENERR;
+ }
+ return SNMP_ERR_NOERROR;
+}
+
+int
+handle_rhcClusterRunningServicesNames(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests)
+{
+ try {
+ counting_auto_ptr<Cluster> cluster = monitor.get_cluster();
+ if(cluster.get() == NULL)
+ return SNMP_ERR_NOERROR;
+
+ list<counting_auto_ptr<Service> > l = cluster->runningServices();
+ string str;
+ for (list<counting_auto_ptr<Service> >::iterator iter = l.begin();
+ iter != l.end();
+ iter++)
+ if (str.empty())
+ str = (*iter)->name();
+ else
+ str += ", " + (*iter)->name();
+
+ /*
+ * We are never called for a GETNEXT if it's registered as a
+ * "instance", as it's "magically" handled for us.
+ */
+
+ /*
+ * a instance handler also only hands us one request at a time, so
+ * we don't need to loop over a list of requests; we'll only get one.
+ */
+
+ switch (reqinfo->mode) {
+
+ case MODE_GET:
+ snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
+ (u_char *)
+ str.c_str(),
+ str.size());
+ break;
+
+ default:
+ /*
+ * we should never get here, so this is a really bad error
+ */
+ return SNMP_ERR_GENERR;
+ }
+ }
+ catch( ... ) {
+ return SNMP_ERR_GENERR;
+ }
+ return SNMP_ERR_NOERROR;
+}
+
+int
+handle_rhcClusterVotesNeededForQuorum(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration
+ *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests)
+{
+ try {
+ counting_auto_ptr<Cluster> cluster = monitor.get_cluster();
+ if(cluster.get() == NULL)
+ return SNMP_ERR_NOERROR;
+
+ unsigned int num = cluster->minQuorum();
+
+ /*
+ * We are never called for a GETNEXT if it's registered as a
+ * "instance", as it's "magically" handled for us.
+ */
+
+ /*
+ * a instance handler also only hands us one request at a time, so
+ * we don't need to loop over a list of requests; we'll only get one.
+ */
+
+ switch (reqinfo->mode) {
+
+ case MODE_GET:
+ snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
+ (u_char *)
+ &num,
+ sizeof(num));
+ break;
+
+ default:
+ /*
+ * we should never get here, so this is a really bad error
+ */
+ return SNMP_ERR_GENERR;
+ }
+ }
+ catch( ... ) {
+ return SNMP_ERR_GENERR;
+ }
+ return SNMP_ERR_NOERROR;
+}
+
+int
+handle_rhcClusterQuorate(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration
+ *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests)
+{
+ try {
+ counting_auto_ptr<Cluster> cluster = monitor.get_cluster();
+ if(cluster.get() == NULL)
+ return SNMP_ERR_NOERROR;
+
+ unsigned int num = cluster->quorate() ? 1 : 0;
+
+ /*
+ * We are never called for a GETNEXT if it's registered as a
+ * "instance", as it's "magically" handled for us.
+ */
+
+ /*
+ * a instance handler also only hands us one request at a time, so
+ * we don't need to loop over a list of requests; we'll only get one.
+ */
+
+ switch (reqinfo->mode) {
+
+ case MODE_GET:
+ snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
+ (u_char *)
+ &num,
+ sizeof(num));
+ break;
+
+ default:
+ /*
+ * we should never get here, so this is a really bad error
+ */
+ return SNMP_ERR_GENERR;
+ }
+ }
+ catch( ... ) {
+ return SNMP_ERR_GENERR;
+ }
+ return SNMP_ERR_NOERROR;
+}
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/snmp-agent/clusterMIB.h,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/snmp-agent/clusterMIB.h
+++ - 2006-06-14 21:44:42.460611000 +0000
@@ -0,0 +1,66 @@
+/*
+ Copyright Red Hat, Inc. 2005
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+/*
+ * Note: this file originally auto-generated by mib2c using
+ * : mib2c.scalar.conf,v 1.7 2003/04/08 14:57:04 dts12 Exp $
+ */
+
+
+#ifndef clusterMIB_h
+#define clusterMIB_h
+
+#include <net-snmp/net-snmp-config.h>
+#include <net-snmp/net-snmp-includes.h>
+#include <net-snmp/agent/net-snmp-agent-includes.h>
+
+
+void initialize_clusterMIB(void);
+
+extern "C"
+{
+
+Netsnmp_Node_Handler handle_rhcMIBVersion;
+Netsnmp_Node_Handler handle_rhcClusterName;
+Netsnmp_Node_Handler handle_rhcClusterStatusCode;
+Netsnmp_Node_Handler handle_rhcClusterStatusDesc;
+Netsnmp_Node_Handler handle_rhcClusterVotes;
+Netsnmp_Node_Handler handle_rhcClusterQuorate;
+Netsnmp_Node_Handler handle_rhcClusterFailedServicesNum;
+Netsnmp_Node_Handler handle_rhcClusterFailedServicesNames;
+Netsnmp_Node_Handler handle_rhcClusterStoppedServicesNum;
+Netsnmp_Node_Handler handle_rhcClusterStoppedServicesNames;
+Netsnmp_Node_Handler handle_rhcClusterAvailNodesNum;
+Netsnmp_Node_Handler handle_rhcClusterAvailNodesNames;
+Netsnmp_Node_Handler handle_rhcClusterServicesNum;
+Netsnmp_Node_Handler handle_rhcClusterServicesNames;
+Netsnmp_Node_Handler handle_rhcClusterUnavailNodesNum;
+Netsnmp_Node_Handler handle_rhcClusterUnavailNodesNames;
+Netsnmp_Node_Handler handle_rhcClusterNodesNum;
+Netsnmp_Node_Handler handle_rhcClusterNodesNames;
+Netsnmp_Node_Handler handle_rhcClusterRunningServicesNum;
+Netsnmp_Node_Handler handle_rhcClusterRunningServicesNames;
+Netsnmp_Node_Handler handle_rhcClusterVotesNeededForQuorum;
+
+};
+
+
+#endif /* clusterMIB_h */
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/snmp-agent/clusterMonitorSnmp.cpp,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/snmp-agent/clusterMonitorSnmp.cpp
+++ - 2006-06-14 21:44:42.542359000 +0000
@@ -0,0 +1,44 @@
+/*
+ Copyright Red Hat, Inc. 2005
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+
+
+#include "clusterMonitorSnmp.h"
+#include "clusterMIB.h"
+#include "nodesMIB.h"
+#include "servicesMIB.h"
+#include "clumond_globals.h"
+
+
+ClusterMonitoring::ClusterMonitor monitor;
+
+void
+init_RedHatCluster(void)
+{
+ try {
+ initialize_clusterMIB();
+ initialize_nodesMIB();
+ initialize_servicesMIB();
+
+ // TODO: initialize others
+ } catch ( ... )
+ {}
+}
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/snmp-agent/clusterMonitorSnmp.h,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/snmp-agent/clusterMonitorSnmp.h
+++ - 2006-06-14 21:44:42.630779000 +0000
@@ -0,0 +1,39 @@
+/*
+ Copyright Red Hat, Inc. 2005
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+/*
+ * Note: this file originally auto-generated by mib2c using
+ * : mib2c.scalar.conf,v 1.7 2003/04/08 14:57:04 dts12 Exp $
+ */
+
+
+#ifndef clusterMonitorSnmp_h
+#define clusterMonitorSnmp_h
+
+#include "ClusterMonitor.h"
+
+extern ClusterMonitoring::ClusterMonitor monitor;
+
+
+// called by snmpd
+extern "C" void init_RedHatCluster(void);
+
+#endif /* clusterMonitorSnmp_h */
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB.cpp,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB.cpp
+++ - 2006-06-14 21:44:42.741474000 +0000
@@ -0,0 +1,341 @@
+/*
+ Copyright Red Hat, Inc. 2005
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+/*
+ * Note: this file originally auto-generated by mib2c using
+ * : mib2c.iterate_access.conf,v 1.6 2003/09/29 22:30:36 hardaker Exp $
+ */
+
+
+#include "nodesMIB.h"
+#include "nodesMIB_checkfns.h"
+#include "nodesMIB_access.h"
+
+
+void
+initialize_nodesMIB(void)
+{
+ init_rhcNodesTable();
+}
+
+
+
+static netsnmp_oid_stash_node *undoStorage = NULL;
+static netsnmp_oid_stash_node *commitStorage = NULL;
+
+struct undoInfo {
+ void *ptr;
+ size_t len;
+};
+
+struct commitInfo {
+ void *data_context;
+ int have_committed;
+ int new_row;
+};
+
+
+void
+rhcNodesTable_free_undoInfo(void *vptr)
+{
+ struct undoInfo *ui = (struct undoInfo*) vptr;
+ if (!ui)
+ return;
+ SNMP_FREE(ui->ptr);
+ SNMP_FREE(ui);
+}
+
+/** Initialize the rhcNodesTable table by defining its contents and how it's structured */
+void
+initialize_table_rhcNodesTable(void)
+{
+ static oid rhcNodesTable_oid[] =
+ { 1, 3, 6, 1, 4, 1, 2312, 8, 3, 1 };
+ netsnmp_table_registration_info *table_info;
+ netsnmp_handler_registration *my_handler;
+ netsnmp_iterator_info *iinfo;
+
+ /** create the table registration information structures */
+ table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
+ iinfo = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info);
+
+ /** if your table is read only, it's easiest to change the
+ HANDLER_CAN_RWRITE definition below to HANDLER_CAN_RONLY */
+ my_handler = netsnmp_create_handler_registration("rhcNodesTable",
+ rhcNodesTable_handler,
+ rhcNodesTable_oid,
+ OID_LENGTH
+ (rhcNodesTable_oid),
+ HANDLER_CAN_RONLY);
+
+ if (!my_handler || !table_info || !iinfo) {
+ snmp_log(LOG_ERR,
+ "malloc failed in initialize_table_rhcNodesTable");
+ return; /** Serious error. */
+ }
+
+ /***************************************************
+ * Setting up the table's definition
+ */
+ netsnmp_table_helper_add_indexes(table_info, ASN_OCTET_STR,
+ /** index: rhcNodeName */
+ 0);
+
+ /** Define the minimum and maximum accessible columns. This
+ optimizes retrival. */
+ table_info->min_column = 1;
+ table_info->max_column = 5;
+
+ /** iterator access routines */
+ iinfo->get_first_data_point = rhcNodesTable_get_first_data_point;
+ iinfo->get_next_data_point = rhcNodesTable_get_next_data_point;
+
+ /** you may wish to set these as well */
+ //#ifdef MAYBE_USE_THESE
+ iinfo->make_data_context = rhcNodesTable_context_convert_function;
+ iinfo->free_data_context = rhcNodesTable_data_free;
+
+ /** pick *only* one of these if you use them */
+ //iinfo->free_loop_context = rhcNodesTable_loop_free;
+ iinfo->free_loop_context_at_end = rhcNodesTable_loop_free;
+ //#endif
+
+ /** tie the two structures together */
+ iinfo->table_reginfo = table_info;
+
+ /***************************************************
+ * registering the table with the master agent
+ */
+ DEBUGMSGTL(("initialize_table_rhcNodesTable",
+ "Registering table rhcNodesTable as a table iterator\n"));
+ netsnmp_register_table_iterator(my_handler, iinfo);
+}
+
+/** Initializes the rhcNodesTable module */
+void
+init_rhcNodesTable(void)
+{
+
+ /** here we initialize all the tables we're planning on supporting */
+ initialize_table_rhcNodesTable();
+}
+
+/** handles requests for the rhcNodesTable table, if anything else needs to be done */
+int
+rhcNodesTable_handler(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests)
+{
+
+ netsnmp_request_info *request;
+ netsnmp_table_request_info *table_info;
+ netsnmp_variable_list *var;
+ struct commitInfo *ci = NULL;
+
+ void *data_context = NULL;
+
+ oid *suffix;
+ size_t suffix_len;
+
+ /** column and row index encoded portion */
+ suffix = requests->requestvb->name + reginfo->rootoid_len + 1;
+ suffix_len = requests->requestvb->name_length -
+ (reginfo->rootoid_len + 1);
+
+ for (request = requests; request; request = request->next) {
+ var = request->requestvb;
+ if (request->processed != 0)
+ continue;
+
+ switch (reqinfo->mode) {
+ case MODE_GET:
+ case MODE_SET_RESERVE1:
+ data_context = netsnmp_extract_iterator_context(request);
+ if (data_context == NULL) {
+ if (reqinfo->mode == MODE_GET) {
+ netsnmp_set_request_error(reqinfo, request,
+ SNMP_NOSUCHINSTANCE);
+ continue;
+ }
+ }
+ break;
+
+ default: /* == the other SET modes */
+ ci = (struct commitInfo*) netsnmp_oid_stash_get_data(commitStorage,
+ suffix + 1, suffix_len - 1);
+ break;
+
+ }
+
+ /** extracts the information about the table from the request */
+ table_info = netsnmp_extract_table_info(request);
+ /** table_info->colnum contains the column number requested */
+ /** table_info->indexes contains a linked list of snmp variable
+ bindings for the indexes of the table. Values in the list
+ have been set corresponding to the indexes of the
+ request */
+ if (table_info == NULL) {
+ continue;
+ }
+
+ switch (reqinfo->mode) {
+ case MODE_GET:
+ switch (table_info->colnum) {
+ case COLUMN_RHCNODENAME:
+ {
+ char *retval;
+ size_t retval_len = 0;
+ retval = get_rhcNodeName(data_context, &retval_len);
+ snmp_set_var_typed_value(var, ASN_OCTET_STR,
+ (const u_char *) retval,
+ retval_len);
+ }
+ break;
+
+ case COLUMN_RHCNODESTATUSCODE:
+ {
+ long *retval;
+ size_t retval_len = 0;
+ retval =
+ get_rhcNodeStatusCode(data_context, &retval_len);
+ snmp_set_var_typed_value(var, ASN_INTEGER,
+ (const u_char *) retval,
+ retval_len);
+ }
+ break;
+
+ case COLUMN_RHCNODESTATUSDESC:
+ {
+ char *retval;
+ size_t retval_len = 0;
+ retval =
+ get_rhcNodeStatusDesc(data_context, &retval_len);
+ snmp_set_var_typed_value(var, ASN_OCTET_STR,
+ (const u_char *) retval,
+ retval_len);
+ }
+ break;
+
+ case COLUMN_RHCNODERUNNINGSERVICESNUM:
+ {
+ long *retval;
+ size_t retval_len = 0;
+ retval =
+ get_rhcNodeRunningServicesNum(data_context,
+ &retval_len);
+ snmp_set_var_typed_value(var, ASN_INTEGER,
+ (const u_char *) retval,
+ retval_len);
+ }
+ break;
+
+ case COLUMN_RHCNODERUNNINGSERVICESNAMES:
+ {
+ char *retval;
+ size_t retval_len = 0;
+ retval =
+ get_rhcNodeRunningServicesNames(data_context,
+ &retval_len);
+ snmp_set_var_typed_value(var, ASN_OCTET_STR,
+ (const u_char *) retval,
+ retval_len);
+ }
+ break;
+
+ default:
+ /** We shouldn't get here */
+ snmp_log(LOG_ERR,
+ "problem encountered in rhcNodesTable_handler: unknown column\n");
+ }
+ break;
+
+ case MODE_SET_RESERVE1:
+ ci = (struct commitInfo*) netsnmp_oid_stash_get_data(commitStorage,
+ suffix + 1, suffix_len - 1);
+
+ if (!ci) {
+ /** create the commit storage info */
+ ci = SNMP_MALLOC_STRUCT(commitInfo);
+ if (!data_context) {
+ ci->data_context =
+ rhcNodesTable_create_data_context(table_info->
+ indexes);
+ ci->new_row = 1;
+ } else {
+ ci->data_context = data_context;
+ }
+ netsnmp_oid_stash_add_data(&commitStorage,
+ suffix + 1, suffix_len - 1, ci);
+ }
+ break;
+
+ case MODE_SET_RESERVE2:
+ switch (table_info->colnum) {
+ default:
+ netsnmp_set_request_error(reqinfo, request,
+ SNMP_ERR_NOTWRITABLE);
+ break;
+ }
+ break;
+
+ case MODE_SET_ACTION:
+ /** save a variable copy */
+ switch (table_info->colnum) {
+ }
+ break;
+
+ case MODE_SET_COMMIT:
+ if (!ci->have_committed) {
+ /** do this once per row only */
+ rhcNodesTable_commit_row(&ci->data_context, ci->new_row);
+ ci->have_committed = 1;
+ }
+ break;
+
+ case MODE_SET_UNDO:
+ /** save a variable copy */
+ switch (table_info->colnum) {
+ }
+ break;
+
+ case MODE_SET_FREE:
+ break;
+
+ default:
+ snmp_log(LOG_ERR,
+ "problem encountered in rhcNodesTable_handler: unsupported mode\n");
+ }
+ }
+
+ /** clean up after all requset processing has ended */
+ switch (reqinfo->mode) {
+ case MODE_SET_UNDO:
+ case MODE_SET_FREE:
+ case MODE_SET_COMMIT:
+ /** clear out the undo cache */
+ netsnmp_oid_stash_free(&undoStorage, rhcNodesTable_free_undoInfo);
+ netsnmp_oid_stash_free(&commitStorage, netsnmp_oid_stash_no_free);
+ }
+
+
+ return SNMP_ERR_NOERROR;
+}
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB.h,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB.h
+++ - 2006-06-14 21:44:42.847651000 +0000
@@ -0,0 +1,56 @@
+/*
+ Copyright Red Hat, Inc. 2005
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+/*
+ * Note: this file originally auto-generated by mib2c using
+ * : mib2c.iterate_access.conf,v 1.6 2003/09/29 22:30:36 hardaker Exp $
+ */
+
+
+#ifndef nodesMIB_h
+#define nodesMIB_h
+
+#include <net-snmp/net-snmp-config.h>
+#include <net-snmp/net-snmp-includes.h>
+#include <net-snmp/agent/net-snmp-agent-includes.h>
+
+
+void initialize_nodesMIB(void);
+
+extern "C" {
+config_require(rhcNodesTable_access)
+ /** other required module components */
+ config_require(rhcNodesTable_checkfns)
+
+ /*
+ * function declarations
+ */
+ void init_rhcNodesTable(void);
+ void initialize_table_rhcNodesTable(void);
+ Netsnmp_Node_Handler rhcNodesTable_handler;
+};
+
+#include "nodesMIB_columns.h"
+
+#include "nodesMIB_enums.h"
+
+
+#endif // nodesMIB_h
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB_access.cpp,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB_access.cpp
+++ - 2006-06-14 21:44:42.929205000 +0000
@@ -0,0 +1,395 @@
+/*
+ Copyright Red Hat, Inc. 2005
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+
+/*
+ * Note: this file originally auto-generated by mib2c using
+ * : mib2c.access_functions.conf,v 1.6.2.2 2004/06/21 10:12:28 dts12 Exp $
+ */
+
+
+#include "nodesMIB_access.h"
+#include "nodesMIB_enums.h"
+
+#include "ClusterMonitor.h"
+#include "Cluster.h"
+#include "clusterMonitorSnmp.h"
+
+#include <list>
+
+
+using namespace ClusterMonitoring;
+using namespace std;
+
+
+static unsigned int getStatusCode(counting_auto_ptr<Node>);
+static string getStatusDescription(unsigned int code);
+
+
+class LoopContext
+{
+public:
+ LoopContext(counting_auto_ptr<Cluster> cluster) :
+ _cluster(cluster),
+ _nodes(_cluster->nodes()),
+ _curr(_nodes.begin()) {}
+ virtual ~LoopContext() {}
+
+ counting_auto_ptr<Node> curr()
+ {
+ if (_curr == _nodes.end())
+ return counting_auto_ptr<Node>();
+ else
+ return *_curr;
+ }
+ counting_auto_ptr<Node> next()
+ {
+ if (curr().get() != NULL)
+ _curr++;
+ return curr();
+ }
+
+private:
+ counting_auto_ptr<Cluster> _cluster;
+ list<counting_auto_ptr<Node> > _nodes;
+ list<counting_auto_ptr<Node> >::iterator _curr;
+};
+
+class DataContext
+{
+public:
+ DataContext(LoopContext& loop) :
+ _node(loop.curr()) {}
+ virtual ~DataContext() {}
+ counting_auto_ptr<Node> getNode()
+ {
+ return _node;
+ }
+ string str_holder;
+ long long_holder;
+
+private:
+ counting_auto_ptr<Node> _node;
+};
+
+
+
+// ######################## INDEXES functions ##########################
+
+
+/** returns the first data point within the rhcNodesTable table data.
+
+ Set the my_loop_context variable to the first data point structure
+ of your choice (from which you can find the next one). This could
+ be anything from the first node in a linked list, to an integer
+ pointer containing the beginning of an array variable.
+
+ Set the my_data_context variable to something to be returned to
+ you later that will provide you with the data to return in a given
+ row. This could be the same pointer as what my_loop_context is
+ set to, or something different.
+
+ The put_index_data variable contains a list of snmp variable
+ bindings, one for each index in your table. Set the values of
+ each appropriately according to the data matching the first row
+ and return the put_index_data variable at the end of the function.
+*/
+netsnmp_variable_list*
+rhcNodesTable_get_first_data_point(void** my_loop_context,
+ void** my_data_context,
+ netsnmp_variable_list* put_index_data,
+ netsnmp_iterator_info* mydata)
+{
+ try {
+ counting_auto_ptr<Cluster> cluster = monitor.get_cluster();
+ if (cluster.get() == NULL)
+ return NULL;
+
+ LoopContext* loopctx = new LoopContext(cluster);
+ *my_loop_context = loopctx;
+
+ counting_auto_ptr<Node> node = loopctx->curr();
+ if (node.get() == NULL)
+ return NULL;
+
+ const string& name = node->name();
+ snmp_set_var_value(put_index_data, (u_char *) name.c_str(), name.size());
+ return put_index_data;
+ } catch ( ... ) {
+ return NULL;
+ }
+}
+
+/** functionally the same as rhcNodesTable_get_first_data_point, but
+ my_loop_context has already been set to a previous value and should
+ be updated to the next in the list. For example, if it was a
+ linked list, you might want to cast it to your local data type and
+ then return my_loop_context->next. The my_data_context pointer
+ should be set to something you need later and the indexes in
+ put_index_data updated again. */
+netsnmp_variable_list*
+rhcNodesTable_get_next_data_point(void** my_loop_context,
+ void** my_data_context,
+ netsnmp_variable_list* put_index_data,
+ netsnmp_iterator_info* mydata)
+{
+ try {
+ LoopContext* loopctx = (LoopContext*) *my_loop_context;
+ if (loopctx == NULL)
+ return NULL;
+
+ counting_auto_ptr<Node> node = loopctx->next();
+ if (node.get() == NULL)
+ return NULL;
+
+ const string& name = node->name();
+ snmp_set_var_value(put_index_data, (u_char *) name.c_str(), name.size());
+ return put_index_data;
+ } catch ( ... ) {
+ return NULL;
+ }
+}
+
+void*
+rhcNodesTable_context_convert_function(void *loop_context,
+ netsnmp_iterator_info *iinfo)
+{
+ try {
+ LoopContext *loopctx = (LoopContext*) loop_context;
+ return new DataContext(*loopctx);
+ } catch ( ... ) {
+ return NULL;
+ }
+}
+
+void
+rhcNodesTable_loop_free(void *loopctx, netsnmp_iterator_info *iinfo)
+{
+ delete (LoopContext*) loopctx;
+}
+
+void
+rhcNodesTable_data_free(void *data, netsnmp_iterator_info *iinfo)
+{
+ delete (DataContext*) data;
+}
+
+
+
+// ######################## GET functions ##########################
+
+
+/*
+ * User-defined data access functions (per column) for data in table rhcNodesTable
+ */
+/*
+ * NOTE:
+ * - these get_ routines MUST return data that will not be freed (ie,
+ * use static variables or persistent data). It will be copied, if
+ * needed, immediately after the get_ routine has been called.
+ */
+
+
+char*
+get_rhcNodeName(void *data_context, size_t * ret_len)
+{
+ try {
+ DataContext* datactx = (DataContext*) data_context;
+ if (datactx == NULL)
+ return NULL;
+ counting_auto_ptr<Node> node = datactx->getNode();
+ if (node.get() == NULL)
+ return NULL;
+
+ datactx->str_holder = node->name();
+ *ret_len = datactx->str_holder.size();
+ return (char*) datactx->str_holder.c_str();
+ } catch ( ... ) {
+ return NULL;
+ }
+}
+
+long*
+get_rhcNodeRunningServicesNum(void *data_context, size_t * ret_len)
+{
+ try {
+ DataContext* datactx = (DataContext*) data_context;
+ if (datactx == NULL)
+ return NULL;
+ counting_auto_ptr<Node> node = datactx->getNode();
+ if (node.get() == NULL)
+ return NULL;
+
+ datactx->long_holder = node->services().size();
+ *ret_len = sizeof(datactx->long_holder);
+ return &datactx->long_holder;
+ } catch ( ... ) {
+ return NULL;
+ }
+}
+
+char*
+get_rhcNodeRunningServicesNames(void *data_context, size_t * ret_len)
+{
+ try {
+ DataContext* datactx = (DataContext*) data_context;
+ if (datactx == NULL)
+ return NULL;
+ counting_auto_ptr<Node> node = datactx->getNode();
+ if (node.get() == NULL)
+ return NULL;
+
+ list<counting_auto_ptr<Service> > l = node->services();
+ string str;
+ for (list<counting_auto_ptr<Service> >::iterator iter = l.begin();
+ iter != l.end();
+ iter++)
+ if (str.empty())
+ str = (*iter)->name();
+ else
+ str += ", " + (*iter)->name();
+
+ datactx->str_holder = str;
+ *ret_len = datactx->str_holder.size();
+ return (char*) datactx->str_holder.c_str();
+ } catch ( ... ) {
+ return NULL;
+ }
+}
+
+
+// ## status ##
+
+unsigned int
+getStatusCode(counting_auto_ptr<Node> node)
+{
+ if (node->clustered())
+ // in cluster
+ return 0;
+
+ if (node->online())
+ // unavailable to cluster
+ return 1;
+
+ // OK
+ return 2;
+}
+string
+getStatusDescription(unsigned int code)
+{
+ switch(code) {
+ case 0:
+ return "Participating in cluster";
+ case 1:
+ return "Running, but not participating in cluster";
+ case 2:
+ return "Not running";
+ default:
+ return "Unknown";
+ }
+}
+
+long*
+get_rhcNodeStatusCode(void *data_context, size_t * ret_len)
+{
+ try {
+ DataContext* datactx = (DataContext*) data_context;
+ if (datactx == NULL)
+ return NULL;
+ counting_auto_ptr<Node> node = datactx->getNode();
+ if (node.get() == NULL)
+ return NULL;
+
+ datactx->long_holder = getStatusCode(node);
+ *ret_len = sizeof(datactx->long_holder);
+ return &datactx->long_holder;
+ } catch ( ... ) {
+ return NULL;
+ }
+}
+
+char*
+get_rhcNodeStatusDesc(void *data_context, size_t * ret_len)
+{
+ try {
+ DataContext* datactx = (DataContext*) data_context;
+ if (datactx == NULL)
+ return NULL;
+ counting_auto_ptr<Node> node = datactx->getNode();
+ if (node.get() == NULL)
+ return NULL;
+
+ unsigned int code = getStatusCode(node);
+ datactx->str_holder = getStatusDescription(code);
+ *ret_len = datactx->str_holder.size();
+ return (char*) datactx->str_holder.c_str();
+ } catch ( ... ) {
+ return NULL;
+ }
+}
+
+
+
+
+
+
+// ######################### SET functions #######################
+
+
+
+/** Create a data_context for non-existent rows that SETs are performed on.
+ * return a void * pointer which will be passed to subsequent get_XXX
+ * and set_XXX functions for data retrival and modification during
+ * this SET request.
+ *
+ * The indexs are encoded (in order) into the index_data pointer if it
+ * would be helpful to use that information.
+ */
+void*
+rhcNodesTable_create_data_context(netsnmp_variable_list * index_data)
+{
+ return NULL; /* XXX: you likely want to return a real pointer */
+}
+
+/** If the implemented set_* functions don't operate directly on the
+ real-live data (which is actually recommended), then this function
+ can be used to take a given my_data_context pointer and "commit" it
+ to whereever the modified data needs to be put back to. For
+ example, if this was a routing table you could publish the modified
+ routes back into the kernel at this point.
+
+ new_or_del will be set to 1 if new, or -1 if it should be deleted
+ or 0 if it is just a modification of an existing row.
+
+ If you free the data yourself, make sure to *my_data_context = NULL */
+int
+rhcNodesTable_commit_row(void **my_data_context, int new_or_del)
+{
+ /** Add any necessary commit code here */
+ /*
+ */
+
+ /*
+ * return no errors. And there shouldn't be any!!! Ever!!! You
+ * should have checked the values long before this.
+ */
+ return SNMP_ERR_NOERROR;
+}
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB_access.h,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB_access.h
+++ - 2006-06-14 21:44:43.015473000 +0000
@@ -0,0 +1,56 @@
+/*
+ Copyright Red Hat, Inc. 2005
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+
+/*
+ * Note: this file originally auto-generated by mib2c using
+ * : mib2c.access_functions.conf,v 1.6.2.2 2004/06/21 10:12:28 dts12 Exp $
+ */
+
+#ifndef nodesMIB_access_h
+#define nodesMIB_access_h
+
+#include <net-snmp/net-snmp-config.h>
+#include <net-snmp/net-snmp-includes.h>
+#include <net-snmp/agent/net-snmp-agent-includes.h>
+
+
+extern "C" {
+ /** User-defined data access functions for data in table rhcNodesTable */
+ /** row level accessors */
+ Netsnmp_First_Data_Point rhcNodesTable_get_first_data_point;
+ Netsnmp_Next_Data_Point rhcNodesTable_get_next_data_point;
+ Netsnmp_Free_Loop_Context rhcNodesTable_loop_free;
+ Netsnmp_Make_Data_Context rhcNodesTable_context_convert_function;
+ Netsnmp_Free_Data_Context rhcNodesTable_data_free;
+
+ int rhcNodesTable_commit_row(void** my_data_context, int new_or_del);
+ void* rhcNodesTable_create_data_context(netsnmp_variable_list* index_data);
+
+ /** column accessors */
+ char* get_rhcNodeName(void* data_context, size_t* ret_len);
+ long* get_rhcNodeStatusCode(void* data_context, size_t* ret_len);
+ char* get_rhcNodeStatusDesc(void* data_context, size_t* ret_len);
+ long* get_rhcNodeRunningServicesNum(void* data_context, size_t* ret_len);
+ char* get_rhcNodeRunningServicesNames(void* data_context, size_t* ret_len);
+};
+
+#endif // nodesMIB_access_h
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB_checkfns.cpp,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB_checkfns.cpp
+++ - 2006-06-14 21:44:43.102388000 +0000
@@ -0,0 +1,22 @@
+/*
+ * Note: this file originally auto-generated by mib2c using
+ * : mib2c.check_values.conf,v 1.6.2.3 2004/01/12 00:55:31 rstory Exp $
+ */
+
+/********************************************************************
+ * NOTE NOTE NOTE
+ * This file is auto-generated and SHOULD NOT BE EDITED by hand.
+ * Modify the rhcNodesTable_checkfns_local.[ch] files insead so that you
+ * can regenerate this one as mib2c improvements are made.
+ ********************************************************************/
+
+
+/*
+ * standard headers
+ */
+#include <net-snmp/net-snmp-config.h>
+#include <net-snmp/net-snmp-includes.h>
+
+#include "nodesMIB_checkfns.h"
+#include "nodesMIB_checkfns_local.h"
+#include "nodesMIB_enums.h"
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB_checkfns.h,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB_checkfns.h
+++ - 2006-06-14 21:44:43.184123000 +0000
@@ -0,0 +1,27 @@
+/*
+ * Note: this file originally auto-generated by mib2c using
+ * : mib2c.iterate.conf,v 5.6 2003/02/20 00:52:07 hardaker Exp $
+ */
+
+/***********************************************************************
+ * This file is auto-generated and SHOULD NOT BE EDITED by hand.
+ * Modify the rhcNodesTable_checkfns_local.[ch] files insead.
+ * (so that you can regenerate this one as mib2c improvements are made)
+ ***********************************************************************/
+
+#ifndef nodesMIB_checkfns_h
+#define nodesMIB_checkfns_h
+
+extern "C" {
+/** make sure we load the functions that you can modify */
+config_require(rhcNodesTable_checkfns_local)
+
+ /*
+ * these functions are designed to check incoming values for
+ * columns in the rhcNodesTable table for legality with respect to
+ * datatype and value.
+ */
+};
+
+
+#endif // nodesMIB_checkfns_h
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB_checkfns_local.cpp,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB_checkfns_local.cpp
+++ - 2006-06-14 21:44:43.275746000 +0000
@@ -0,0 +1,32 @@
+/*
+ Copyright Red Hat, Inc. 2005
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+/*
+ * Note: this file originally auto-generated by mib2c using
+ * : mib2c.check_values_local.conf,v 5.1.2.1 2004/05/04 23:35:32 hardaker Exp $
+ */
+
+
+#include <net-snmp/net-snmp-config.h>
+#include <net-snmp/net-snmp-includes.h>
+
+#include "nodesMIB_checkfns.h"
+#include "nodesMIB_enums.h"
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB_checkfns_local.h,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB_checkfns_local.h
+++ - 2006-06-14 21:44:43.360844000 +0000
@@ -0,0 +1,46 @@
+/*
+ Copyright Red Hat, Inc. 2005
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+/*
+ * Note: this file originally auto-generated by mib2c using
+ * : : mib2c.check_values_local.conf,v 5.1.2.1 2004/05/04 23:35:32 hardaker Exp $
+ *
+ */
+
+
+#ifndef nodesMIB_chekfns_local_h
+#define nodesMIB_chekfns_local_h
+
+extern "C" {
+
+/*
+ * these functions are designed to check incoming values for
+ * columns in the rhcNodesTable table for legality with respect to
+ * datatype and value according to local conventions. You should modify
+ * them as appropriate. They will be called from parent check_value
+ * functions that are auto-generated using mib2c and the parent functions
+ * should NOT be modified.
+ */
+
+};
+
+
+#endif // nodesMIB_chekfns_local_h
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB_columns.h,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB_columns.h
+++ - 2006-06-14 21:44:43.456282000 +0000
@@ -0,0 +1,42 @@
+/*
+ Copyright Red Hat, Inc. 2005
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+/*
+ * Note: this file originally auto-generated by mib2c using
+ * : mib2c.column_defines.conf,v 5.1 2002/05/08 05:42:47 hardaker Exp $
+ */
+
+
+#ifndef nodesMIB_columns_h
+#define nodesMIB_columns_h
+
+
+/*
+ * column number definitions for table rhcNodesTable
+ */
+#define COLUMN_RHCNODENAME 1
+#define COLUMN_RHCNODESTATUSCODE 2
+#define COLUMN_RHCNODESTATUSDESC 3
+#define COLUMN_RHCNODERUNNINGSERVICESNUM 4
+#define COLUMN_RHCNODERUNNINGSERVICESNAMES 5
+
+
+#endif // nodesMIB_columns_h
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB_enums.h,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/snmp-agent/nodesMIB_enums.h
+++ - 2006-06-14 21:44:43.542473000 +0000
@@ -0,0 +1,33 @@
+/*
+ Copyright Red Hat, Inc. 2005
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+/*
+ * Note: this file originally auto-generated by mib2c using
+ * : mib2c.column_enums.conf,v 5.2 2003/02/22 04:09:25 hardaker Exp $
+ */
+
+
+#ifndef nodesMIB_enums_h
+#define nodesMIB_enums_h
+
+
+
+#endif // nodesMIB_enums_h
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB.cpp,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB.cpp
+++ - 2006-06-14 21:44:43.623603000 +0000
@@ -0,0 +1,345 @@
+/*
+ Copyright Red Hat, Inc. 2005
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+/*
+ * Note: this file originally auto-generated by mib2c using
+ * : mib2c.iterate_access.conf,v 1.6 2003/09/29 22:30:36 hardaker Exp $
+ */
+
+
+#include "servicesMIB.h"
+#include "servicesMIB_checkfns.h"
+#include "servicesMIB_access.h"
+
+
+void
+initialize_servicesMIB(void)
+{
+ init_rhcServicesTable();
+}
+
+
+
+static netsnmp_oid_stash_node *undoStorage = NULL;
+static netsnmp_oid_stash_node *commitStorage = NULL;
+
+struct undoInfo {
+ void *ptr;
+ size_t len;
+};
+
+struct commitInfo {
+ void *data_context;
+ int have_committed;
+ int new_row;
+};
+
+void
+rhcServicesTable_free_undoInfo(void *vptr)
+{
+ struct undoInfo* ui = (struct undoInfo*) vptr;
+ if (!ui)
+ return;
+ SNMP_FREE(ui->ptr);
+ SNMP_FREE(ui);
+}
+
+/** Initialize the rhcServicesTable table by defining its contents and how it's structured */
+void
+initialize_table_rhcServicesTable(void)
+{
+ static oid rhcServicesTable_oid[] =
+ { 1, 3, 6, 1, 4, 1, 2312, 8, 3, 2 };
+ netsnmp_table_registration_info *table_info;
+ netsnmp_handler_registration *my_handler;
+ netsnmp_iterator_info *iinfo;
+
+ /** create the table registration information structures */
+ table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
+ iinfo = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info);
+
+ /** if your table is read only, it's easiest to change the
+ HANDLER_CAN_RWRITE definition below to HANDLER_CAN_RONLY */
+ my_handler = netsnmp_create_handler_registration("rhcServicesTable",
+ rhcServicesTable_handler,
+ rhcServicesTable_oid,
+ OID_LENGTH
+ (rhcServicesTable_oid),
+ HANDLER_CAN_RONLY);
+
+ if (!my_handler || !table_info || !iinfo) {
+ snmp_log(LOG_ERR,
+ "malloc failed in initialize_table_rhcServicesTable");
+ return; /** Serious error. */
+ }
+
+ /***************************************************
+ * Setting up the table's definition
+ */
+ netsnmp_table_helper_add_indexes(table_info, ASN_OCTET_STR,
+ /** index: rhcServiceName */
+ 0);
+
+ /** Define the minimum and maximum accessible columns. This
+ optimizes retrival. */
+ table_info->min_column = 1;
+ table_info->max_column = 5;
+
+ /** iterator access routines */
+ iinfo->get_first_data_point = rhcServicesTable_get_first_data_point;
+ iinfo->get_next_data_point = rhcServicesTable_get_next_data_point;
+
+ /** you may wish to set these as well */
+ //#ifdef MAYBE_USE_THESE
+ iinfo->make_data_context = rhcServicesTable_context_convert_function;
+ iinfo->free_data_context = rhcServicesTable_data_free;
+
+ /** pick *only* one of these if you use them */
+ //iinfo->free_loop_context = rhcServicesTable_loop_free;
+ iinfo->free_loop_context_at_end = rhcServicesTable_loop_free;
+ //#endif
+
+ /** tie the two structures together */
+ iinfo->table_reginfo = table_info;
+
+ /***************************************************
+ * registering the table with the master agent
+ */
+ DEBUGMSGTL(("initialize_table_rhcServicesTable",
+ "Registering table rhcServicesTable as a table iterator\n"));
+ netsnmp_register_table_iterator(my_handler, iinfo);
+}
+
+/** Initializes the rhcServicesTable module */
+void
+init_rhcServicesTable(void)
+{
+
+ /** here we initialize all the tables we're planning on supporting */
+ initialize_table_rhcServicesTable();
+}
+
+/** handles requests for the rhcServicesTable table, if anything else needs to be done */
+int
+rhcServicesTable_handler(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests)
+{
+
+ netsnmp_request_info *request;
+ netsnmp_table_request_info *table_info;
+ netsnmp_variable_list *var;
+ struct commitInfo *ci = NULL;
+
+ void *data_context = NULL;
+
+ oid *suffix;
+ size_t suffix_len;
+
+ /** column and row index encoded portion */
+ suffix = requests->requestvb->name + reginfo->rootoid_len + 1;
+ suffix_len = requests->requestvb->name_length -
+ (reginfo->rootoid_len + 1);
+
+ for (request = requests; request; request = request->next) {
+ var = request->requestvb;
+ if (request->processed != 0)
+ continue;
+
+ switch (reqinfo->mode) {
+ case MODE_GET:
+ case MODE_SET_RESERVE1:
+ data_context = netsnmp_extract_iterator_context(request);
+ if (data_context == NULL) {
+ if (reqinfo->mode == MODE_GET) {
+ netsnmp_set_request_error(reqinfo, request,
+ SNMP_NOSUCHINSTANCE);
+ continue;
+ }
+ }
+ break;
+
+ default: /* == the other SET modes */
+ ci = (struct commitInfo*) netsnmp_oid_stash_get_data(commitStorage,
+ suffix + 1,
+ suffix_len - 1);
+ break;
+
+ }
+
+ /** extracts the information about the table from the request */
+ table_info = netsnmp_extract_table_info(request);
+ /** table_info->colnum contains the column number requested */
+ /** table_info->indexes contains a linked list of snmp variable
+ bindings for the indexes of the table. Values in the list
+ have been set corresponding to the indexes of the
+ request */
+ if (table_info == NULL) {
+ continue;
+ }
+
+ switch (reqinfo->mode) {
+ case MODE_GET:
+ switch (table_info->colnum) {
+ case COLUMN_RHCSERVICENAME:
+ {
+ char *retval;
+ size_t retval_len = 0;
+ retval = get_rhcServiceName(data_context, &retval_len);
+ snmp_set_var_typed_value(var, ASN_OCTET_STR,
+ (const u_char *) retval,
+ retval_len);
+ }
+ break;
+
+ case COLUMN_RHCSERVICESTATUSCODE:
+ {
+ long *retval;
+ size_t retval_len = 0;
+ retval =
+ get_rhcServiceStatusCode(data_context,
+ &retval_len);
+ snmp_set_var_typed_value(var, ASN_INTEGER,
+ (const u_char *) retval,
+ retval_len);
+ }
+ break;
+
+ case COLUMN_RHCSERVICESTATUSDESC:
+ {
+ char *retval;
+ size_t retval_len = 0;
+ retval =
+ get_rhcServiceStatusDesc(data_context,
+ &retval_len);
+ snmp_set_var_typed_value(var, ASN_OCTET_STR,
+ (const u_char *) retval,
+ retval_len);
+ }
+ break;
+
+ case COLUMN_RHCSERVICESTARTMODE:
+ {
+ char *retval;
+ size_t retval_len = 0;
+ retval =
+ get_rhcServiceStartMode(data_context, &retval_len);
+ snmp_set_var_typed_value(var, ASN_OCTET_STR,
+ (const u_char *) retval,
+ retval_len);
+ }
+ break;
+
+ case COLUMN_RHCSERVICERUNNINGONNODE:
+ {
+ char *retval;
+ size_t retval_len = 0;
+ retval =
+ get_rhcServiceRunningOnNode(data_context,
+ &retval_len);
+ snmp_set_var_typed_value(var, ASN_OCTET_STR,
+ (const u_char *) retval,
+ retval_len);
+ }
+ break;
+
+ default:
+ /** We shouldn't get here */
+ snmp_log(LOG_ERR,
+ "problem encountered in rhcServicesTable_handler: unknown column\n");
+ }
+ break;
+
+ case MODE_SET_RESERVE1:
+ ci = (struct commitInfo*) netsnmp_oid_stash_get_data(commitStorage,
+ suffix + 1,
+ suffix_len - 1);
+
+ if (!ci) {
+ /** create the commit storage info */
+ ci = SNMP_MALLOC_STRUCT(commitInfo);
+ if (!data_context) {
+ ci->data_context =
+ rhcServicesTable_create_data_context(table_info->
+ indexes);
+ ci->new_row = 1;
+ } else {
+ ci->data_context = data_context;
+ }
+ netsnmp_oid_stash_add_data(&commitStorage,
+ suffix + 1, suffix_len - 1, ci);
+ }
+ break;
+
+ case MODE_SET_RESERVE2:
+ switch (table_info->colnum) {
+ default:
+ netsnmp_set_request_error(reqinfo, request,
+ SNMP_ERR_NOTWRITABLE);
+ break;
+ }
+ break;
+
+ case MODE_SET_ACTION:
+ /** save a variable copy */
+ switch (table_info->colnum) {
+ }
+ break;
+
+ case MODE_SET_COMMIT:
+ if (!ci->have_committed) {
+ /** do this once per row only */
+ rhcServicesTable_commit_row(&ci->data_context,
+ ci->new_row);
+ ci->have_committed = 1;
+ }
+ break;
+
+ case MODE_SET_UNDO:
+ /** save a variable copy */
+ switch (table_info->colnum) {
+ }
+ break;
+
+ case MODE_SET_FREE:
+ break;
+
+ default:
+ snmp_log(LOG_ERR,
+ "problem encountered in rhcServicesTable_handler: unsupported mode\n");
+ }
+ }
+
+ /** clean up after all requset processing has ended */
+ switch (reqinfo->mode) {
+ case MODE_SET_UNDO:
+ case MODE_SET_FREE:
+ case MODE_SET_COMMIT:
+ /** clear out the undo cache */
+ netsnmp_oid_stash_free(&undoStorage,
+ rhcServicesTable_free_undoInfo);
+ netsnmp_oid_stash_free(&commitStorage, netsnmp_oid_stash_no_free);
+ }
+
+
+ return SNMP_ERR_NOERROR;
+}
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB.h,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB.h
+++ - 2006-06-14 21:44:43.703083000 +0000
@@ -0,0 +1,54 @@
+/*
+ Copyright Red Hat, Inc. 2005
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+/*
+ * Note: this file originally auto-generated by mib2c using
+ * : mib2c.iterate_access.conf,v 1.6 2003/09/29 22:30:36 hardaker Exp $
+ */
+
+
+#ifndef servicesMIB_h
+#define servicesMIB_h
+
+#include <net-snmp/net-snmp-config.h>
+#include <net-snmp/net-snmp-includes.h>
+#include <net-snmp/agent/net-snmp-agent-includes.h>
+
+
+void initialize_servicesMIB(void);
+
+extern "C" {
+config_require(rhcServicesTable_access)
+ config_require(rhcServicesTable_checkfns)
+
+ /*
+ * function declarations
+ */
+ void init_rhcServicesTable(void);
+ void initialize_table_rhcServicesTable(void);
+ Netsnmp_Node_Handler rhcServicesTable_handler;
+};
+
+
+#include "servicesMIB_columns.h"
+#include "servicesMIB_enums.h"
+
+#endif // servicesMIB_h
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB_access.cpp,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB_access.cpp
+++ - 2006-06-14 21:44:43.783504000 +0000
@@ -0,0 +1,389 @@
+/*
+ Copyright Red Hat, Inc. 2005
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+/*
+ * Note: this file originally auto-generated by mib2c using
+ * : mib2c.access_functions.conf,v 1.6.2.2 2004/06/21 10:12:28 dts12 Exp $
+ */
+
+
+#include "servicesMIB_access.h"
+#include "servicesMIB_enums.h"
+
+#include "ClusterMonitor.h"
+#include "Cluster.h"
+#include "clusterMonitorSnmp.h"
+
+#include <list>
+
+using namespace ClusterMonitoring;
+using namespace std;
+
+
+static unsigned int getStatusCode(counting_auto_ptr<Service>);
+static string getStatusDescription(unsigned int code);
+
+
+
+class LoopContext
+{
+public:
+ LoopContext(counting_auto_ptr<Cluster> cluster) :
+ _cluster(cluster),
+ _services(cluster->services()),
+ _curr(_services.begin()) {}
+ virtual ~LoopContext() {}
+
+ counting_auto_ptr<Service> curr()
+ {
+ if (_curr == _services.end())
+ return counting_auto_ptr<Service>();
+ else
+ return *_curr;
+ }
+ counting_auto_ptr<Service> next()
+ {
+ if (curr().get() != NULL)
+ _curr++;
+ return curr();
+ }
+
+private:
+ counting_auto_ptr<Cluster> _cluster;
+ list<counting_auto_ptr<Service> > _services;
+ list<counting_auto_ptr<Service> >::iterator _curr;
+};
+
+class DataContext
+{
+public:
+ DataContext(LoopContext& loop) :
+ _service(loop.curr()) {}
+ virtual ~DataContext() {}
+
+ counting_auto_ptr<Service> getService()
+ {
+ return _service;
+ }
+ string str_holder;
+ long long_holder;
+
+private:
+ counting_auto_ptr<Service> _service;
+};
+
+
+
+// ######################## INDEXES functions ##########################
+
+
+/** returns the first data point within the rhcServicesTable table data.
+
+ Set the my_loop_context variable to the first data point structure
+ of your choice (from which you can find the next one). This could
+ be anything from the first node in a linked list, to an integer
+ pointer containing the beginning of an array variable.
+
+ Set the my_data_context variable to something to be returned to
+ you later that will provide you with the data to return in a given
+ row. This could be the same pointer as what my_loop_context is
+ set to, or something different.
+
+ The put_index_data variable contains a list of snmp variable
+ bindings, one for each index in your table. Set the values of
+ each appropriately according to the data matching the first row
+ and return the put_index_data variable at the end of the function.
+*/
+netsnmp_variable_list *
+rhcServicesTable_get_first_data_point(void** my_loop_context,
+ void** my_data_context,
+ netsnmp_variable_list* put_index_data,
+ netsnmp_iterator_info* mydata)
+{
+ try {
+ counting_auto_ptr<Cluster> cluster = monitor.get_cluster();
+ if (cluster.get() == NULL)
+ return NULL;
+
+ LoopContext* loopctx = new LoopContext(cluster);
+ *my_loop_context = loopctx;
+
+ counting_auto_ptr<Service> service = loopctx->curr();
+ if (service.get() == NULL)
+ return NULL;
+
+ const string& name = service->name();
+ snmp_set_var_value(put_index_data, (u_char *) name.c_str(), name.size());
+ return put_index_data;
+ } catch ( ... ) {
+ return NULL;
+ }
+}
+
+/** functionally the same as rhcServicesTable_get_first_data_point, but
+ my_loop_context has already been set to a previous value and should
+ be updated to the next in the list. For example, if it was a
+ linked list, you might want to cast it to your local data type and
+ then return my_loop_context->next. The my_data_context pointer
+ should be set to something you need later and the indexes in
+ put_index_data updated again. */
+netsnmp_variable_list *
+rhcServicesTable_get_next_data_point(void** my_loop_context,
+ void** my_data_context,
+ netsnmp_variable_list* put_index_data,
+ netsnmp_iterator_info* mydata)
+{
+ try {
+ LoopContext* loopctx = (LoopContext*) *my_loop_context;
+ if (loopctx == NULL)
+ return NULL;
+
+ counting_auto_ptr<Service> service = loopctx->next();
+ if (service.get() == NULL)
+ return NULL;
+
+ const string& name = service->name();
+ snmp_set_var_value(put_index_data, (u_char *) name.c_str(), name.size());
+ return put_index_data;
+ } catch ( ... ) {
+ return NULL;
+ }
+}
+
+void*
+rhcServicesTable_context_convert_function(void* loop_context,
+ netsnmp_iterator_info *iinfo)
+{
+ try {
+ LoopContext *loopctx = (LoopContext*) loop_context;
+ return new DataContext(*loopctx);
+ } catch ( ... ) {
+ return NULL;
+ }
+}
+
+void
+rhcServicesTable_loop_free(void* loopctx, netsnmp_iterator_info* iinfo)
+{
+ delete (LoopContext*) loopctx;
+}
+
+void
+rhcServicesTable_data_free(void* data, netsnmp_iterator_info* iinfo)
+{
+ delete (DataContext*) data;
+}
+
+
+
+// ######################## GET functions ##########################
+
+
+
+/*
+ * User-defined data access functions (per column) for data in table rhcServicesTable
+ */
+/*
+ * NOTE:
+ * - these get_ routines MUST return data that will not be freed (ie,
+ * use static variables or persistent data). It will be copied, if
+ * needed, immediately after the get_ routine has been called.
+ */
+
+
+char*
+get_rhcServiceName(void* data_context, size_t* ret_len)
+{
+ try {
+ DataContext* datactx = (DataContext*) data_context;
+ if (datactx == NULL)
+ return NULL;
+ counting_auto_ptr<Service> service = datactx->getService();
+ if (service.get() == NULL)
+ return NULL;
+
+ datactx->str_holder = service->name();
+ *ret_len = datactx->str_holder.size();
+ return (char*) datactx->str_holder.c_str();
+ } catch ( ... ) {
+ return NULL;
+ }
+}
+
+char*
+get_rhcServiceStartMode(void* data_context, size_t* ret_len)
+{
+ try {
+ DataContext* datactx = (DataContext*) data_context;
+ if (datactx == NULL)
+ return NULL;
+ counting_auto_ptr<Service> service = datactx->getService();
+ if (service.get() == NULL)
+ return NULL;
+
+ if (service->autostart())
+ datactx->str_holder = "automatic";
+ else
+ datactx->str_holder = "manual";
+ *ret_len = datactx->str_holder.size();
+ return (char*) datactx->str_holder.c_str();
+ } catch ( ... ) {
+ return NULL;
+ }
+}
+
+char*
+get_rhcServiceRunningOnNode(void* data_context, size_t* ret_len)
+{
+ try {
+ DataContext* datactx = (DataContext*) data_context;
+ if (datactx == NULL)
+ return NULL;
+ counting_auto_ptr<Service> service = datactx->getService();
+ if (service.get() == NULL)
+ return NULL;
+
+ if (!service->running())
+ return NULL;
+
+ datactx->str_holder = service->nodename();
+ *ret_len = datactx->str_holder.size();
+ return (char*) datactx->str_holder.c_str();
+ } catch ( ... ) {
+ return NULL;
+ }
+}
+
+// ## status ##
+
+unsigned int
+getStatusCode(counting_auto_ptr<Service> service)
+{
+ if (service->failed())
+ // failed
+ return 2;
+
+ if (service->running())
+ // running
+ return 0;
+ else
+ // stopped
+ return 1;
+}
+string
+getStatusDescription(unsigned int code)
+{
+ switch(code) {
+ case 0:
+ return "running";
+ case 1:
+ return "stopped";
+ case 2:
+ return "failed";
+ default:
+ return "Unknown";
+ }
+}
+
+long*
+get_rhcServiceStatusCode(void* data_context, size_t* ret_len)
+{
+ try {
+ DataContext* datactx = (DataContext*) data_context;
+ if (datactx == NULL)
+ return NULL;
+ counting_auto_ptr<Service> service = datactx->getService();
+ if (service.get() == NULL)
+ return NULL;
+
+ datactx->long_holder = getStatusCode(service);
+ *ret_len = sizeof(datactx->long_holder);
+ return &datactx->long_holder;
+ } catch ( ... ) {
+ return NULL;
+ }
+}
+
+char*
+get_rhcServiceStatusDesc(void* data_context, size_t* ret_len)
+{
+ try {
+ DataContext* datactx = (DataContext*) data_context;
+ if (datactx == NULL)
+ return NULL;
+ counting_auto_ptr<Service> service = datactx->getService();
+ if (service.get() == NULL)
+ return NULL;
+
+ unsigned int code = getStatusCode(service);
+ datactx->str_holder = getStatusDescription(code);
+ *ret_len = datactx->str_holder.size();
+ return (char*) datactx->str_holder.c_str();
+ } catch ( ... ) {
+ return NULL;
+ }
+}
+
+
+
+
+// ######################### SET functions #######################
+
+
+
+/** Create a data_context for non-existent rows that SETs are performed on.
+ * return a void * pointer which will be passed to subsequent get_XXX
+ * and set_XXX functions for data retrival and modification during
+ * this SET request.
+ *
+ * The indexs are encoded (in order) into the index_data pointer if it
+ * would be helpful to use that information.
+ */
+void *
+rhcServicesTable_create_data_context(netsnmp_variable_list * index_data)
+{
+ return NULL; /* XXX: you likely want to return a real pointer */
+}
+
+/** If the implemented set_* functions don't operate directly on the
+ real-live data (which is actually recommended), then this function
+ can be used to take a given my_data_context pointer and "commit" it
+ to whereever the modified data needs to be put back to. For
+ example, if this was a routing table you could publish the modified
+ routes back into the kernel at this point.
+
+ new_or_del will be set to 1 if new, or -1 if it should be deleted
+ or 0 if it is just a modification of an existing row.
+
+ If you free the data yourself, make sure to *my_data_context = NULL */
+int
+rhcServicesTable_commit_row(void **my_data_context, int new_or_del)
+{
+ /** Add any necessary commit code here */
+ /*
+ */
+
+ /*
+ * return no errors. And there shouldn't be any!!! Ever!!! You
+ * should have checked the values long before this.
+ */
+ return SNMP_ERR_NOERROR;
+}
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB_access.h,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB_access.h
+++ - 2006-06-14 21:44:43.865877000 +0000
@@ -0,0 +1,56 @@
+/*
+ Copyright Red Hat, Inc. 2005
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+/*
+ * Note: this file originally auto-generated by mib2c using
+ * : mib2c.access_functions.conf,v 1.6.2.2 2004/06/21 10:12:28 dts12 Exp $
+ */
+
+
+#ifndef servicesMIB_access_h
+#define servicesMIB_access_h
+
+#include <net-snmp/net-snmp-config.h>
+#include <net-snmp/net-snmp-includes.h>
+#include <net-snmp/agent/net-snmp-agent-includes.h>
+
+
+extern "C" {
+ /** User-defined data access functions for data in table rhcServicesTable */
+ /** row level accessors */
+ Netsnmp_First_Data_Point rhcServicesTable_get_first_data_point;
+ Netsnmp_Next_Data_Point rhcServicesTable_get_next_data_point;
+ Netsnmp_Free_Loop_Context rhcServicesTable_loop_free;
+ Netsnmp_Make_Data_Context rhcServicesTable_context_convert_function;
+ Netsnmp_Free_Data_Context rhcServicesTable_data_free;
+
+ int rhcServicesTable_commit_row(void** my_data_context, int new_or_del);
+ void *rhcServicesTable_create_data_context(netsnmp_variable_list* index_data);
+
+ /** column accessors */
+ char *get_rhcServiceName(void *data_context, size_t * ret_len);
+ long *get_rhcServiceStatusCode(void *data_context, size_t * ret_len);
+ char *get_rhcServiceStatusDesc(void *data_context, size_t * ret_len);
+ char *get_rhcServiceStartMode(void *data_context, size_t * ret_len);
+ char *get_rhcServiceRunningOnNode(void *data_context, size_t * ret_len);
+};
+
+#endif // servicesMIB_access_h
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB_checkfns.cpp,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB_checkfns.cpp
+++ - 2006-06-14 21:44:43.950880000 +0000
@@ -0,0 +1,22 @@
+/*
+ * Note: this file originally auto-generated by mib2c using
+ * : mib2c.check_values.conf,v 1.6.2.3 2004/01/12 00:55:31 rstory Exp $
+ */
+
+/********************************************************************
+ * NOTE NOTE NOTE
+ * This file is auto-generated and SHOULD NOT BE EDITED by hand.
+ * Modify the rhcServicesTable_checkfns_local.[ch] files insead so that you
+ * can regenerate this one as mib2c improvements are made.
+ ********************************************************************/
+
+/*
+ * standard headers
+ */
+
+#include <net-snmp/net-snmp-config.h>
+#include <net-snmp/net-snmp-includes.h>
+
+#include "servicesMIB_checkfns.h"
+#include "servicesMIB_checkfns_local.h"
+#include "servicesMIB_enums.h"
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB_checkfns.h,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB_checkfns.h
+++ - 2006-06-14 21:44:44.033659000 +0000
@@ -0,0 +1,24 @@
+/*
+ * Note: this file originally auto-generated by mib2c using
+ * : mib2c.iterate.conf,v 5.6 2003/02/20 00:52:07 hardaker Exp $
+ */
+
+/***********************************************************************
+ * This file is auto-generated and SHOULD NOT BE EDITED by hand.
+ * Modify the rhcServicesTable_checkfns_local.[ch] files insead.
+ * (so that you can regenerate this one as mib2c improvements are made)
+ ***********************************************************************/
+
+#ifndef servicesMIB_checkfns_h
+#define servicesMIB_checkfns_h
+
+/** make sure we load the functions that you can modify */
+config_require(rhcServicesTable_checkfns_local)
+
+ /*
+ * these functions are designed to check incoming values for
+ * columns in the rhcServicesTable table for legality with respect to
+ * datatype and value.
+ */
+
+#endif // servicesMIB_checkfns_h
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB_checkfns_local.cpp,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB_checkfns_local.cpp
+++ - 2006-06-14 21:44:44.116406000 +0000
@@ -0,0 +1,32 @@
+/*
+ Copyright Red Hat, Inc. 2005
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+/*
+ * Note: this file originally auto-generated by mib2c using
+ * : mib2c.check_values_local.conf,v 5.1.2.1 2004/05/04 23:35:32 hardaker Exp $
+ */
+
+
+#include <net-snmp/net-snmp-config.h>
+#include <net-snmp/net-snmp-includes.h>
+
+#include "servicesMIB_checkfns.h"
+#include "servicesMIB_enums.h"
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB_checkfns_local.h,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB_checkfns_local.h
+++ - 2006-06-14 21:44:44.196461000 +0000
@@ -0,0 +1,41 @@
+/*
+ Copyright Red Hat, Inc. 2005
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+/*
+ * Note: this file originally auto-generated by mib2c using
+ * : : mib2c.check_values_local.conf,v 5.1.2.1 2004/05/04 23:35:32 hardaker Exp $
+ */
+
+
+#ifndef servicesMIB_checkfns_local_h
+#define servicesMIB_checkfns_local_h
+
+/*
+ * these functions are designed to check incoming values for
+ * columns in the rhcServicesTable table for legality with respect to
+ * datatype and value according to local conventions. You should modify
+ * them as appropriate. They will be called from parent check_value
+ * functions that are auto-generated using mib2c and the parent functions
+ * should NOT be modified.
+ */
+
+
+#endif // servicesMIB_checkfns_local_h
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB_columns.h,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB_columns.h
+++ - 2006-06-14 21:44:44.279964000 +0000
@@ -0,0 +1,40 @@
+/*
+ Copyright Red Hat, Inc. 2005
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+/*
+ * Note: this file originally auto-generated by mib2c using
+ * : mib2c.column_defines.conf,v 5.1 2002/05/08 05:42:47 hardaker Exp $
+ */
+
+
+#ifndef servicesMIB_columns_h
+#define servicesMIB_columns_h
+
+/*
+ * column number definitions for table rhcServicesTable
+ */
+#define COLUMN_RHCSERVICENAME 1
+#define COLUMN_RHCSERVICESTATUSCODE 2
+#define COLUMN_RHCSERVICESTATUSDESC 3
+#define COLUMN_RHCSERVICESTARTMODE 4
+#define COLUMN_RHCSERVICERUNNINGONNODE 5
+
+#endif // servicesMIB_columns_h
/cvs/cluster/conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB_enums.h,v --> standard output
revision 1.1
--- conga/ricci/modules/cluster/clumon/src/snmp-agent/servicesMIB_enums.h
+++ - 2006-06-14 21:44:44.360495000 +0000
@@ -0,0 +1,31 @@
+/*
+ Copyright Red Hat, Inc. 2005
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ MA 02139, USA.
+*/
+/*
+ * Author: Stanko Kupcevic <kupcevic at redhat.com>
+ */
+/*
+ * Note: this file originally auto-generated by mib2c using
+ * : mib2c.column_enums.conf,v 5.2 2003/02/22 04:09:25 hardaker Exp $
+ */
+
+
+#ifndef servicesMIB_enums_h
+#define servicesMIB_enums_h
+
+#endif // servicesMIB_enums_h
--- conga/ricci/oddjobd.conf.d/Makefile 2006/06/02 00:14:29 1.4
+++ conga/ricci/oddjobd.conf.d/Makefile 2006/06/14 21:44:37 1.5
@@ -16,13 +16,13 @@
all:
install:
- install -d ${DESTDIR}/etc/oddjobd.conf.d
- install reboot.conf ${DESTDIR}/etc/oddjobd.conf.d
- install modstorage_rw.conf ${DESTDIR}/etc/oddjobd.conf.d
- install modcluster_rw.conf ${DESTDIR}/etc/oddjobd.conf.d
- install modrpm_rw.conf ${DESTDIR}/etc/oddjobd.conf.d
- install modservice_rw.conf ${DESTDIR}/etc/oddjobd.conf.d
- install modlog_rw.conf ${DESTDIR}/etc/oddjobd.conf.d
+ install -d ${sysconfdir}/oddjobd.conf.d
+ install reboot.conf ${sysconfdir}/oddjobd.conf.d
+ install modstorage_rw.conf ${sysconfdir}/oddjobd.conf.d
+ install modcluster_rw.conf ${sysconfdir}/oddjobd.conf.d
+ install modrpm_rw.conf ${sysconfdir}/oddjobd.conf.d
+ install modservice_rw.conf ${sysconfdir}/oddjobd.conf.d
+ install modlog_rw.conf ${sysconfdir}/oddjobd.conf.d
uninstall:
--- conga/ricci/pam.d/Makefile 2006/03/13 19:03:32 1.1
+++ conga/ricci/pam.d/Makefile 2006/06/14 21:44:37 1.2
@@ -16,8 +16,8 @@
all:
install:
- install -d ${DESTDIR}/etc/pam.d
- install ricci ${DESTDIR}/etc/pam.d
+ install -d ${sysconfdir}/pam.d
+ install ricci ${sysconfdir}/pam.d/
uninstall:
--- conga/ricci/ricci/Makefile 2006/06/09 16:32:19 1.8
+++ conga/ricci/ricci/Makefile 2006/06/14 21:44:37 1.9
@@ -14,7 +14,7 @@
include ${top_srcdir}/make/defines.mk
INCLUDE += -I $(top_srcdir)/include \
- -I /usr/include/dbus-1.0 -I ${LIBDIR}/dbus-1.0/include \
+ -I ${includedir}/dbus-1.0 -I ${libdir}/dbus-1.0/include \
`xml2-config --cflags`
@@ -54,14 +54,14 @@
install:
install -d ${sbindir}
- install -d ${DESTDIR}/var/lib/ricci
- install -d ${DESTDIR}/var/lib/ricci/certs
- install -d ${DESTDIR}/var/lib/ricci/certs/clients
- install -d ${DESTDIR}/var/lib/ricci/queue
+ install -d ${localstatedir}/lib/ricci
+ install -d ${localstatedir}/lib/ricci/certs
+ install -d ${localstatedir}/lib/ricci/certs/clients
+ install -d ${localstatedir}/lib/ricci/queue
install ${TARGET} ${sbindir}
install ${TARGET_AUTH} ${sbindir}
install ${TARGET_WORKER} ${sbindir}
- install cacert.config ${DESTDIR}/var/lib/ricci/certs/
+ install cacert.config ${localstatedir}/lib/ricci/certs/
uninstall:
More information about the Cluster-devel
mailing list