From: kupcevic@sourceware.org <kupcevic@sourceware.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] conga ./Makefile ./configure ./conga.spec.in.i ...
Date: 14 Jun 2006 21:44:44 -0000 [thread overview]
Message-ID: <20060614214444.27621.qmail@sourceware.org> (raw)
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.
+\f
+ 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.)
+\f
+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.
+\f
+ 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.
+\f
+ 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
+\f
+ 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@redhat.com> 0.8-1
+- Packaged cluster-snmp (cluster snmp agent)
+- Packaged cluster-cim (cluster CIM provider)
* Mon Jun 06 2006 Stanko Kupcevic <kupcevic@redhat.com> 0.7-5
- Disable non-https access to Luci, enable https on port 8181
* Mon Jun 02 2006 Stanko Kupcevic <kupcevic@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.
+\f
+ 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.)
+\f
+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.
+\f
+ 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.
+\f
+ 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
+\f
+ 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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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:
reply other threads:[~2006-06-14 21:44 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20060614214444.27621.qmail@sourceware.org \
--to=kupcevic@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.