From 7bc4421f26954c2acd817c690cbbde03a4391878 Mon Sep 17 00:00:00 2001 From: Radek Novacek Date: Mon, 23 Jul 2012 12:41:11 +0200 Subject: Move all providers to src/ directory --- fan/.gitignore | 3 - fan/LICENSE | 674 ------------------ fan/Linux_Fan.c | 536 --------------- fan/Linux_Fan.h | 198 ------ fan/Makefile | 35 - fan/README | 42 -- fan/cmpiLinux_Fan.c | 128 ---- fan/cmpiLinux_Fan.h | 40 -- fan/cmpiLinux_FanAssociatedSensorProvider.c | 561 --------------- fan/cmpiLinux_FanCommon.c | 252 ------- fan/cmpiLinux_FanCommon.h | 41 -- fan/cmpiLinux_FanProvider.c | 498 -------------- fan/cmpiLinux_FanSensor.c | 141 ---- fan/cmpiLinux_FanSensor.h | 40 -- fan/cmpiLinux_FanSensorProvider.c | 327 --------- fan/mof/Linux_Fan.mof | 112 --- fan/mof/Linux_Fan.reg | 18 - providers/cmpi-service/AUTHORS | 1 - providers/cmpi-service/COPYING | 674 ------------------ providers/cmpi-service/ChangeLog | 1 - providers/cmpi-service/Makefile.am | 38 -- providers/cmpi-service/NEWS | 1 - providers/cmpi-service/README | 6 - providers/cmpi-service/Service.c | 343 ---------- providers/cmpi-service/ServiceUtils.c | 119 ---- providers/cmpi-service/ServiceUtils.h | 37 - providers/cmpi-service/acinclude.m4 | 407 ----------- providers/cmpi-service/autoconfiscate.sh | 39 -- providers/cmpi-service/cmpi-service.spec | 91 --- providers/cmpi-service/configure.ac | 74 -- providers/cmpi-service/mof/Linux_Service.mof | 58 -- .../cmpi-service/mof/Linux_Service.registration | 2 - providers/cmpi-service/provider-register.sh | 755 --------------------- providers/cmpi-service/util/servicedisc.sh | 45 -- providers/cmpi-service/util/serviceutil.c | 262 ------- providers/cmpi-service/util/serviceutil.h | 67 -- providers/cmpi-service/util/serviceutil.sh | 90 --- providers/power/CMakeLists.txt | 19 - providers/power/Linux_PowerManagement.mof | 58 -- providers/power/provider-register.sh | 755 --------------------- providers/power/sblim_cmpi_power_test.py | 52 -- providers/power/src/CMakeLists.txt | 70 -- ...inux_AssociatedPowerManagementServiceProvider.c | 294 -------- providers/power/src/Linux_ConcreteJobProvider.c | 206 ------ .../power/src/Linux_ElementCapabilitiesProvider.c | 225 ------ providers/power/src/Linux_HostedServiceProvider.c | 258 ------- .../Linux_PowerManagementCapabilitiesProvider.c | 162 ----- .../src/Linux_PowerManagementServiceProvider.c | 278 -------- providers/power/src/globals.c | 24 - providers/power/src/globals.h | 7 - providers/power/src/power.c | 517 -------------- providers/power/src/power.h | 56 -- providers/power/src/trace.c | 29 - providers/power/src/trace.h | 4 - src/fan/.gitignore | 3 + src/fan/LICENSE | 674 ++++++++++++++++++ src/fan/Linux_Fan.c | 536 +++++++++++++++ src/fan/Linux_Fan.h | 198 ++++++ src/fan/Makefile | 35 + src/fan/README | 42 ++ src/fan/cmpiLinux_Fan.c | 128 ++++ src/fan/cmpiLinux_Fan.h | 40 ++ src/fan/cmpiLinux_FanAssociatedSensorProvider.c | 561 +++++++++++++++ src/fan/cmpiLinux_FanCommon.c | 252 +++++++ src/fan/cmpiLinux_FanCommon.h | 41 ++ src/fan/cmpiLinux_FanProvider.c | 498 ++++++++++++++ src/fan/cmpiLinux_FanSensor.c | 141 ++++ src/fan/cmpiLinux_FanSensor.h | 40 ++ src/fan/cmpiLinux_FanSensorProvider.c | 327 +++++++++ src/fan/mof/Linux_Fan.mof | 112 +++ src/fan/mof/Linux_Fan.reg | 18 + src/power/CMakeLists.txt | 19 + src/power/Linux_PowerManagement.mof | 58 ++ src/power/provider-register.sh | 755 +++++++++++++++++++++ src/power/sblim_cmpi_power_test.py | 52 ++ src/power/src/CMakeLists.txt | 70 ++ ...inux_AssociatedPowerManagementServiceProvider.c | 294 ++++++++ src/power/src/Linux_ConcreteJobProvider.c | 206 ++++++ src/power/src/Linux_ElementCapabilitiesProvider.c | 225 ++++++ src/power/src/Linux_HostedServiceProvider.c | 258 +++++++ .../Linux_PowerManagementCapabilitiesProvider.c | 162 +++++ .../src/Linux_PowerManagementServiceProvider.c | 278 ++++++++ src/power/src/globals.c | 24 + src/power/src/globals.h | 7 + src/power/src/power.c | 517 ++++++++++++++ src/power/src/power.h | 56 ++ src/power/src/trace.c | 29 + src/power/src/trace.h | 4 + src/service/AUTHORS | 1 + src/service/COPYING | 674 ++++++++++++++++++ src/service/ChangeLog | 1 + src/service/Makefile.am | 38 ++ src/service/NEWS | 1 + src/service/README | 6 + src/service/Service.c | 343 ++++++++++ src/service/ServiceUtils.c | 119 ++++ src/service/ServiceUtils.h | 37 + src/service/acinclude.m4 | 407 +++++++++++ src/service/autoconfiscate.sh | 39 ++ src/service/cmpi-service.spec | 91 +++ src/service/configure.ac | 74 ++ src/service/mof/Linux_Service.mof | 58 ++ src/service/mof/Linux_Service.registration | 2 + src/service/provider-register.sh | 755 +++++++++++++++++++++ src/service/util/servicedisc.sh | 45 ++ src/service/util/serviceutil.c | 262 +++++++ src/service/util/serviceutil.h | 67 ++ src/service/util/serviceutil.sh | 90 +++ 108 files changed, 9770 insertions(+), 9770 deletions(-) delete mode 100644 fan/.gitignore delete mode 100644 fan/LICENSE delete mode 100644 fan/Linux_Fan.c delete mode 100644 fan/Linux_Fan.h delete mode 100644 fan/Makefile delete mode 100644 fan/README delete mode 100644 fan/cmpiLinux_Fan.c delete mode 100644 fan/cmpiLinux_Fan.h delete mode 100644 fan/cmpiLinux_FanAssociatedSensorProvider.c delete mode 100644 fan/cmpiLinux_FanCommon.c delete mode 100644 fan/cmpiLinux_FanCommon.h delete mode 100644 fan/cmpiLinux_FanProvider.c delete mode 100644 fan/cmpiLinux_FanSensor.c delete mode 100644 fan/cmpiLinux_FanSensor.h delete mode 100644 fan/cmpiLinux_FanSensorProvider.c delete mode 100644 fan/mof/Linux_Fan.mof delete mode 100644 fan/mof/Linux_Fan.reg delete mode 100644 providers/cmpi-service/AUTHORS delete mode 100644 providers/cmpi-service/COPYING delete mode 100644 providers/cmpi-service/ChangeLog delete mode 100644 providers/cmpi-service/Makefile.am delete mode 100644 providers/cmpi-service/NEWS delete mode 100644 providers/cmpi-service/README delete mode 100644 providers/cmpi-service/Service.c delete mode 100644 providers/cmpi-service/ServiceUtils.c delete mode 100644 providers/cmpi-service/ServiceUtils.h delete mode 100644 providers/cmpi-service/acinclude.m4 delete mode 100755 providers/cmpi-service/autoconfiscate.sh delete mode 100644 providers/cmpi-service/cmpi-service.spec delete mode 100644 providers/cmpi-service/configure.ac delete mode 100644 providers/cmpi-service/mof/Linux_Service.mof delete mode 100644 providers/cmpi-service/mof/Linux_Service.registration delete mode 100755 providers/cmpi-service/provider-register.sh delete mode 100755 providers/cmpi-service/util/servicedisc.sh delete mode 100644 providers/cmpi-service/util/serviceutil.c delete mode 100644 providers/cmpi-service/util/serviceutil.h delete mode 100755 providers/cmpi-service/util/serviceutil.sh delete mode 100644 providers/power/CMakeLists.txt delete mode 100644 providers/power/Linux_PowerManagement.mof delete mode 100755 providers/power/provider-register.sh delete mode 100755 providers/power/sblim_cmpi_power_test.py delete mode 100644 providers/power/src/CMakeLists.txt delete mode 100644 providers/power/src/Linux_AssociatedPowerManagementServiceProvider.c delete mode 100644 providers/power/src/Linux_ConcreteJobProvider.c delete mode 100644 providers/power/src/Linux_ElementCapabilitiesProvider.c delete mode 100644 providers/power/src/Linux_HostedServiceProvider.c delete mode 100644 providers/power/src/Linux_PowerManagementCapabilitiesProvider.c delete mode 100644 providers/power/src/Linux_PowerManagementServiceProvider.c delete mode 100644 providers/power/src/globals.c delete mode 100644 providers/power/src/globals.h delete mode 100644 providers/power/src/power.c delete mode 100644 providers/power/src/power.h delete mode 100644 providers/power/src/trace.c delete mode 100644 providers/power/src/trace.h create mode 100644 src/fan/.gitignore create mode 100644 src/fan/LICENSE create mode 100644 src/fan/Linux_Fan.c create mode 100644 src/fan/Linux_Fan.h create mode 100644 src/fan/Makefile create mode 100644 src/fan/README create mode 100644 src/fan/cmpiLinux_Fan.c create mode 100644 src/fan/cmpiLinux_Fan.h create mode 100644 src/fan/cmpiLinux_FanAssociatedSensorProvider.c create mode 100644 src/fan/cmpiLinux_FanCommon.c create mode 100644 src/fan/cmpiLinux_FanCommon.h create mode 100644 src/fan/cmpiLinux_FanProvider.c create mode 100644 src/fan/cmpiLinux_FanSensor.c create mode 100644 src/fan/cmpiLinux_FanSensor.h create mode 100644 src/fan/cmpiLinux_FanSensorProvider.c create mode 100644 src/fan/mof/Linux_Fan.mof create mode 100644 src/fan/mof/Linux_Fan.reg create mode 100644 src/power/CMakeLists.txt create mode 100644 src/power/Linux_PowerManagement.mof create mode 100755 src/power/provider-register.sh create mode 100755 src/power/sblim_cmpi_power_test.py create mode 100644 src/power/src/CMakeLists.txt create mode 100644 src/power/src/Linux_AssociatedPowerManagementServiceProvider.c create mode 100644 src/power/src/Linux_ConcreteJobProvider.c create mode 100644 src/power/src/Linux_ElementCapabilitiesProvider.c create mode 100644 src/power/src/Linux_HostedServiceProvider.c create mode 100644 src/power/src/Linux_PowerManagementCapabilitiesProvider.c create mode 100644 src/power/src/Linux_PowerManagementServiceProvider.c create mode 100644 src/power/src/globals.c create mode 100644 src/power/src/globals.h create mode 100644 src/power/src/power.c create mode 100644 src/power/src/power.h create mode 100644 src/power/src/trace.c create mode 100644 src/power/src/trace.h create mode 100644 src/service/AUTHORS create mode 100644 src/service/COPYING create mode 100644 src/service/ChangeLog create mode 100644 src/service/Makefile.am create mode 100644 src/service/NEWS create mode 100644 src/service/README create mode 100644 src/service/Service.c create mode 100644 src/service/ServiceUtils.c create mode 100644 src/service/ServiceUtils.h create mode 100644 src/service/acinclude.m4 create mode 100755 src/service/autoconfiscate.sh create mode 100644 src/service/cmpi-service.spec create mode 100644 src/service/configure.ac create mode 100644 src/service/mof/Linux_Service.mof create mode 100644 src/service/mof/Linux_Service.registration create mode 100755 src/service/provider-register.sh create mode 100755 src/service/util/servicedisc.sh create mode 100644 src/service/util/serviceutil.c create mode 100644 src/service/util/serviceutil.h create mode 100755 src/service/util/serviceutil.sh diff --git a/fan/.gitignore b/fan/.gitignore deleted file mode 100644 index 57828b5..0000000 --- a/fan/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -*.o -*.so - diff --git a/fan/LICENSE b/fan/LICENSE deleted file mode 100644 index 94a9ed0..0000000 --- a/fan/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/fan/Linux_Fan.c b/fan/Linux_Fan.c deleted file mode 100644 index 738920b..0000000 --- a/fan/Linux_Fan.c +++ /dev/null @@ -1,536 +0,0 @@ -/* This file is part of cmpiLinux_FanProvider. - * - * cmpiLinux_FanProvider 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 3 of the License, or - * (at your option) any later version. - * - * cmpiLinux_FanProvider 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 cmpiLinux_FanProvider. If not, see - * . - */ -#ifndef _XOPEN_SOURCE - //this is for strdup - #define _XOPEN_SOURCE 500 -#endif -#include -#include -#include -#include -#include -#include -#include -#include - -#include "Linux_Fan.h" - -#define MAX_CHIP_NAME_LENGTH 200 - -//* constants ***************************************************************** -static bool MODULE_INITIALIZED = false; - -static char const * const _fan_errors[] = { - "success", - "failed to get fan by identification supplied", - "given identification data is not enough to identify uniquely", - "no chip with given system path found", - "no fan with given name and chip found", - "unknown property", - "this property is not supported for setting", - "property is not writable", - "input/output error", - "initialization failed", - "unknown error occured" -}; - -//* static functions ********************************************************** -static cim_fan_error_t prop_type2sf_num( - cim_fan_prop_type_t pt, - int *sf_num) -{ - switch (pt) { - case CIM_FAN_MIN_SPEED: *sf_num = SENSORS_SUBFEATURE_FAN_MIN; break; - case CIM_FAN_MAX_SPEED: -#ifdef SENSORS_SUBFEATURE_FAN_MAX - *sf_num = SENSORS_SUBFEATURE_FAN_MAX; break; -#else - return CIM_FAN_NOT_SUPPORTED_PROP; -#endif - case CIM_FAN_DIV: *sf_num = SENSORS_SUBFEATURE_FAN_DIV; break; - case CIM_FAN_PULSES: *sf_num = SENSORS_SUBFEATURE_FAN_PULSES; break; - case CIM_FAN_BEEP: *sf_num = SENSORS_SUBFEATURE_FAN_BEEP; break; - default: return CIM_FAN_UNKNOWN_PROP; break; - } - return CIM_FAN_SUCCESS; -} - -static double prop_val2double( - cim_fan_prop_type_t pt, - cim_fan_prop_value_t const *val) { - switch (pt) { - case CIM_FAN_MIN_SPEED: return val->min_speed; - case CIM_FAN_MAX_SPEED: return val->max_speed; - case CIM_FAN_DIV: return val->divisor; - case CIM_FAN_PULSES: return val->pulses; - case CIM_FAN_BEEP: return val->beep; - } - return 0; -} - -static cim_fan_error_t libsensors2cim_fan_error(int err) { - if (!err) return CIM_FAN_SUCCESS; - if (err < 0) err = -err; - if (err < SENSORS_ERR_WILDCARDS || err > SENSORS_ERR_RECURSION) { - return CIM_FAN_OTHER_ERROR; - } - return (cim_fan_error_t) (0x100 + err); -} - -static const char * sprintf_chip_name(sensors_chip_name const *name) { - /** @return NULL on error, cstring otherwise */ - static char buf[MAX_CHIP_NAME_LENGTH]; - if (sensors_snprintf_chip_name(buf, MAX_CHIP_NAME_LENGTH, name) < 0) - return NULL; - return buf; -} - -static cim_fan_error_t reload_config_file(char const * fp) { - /** - * @param fp if NULL -> default configuration file will be loaded - * @return 0 on success */ - FILE *config_file = NULL; - int err; - - if (fp) { - if (!(config_file = fopen(fp, "r"))) { - fprintf(stderr, "Cound not open config file \"%s\": %s\n", - fp, strerror(errno)); - } - } - err = sensors_init(config_file); - if (err) { - fprintf(stderr, "sensors_init: %s\n", sensors_strerror(err)); - if (config_file) fclose(config_file); - }else { - if (config_file) fclose(config_file); - } - return libsensors2cim_fan_error(err); -} - -static double _get_value( sensors_chip_name const *chip - , sensors_subfeature const *sf) -{ - double val; - if (sensors_get_value(chip, sf->number, &val)) return 0.; - return val; -} - -static int _assign_sf_value( - sensors_chip_name const *chip, - sensors_feature const *feature, - int subfeature_type, - struct cim_fan *fdest) -{ - sensors_subfeature const *sf; - double val; - - sf = sensors_get_subfeature(chip, feature, subfeature_type); - val = sf ? _get_value(chip, sf):0.; - switch (subfeature_type) { - case SENSORS_SUBFEATURE_FAN_INPUT: fdest->speed = val; break; - case SENSORS_SUBFEATURE_FAN_MIN: fdest->min_speed = val; break; -#ifdef SENSORS_SUBFEATURE_FAN_MAX - case SENSORS_SUBFEATURE_FAN_MAX: fdest->max_speed = val; break; -#endif - case SENSORS_SUBFEATURE_FAN_DIV: fdest->divisor = val; break; - case SENSORS_SUBFEATURE_FAN_PULSES: fdest->pulses = val; break; - case SENSORS_SUBFEATURE_FAN_FAULT: fdest->fault = val != 0; break; - case SENSORS_SUBFEATURE_FAN_BEEP: fdest->beep = val != 0; break; - case SENSORS_SUBFEATURE_FAN_ALARM: fdest->alarm = val != 0; break; -#ifdef SENSORS_SUBFEATURE_ALARM_MIN - case SENSORS_SUBFEATURE_FAN_ALARM_MIN: - fdest->alarm_min = val != 0; - break; -#endif -#ifdef SENSORS_SUBFEATURE_FAN_ALARM_MAX - case SENSORS_SUBFEATURE_FAN_ALARM_MAX: - fdest->alarm_max = val != 0; - break; -#endif - default: return 1; - } - return !sf; -} - -static unsigned int _load_accessible_features( - sensors_chip_name const *chip, - sensors_feature const *feature) -{ - sensors_subfeature const *sf; - unsigned int res = 0; - unsigned int i = 1; - int sf_type; - - while(i <= CIM_FAN_AF_FEATURE_MAX) { - switch (i) { - case CIM_FAN_AF_MIN_SPEED: - sf_type = SENSORS_SUBFEATURE_FAN_MIN; break; -#ifdef SENSORS_SUBFEATURE_FAN_MAX - case CIM_FAN_AF_MAX_SPEED: - sf_type = SENSORS_SUBFEATURE_FAN_MAX; break; -#endif - case CIM_FAN_AF_DIV: - sf_type = SENSORS_SUBFEATURE_FAN_DIV; break; - case CIM_FAN_AF_PULSES: - sf_type = SENSORS_SUBFEATURE_FAN_PULSES; break; - case CIM_FAN_AF_FAULT: - sf_type = SENSORS_SUBFEATURE_FAN_FAULT; break; - case CIM_FAN_AF_BEEP: - sf_type = SENSORS_SUBFEATURE_FAN_BEEP; break; - case CIM_FAN_AF_ALARM: - sf_type = SENSORS_SUBFEATURE_FAN_ALARM; break; -#ifdef SENSORS_SUBFEATURE_FAN_ALARM_MIN - case CIM_FAN_AF_ALARM_MIN: - sf_type = SENSORS_SUBFEATURE_ALARM_MIN: break; -#endif -#ifdef SENSORS_SUBFEATURE_ALARM_MAX - case CIM_FAN_AF_ALARM_MAX: - sf_type = SENSORS_SUBFEATURE_ALARM_MAX; break; -#endif - default: - sf_type = -1; break; - } - if (sf_type != -1) { - sf = sensors_get_subfeature(chip, feature, sf_type); - res |= sf ? i : 0; - } - i = i << 1; - } - return res; -} - - -static struct cim_fan * _load_fan_data( sensors_chip_name const *chip - , sensors_feature const *feature) -{ - struct cim_fan *f; - char const *chip_name; - char * tmp; - int length; - int const sfs[] = { - SENSORS_SUBFEATURE_FAN_INPUT, - SENSORS_SUBFEATURE_FAN_MIN, -#ifdef SENSORS_SUBFEATURE_FAN_MAX - SENSORS_SUBFEATURE_FAN_MAX, -#endif - SENSORS_SUBFEATURE_FAN_DIV, - SENSORS_SUBFEATURE_FAN_PULSES, - SENSORS_SUBFEATURE_FAN_FAULT, - SENSORS_SUBFEATURE_FAN_BEEP, - SENSORS_SUBFEATURE_FAN_ALARM, -#ifdef SENSORS_SUBFEATURE_FAN_MIN_ALARM - SENSORS_SUBFEATURE_FAN_MIN_ALARM, -#endif -#ifdef SENSORS_SUBFEATURE_FAN_MAX_ALARM - SENSORS_SUBFEATURE_FAN_MAX_ALARM, -#endif - -1, // terminator - }; - - - if ((f = calloc(1, sizeof(struct cim_fan)))) { - if (!(chip_name = sprintf_chip_name(chip))) { - fprintf(stderr, "could not get chip name\n"); - goto lab_err_free_fan; - } - if (!(f->chip_name = strdup(chip_name))) { - perror("strdup"); - goto lab_err_free_fan; - } - f->sys_path = chip->path; - if (!(f->name = sensors_get_label(chip, feature))) { - fprintf(stderr, "could not get fan name for chip: %s\n", - f->chip_name); - goto lab_err_chip_name; - } - length = strlen(f->sys_path); - if (!(f->device_id = malloc((length + strlen(f->name) + 2) - * sizeof(char)))) { - perror("malloc"); - goto lab_err_fan_name; - } - tmp = strcpy((char*) f->device_id, f->sys_path); - tmp += length * sizeof(char); - if (f->sys_path[length - 1] != '/') { - //this will be almost certainly true - *(tmp++) = '/'; - } - strcpy(tmp, f->name); - - for (int const *sf_ptr=sfs; *sf_ptr != -1; ++sf_ptr) { - _assign_sf_value(chip, feature, *sf_ptr, f); - } - f->accessible_features = _load_accessible_features(chip, feature); - return f; - } -//lab_err_device_id: -// free((char*) f->device_id); -lab_err_fan_name: - free((char*) f->name); -lab_err_chip_name: - free((char*) f->chip_name); -lab_err_free_fan: - free(f); - return NULL; -} - -static cim_fan_error_t _find_fan( - char const *sys_path, - char const *fan_name, - sensors_chip_name const **chip, - sensors_feature const **feature) -{ - int chip_nr = 0, feature_nr = 0; - char * sp = (char*) sys_path; - char const *label; - int length; - cim_fan_error_t ret = CIM_FAN_OTHER_ERROR; - - if (!sys_path || !fan_name) goto lab_err_fan_data; - - length = strlen(sys_path); - if (length && sys_path[length - 1] == '/') { - if (!(sp = strdup(sys_path))) { - perror("strdup"); - goto lab_err_fan_data; - } - sp[length - 1] = '\0'; - } - - while ((*chip = sensors_get_detected_chips(NULL, &chip_nr))) { - if ((*chip)->path && !strcmp((*chip)->path, sys_path)) break; - } - if (!(*chip)) { - ret = CIM_FAN_NO_SUCH_CHIP; - goto lab_err_sys_path; - } - while ((*feature = sensors_get_features(*chip, &feature_nr))) { - if ((*feature)->type != SENSORS_FEATURE_FAN) continue; - if (!(label = sensors_get_label(*chip, *feature))) { - continue; - } - if (!strcmp(label, fan_name)) { - free((char*) label); - break; - } - free((char*) label); - } - if (!(*feature)) { - ret = CIM_FAN_NO_SUCH_FAN_NAME; - goto lab_err_sys_path; - } - return CIM_FAN_SUCCESS; - -lab_err_sys_path: - if (sp != sys_path) free(sp); -lab_err_fan_data: - return ret; -} - -static cim_fan_error_t _find_fan_by_id( - char const *device_id, - sensors_chip_name const **chip, - sensors_feature const **feature) -{ - char *sys_path; - char *fan_name; - char *tmp1, *tmp2; - cim_fan_error_t ret; - - if (!(tmp1 = strdup(device_id))) { - perror("strdup"); - return CIM_FAN_OTHER_ERROR; - } - if (!(tmp2 = strdup(device_id))) { - perror("strdup"); - free(tmp1); - return CIM_FAN_OTHER_ERROR; - } - sys_path = dirname(tmp1); - fan_name = basename(tmp2); - ret = _find_fan(sys_path, fan_name, chip, feature); - free(tmp1); - free(tmp2); - - return ret; -} - -static cim_fan_error_t _set_fan_prop( - sensors_chip_name const *chip, - cim_fan_prop_type_t prop_type, - cim_fan_prop_value_t const *prop) -{ - int sf_num; - cim_fan_error_t err; - double val; - - if (!(err = prop_type2sf_num(prop_type, &sf_num))) { - val = prop_val2double(prop_type, prop); - err = libsensors2cim_fan_error( - sensors_set_value(chip, sf_num, val)); - } - return err; -} - -//* module interface ********************************************************** -char const * cim_fan_strerror(cim_fan_error_t error) { - if ( ((int) error) > 0x100 - && ((int) error) <= 0x100 + SENSORS_ERR_RECURSION) { - return sensors_strerror(((int) error) - 0x100); - } - if ( ((int) error) < CIM_FAN_SUCCESS - || ((int) error) > CIM_FAN_OTHER_ERROR) { - return "unknown error code"; - } - return _fan_errors[(int) error]; -} - -cim_fan_error_t enum_all_fans(struct fanlist **lptr) { - struct fanlist * lptrhelp = NULL; - sensors_chip_name const *chip; - sensors_feature const *feature; - int chip_nr = 0, feature_nr; - - if (!(lptrhelp = calloc(1, sizeof(struct fanlist)))) { - perror("calloc"); - return CIM_FAN_OTHER_ERROR; - } - *lptr = lptrhelp; - while ((chip = sensors_get_detected_chips(NULL, &chip_nr))) { - feature_nr = 0; - while ((feature = sensors_get_features(chip, &feature_nr))) { - if (feature->type != SENSORS_FEATURE_FAN) continue; - if (lptrhelp->f) { - if (!(lptrhelp->next = calloc(1, sizeof(struct fanlist)))) { - free_fanlist(*lptr); - perror("calloc"); - return CIM_FAN_OTHER_ERROR; - } - lptrhelp = lptrhelp->next; - } - if (!(lptrhelp->f = _load_fan_data(chip, feature))) { - free_fanlist(*lptr); - return CIM_FAN_OTHER_ERROR; - } - } - } - if (!(*lptr)->f) { - free_fanlist(*lptr); - *lptr = NULL; - } - return CIM_FAN_SUCCESS; -} - -cim_fan_error_t get_fan_data_by_id( - char const *device_id, - struct cim_fan **sptr) -{ - sensors_chip_name const *chip; - sensors_feature const *feature; - cim_fan_error_t ret; - - if ((ret = _find_fan_by_id(device_id, &chip, &feature)) - == CIM_FAN_SUCCESS) { - if (!(*sptr = _load_fan_data(chip, feature))) { - ret = CIM_FAN_OTHER_ERROR; - } - } - return ret; -} - -cim_fan_error_t get_fan_data( - char const *sys_path, - char const *fan_name, - struct cim_fan **sptr) -{ - sensors_chip_name const *chip; - sensors_feature const *feature; - cim_fan_error_t ret; - - if ((ret = _find_fan(sys_path, fan_name, &chip, &feature)) - == CIM_FAN_SUCCESS) { - if (!(*sptr = _load_fan_data(chip, feature))) { - ret = CIM_FAN_OTHER_ERROR; - } - } - return ret; -} - -cim_fan_error_t set_fan_prop_by_id( - char const *device_id, - cim_fan_prop_type_t prop_type, - cim_fan_prop_value_t const *prop) -{ - sensors_chip_name const *chip; - sensors_feature const *feature; - cim_fan_error_t err; - - if (!(err = _find_fan_by_id(device_id, &chip, &feature))) - err = _set_fan_prop(chip, prop_type, prop); - return err; -} - -cim_fan_error_t set_fan_prop( - char const *sys_path, - char const *fan_name, - cim_fan_prop_type_t prop_type, - cim_fan_prop_value_t const *prop) -{ - sensors_chip_name const *chip; - sensors_feature const *feature; - cim_fan_error_t err; - - if (!(err = _find_fan(sys_path, fan_name, &chip, &feature))) - err = _set_fan_prop(chip, prop_type, prop); - return err; -} - -void free_fanlist(struct fanlist *lptr) { - struct fanlist *tmp; - while (lptr) { - tmp = lptr->next; - if (lptr->f) free_fan(lptr->f); - free(lptr); - lptr = tmp; - } -} - -void free_fan(struct cim_fan *fan) { - if (fan) { - if (fan->name) free((char*) fan->name); - if (fan->chip_name) free((char*) fan->chip_name); - if (fan->device_id) free((char*) fan->device_id); - free(fan); - } -} - -cim_fan_error_t init_linux_fan_module() { - if (!MODULE_INITIALIZED) { - if (reload_config_file(NULL)) return CIM_FAN_INIT_FAILED; - MODULE_INITIALIZED = true; - } - return CIM_FAN_SUCCESS; -} - -void cleanup_linux_fan_module() { - if (MODULE_INITIALIZED) { - sensors_cleanup(); - MODULE_INITIALIZED = false; - } -} - diff --git a/fan/Linux_Fan.h b/fan/Linux_Fan.h deleted file mode 100644 index 6eacd49..0000000 --- a/fan/Linux_Fan.h +++ /dev/null @@ -1,198 +0,0 @@ -/* This file is part of cmpiLinux_FanProvider. - * - * cmpiLinux_FanProvider 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 3 of the License, or - * (at your option) any later version. - * - * cmpiLinux_FanProvider 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 cmpiLinux_FanProvider. If not, see - * . - */ -#ifndef LINUX_FAN_H_ -#define LINUX_FAN_H_ - -#include - -/** accessible features of fan - * each value represents a bit position in accessible_features vector in - * cim_fan struct - */ -#define CIM_FAN_AF_MIN_SPEED (1 << 0) -#define CIM_FAN_AF_MAX_SPEED (1 << 1) -#define CIM_FAN_AF_DIV (1 << 2) -#define CIM_FAN_AF_PULSES (1 << 3) -#define CIM_FAN_AF_FAULT (1 << 4) -#define CIM_FAN_AF_BEEP (1 << 5) -#define CIM_FAN_AF_ALARM (1 << 6) -#define CIM_FAN_AF_ALARM_MIN (1 << 7) -#define CIM_FAN_AF_ALARM_MAX (1 << 8) -#define CIM_FAN_AF_FEATURE_MAX (1 << 8) - -/** - * Descriptions of attributes are taken from: - * sysfs-interface documentation of hwmon - */ -struct cim_fan{ - char const * chip_name; - char const * sys_path; - char const * name; - /* is a composition of sys_path and name - * uniquely identifies fan - */ - char const * device_id; - - /* This is a bit vector with bit on position i meaning: - * CIM_FAN_AF_[i] = 1 <==> feature is available in fan's kernel interface - * (a file/channel is available under sys_path) - */ - unsigned int accessible_features; - - /* [RO] Fan input value. - * Unit: revolution/min (RPM) - */ - unsigned int speed; - - /* [RW] Fan minimum value - * Unit: revolution/min (RPM) - */ - unsigned int min_speed; - - /* [RW] Fan maximum value - * Unit: revolution/min (RPM) - * Only rarely supported by the hardware. - */ - unsigned int max_speed; - - /* [RW] Fan divisor. - * Integer value in powers of two (1, 2, 4, 8, 16, 32, 64, 128). - * Some chips only support values 1, 2, 4 and 8. - * Note that this is actually an internal clock divisor, which - * affects the measurable speed range, not the read value. - */ - unsigned int divisor; - - /* [RW] Number of tachometer pulses per fan revolution. - * Integer value, typically between 1 and 4. - * This value is a characteristic of the fan connected to the - * device's input, so it has to be set in accordance with the fan - * model. - * Should only be created if the chip has a register to configure - * the number of pulses. In the absence of such a register (and - * thus attribute) the value assumed by all devices is 2 pulses - * per fan revolution. - */ - unsigned int pulses; - - /* [RO] Each input channel may have an associated fault file. This can be - * used to notify open diodes, unconnected fans etc. where the hardware - * supports it. When this boolean has value 1, the measurement for that - * channel should not be trusted. - */ - bool fault; - - /* [RW] Channel beep - * false : disable - * true : enable - * Some chips also offer the possibility to get beeped when an alarm - * occurs. - */ - bool beep; - - /* [RO] Channel alarm - * false : no alarm - * true : alarm - * Each channel or limit may have an associated alarm file, containing a - * boolean value. 1 means that an alarm condition exists, 0 means no alarm. - * - * Usually a given chip will either use channel-related alarms, or - * limit-related alarms, not both. The driver should just reflect the - * hardware implementation. - */ - bool alarm; - bool alarm_min; - bool alarm_max; -}; - -struct fanlist{ - struct cim_fan * f; - struct fanlist * next; -}; - -typedef enum cim_fan_prop_type{ - CIM_FAN_MIN_SPEED = 1 << 0, - CIM_FAN_MAX_SPEED = 1 << 1, - CIM_FAN_DIV = 1 << 2, - CIM_FAN_PULSES = 1 << 3, - CIM_FAN_BEEP = 1 << 4, -}cim_fan_prop_type_t; - -typedef union cim_fan_prop_value{ - unsigned int min_speed; - unsigned int max_speed; - unsigned int divisor; - unsigned int pulses; - bool beep; -}cim_fan_prop_value_t; - -/** errors *******************************************************************/ -typedef enum cim_fan_error{ - CIM_FAN_SUCCESS = 0, - CIM_FAN_FAILED_TO_GET_FAN = 1, - CIM_FAN_MISSING_IDENTIFICATION = 2, - CIM_FAN_NO_SUCH_CHIP = 3, - CIM_FAN_NO_SUCH_FAN_NAME = 4, - CIM_FAN_UNKNOWN_PROP = 5, - CIM_FAN_NOT_SUPPORTED_PROP = 6, - CIM_FAN_NOT_WRITABLE_PROP = 7, - CIM_FAN_INIT_FAILED = 9, - CIM_FAN_OTHER_ERROR = 10, - - CIM_FAN_SEN_WILDCARDS = 0x101, - CIM_FAN_SEN_NO_ENTRY = 0x102, - CIM_FAN_SEN_ACCESS_R = 0x103, - CIM_FAN_SEN_KERNEL = 0x104, - CIM_FAN_SEN_DIV_ZERO = 0x105, - CIM_FAN_SEN_CHIP_NAME = 0x106, - CIM_FAN_SEN_BUS_NAME = 0x107, - CIM_FAN_SEN_PARSE = 0x108, - CIM_FAN_SEN_ACCESS_W = 0x109, - CIM_FAN_SEN_IO = 0x110, - CIM_FAN_SEN_RECURSION = 0x111, -}cim_fan_error_t; - -char const * cim_fan_strerror(cim_fan_error_t error); - -cim_fan_error_t enum_all_fans(struct fanlist ** lptr); - -cim_fan_error_t get_fan_data_by_id( - char const *device_id, - struct cim_fan **sptr); -cim_fan_error_t get_fan_data( - char const *sys_path, - char const *fan_name, - struct cim_fan **sptr); - -cim_fan_error_t set_fan_prop_by_id( - char const *device_id, - cim_fan_prop_type_t prop_type, - cim_fan_prop_value_t const *prop); -cim_fan_error_t set_fan_prop( - char const *sys_path, - char const *fan_name, - cim_fan_prop_type_t prop_type, - cim_fan_prop_value_t const *prop); - -void free_fanlist(struct fanlist *lptr); -void free_fan(struct cim_fan *sptr); - -cim_fan_error_t init_linux_fan_module(); -void cleanup_linux_fan_module(); - -#endif /* ----- LINUX_FAN_H_ ----- */ - diff --git a/fan/Makefile b/fan/Makefile deleted file mode 100644 index 35a91c7..0000000 --- a/fan/Makefile +++ /dev/null @@ -1,35 +0,0 @@ -CC=gcc -CFLAGS=-Wall -Wextra -std=c99 -g -LIBS=Linux_Fan Linux_FanSensor Linux_FanAssociatedSensor -LIBRARIES=$(foreach l,$(LIBS),cmpi$(l)Provider) -LIBRNS=$(foreach l,$(LIBRARIES),lib$(l).so) -DESTLIBDIR=$(shell [ `uname -m` = "x86_64" ] && echo /usr/lib64/cmpi || echo /usr/lib/cmpi) -LINKS=$(foreach l,$(LIBRNS),$(DESTLIBDIR)/$(l)) - -providers: $(LIBRNS) - -libcmpiLinux_FanAssociatedSensorProvider.so: \ - cmpiLinux_FanAssociatedSensorProvider.o - $(CC) -shared -Wl -o $@ $^ -lcmpiOSBase_Common - -libcmpi%Provider.so: cmpi%Provider.o cmpi%.o \ - cmpiLinux_FanCommon.o Linux_Fan.o - $(CC) -shared -Wl -o $@ $^ -lcmpiOSBase_Common -lsensors - -%.o: %.c - $(CC) $(CFLAGS) -I/usr/include/cmpi -c -fPIC -o $@ $^ - -clean: - -rm *.o *.so - -sfcb: $(LINKS) - sfcbstage -r mof/Linux_Fan.reg mof/Linux_Fan.mof - sfcbrepos -f - -$(DESTLIBDIR)/%.so: %.so - ln -sf `pwd`/$? $(DESTLIBDIR) - -install: $(LIBRNS) - cp $^ $(DESTLIBDIR) - sfcbstage -r mof/Linux_Fan.reg mof/Linux_Fan.mof - sfcbrepos -f diff --git a/fan/README b/fan/README deleted file mode 100644 index bf226a5..0000000 --- a/fan/README +++ /dev/null @@ -1,42 +0,0 @@ -******************************************************************************* - * Description -******************************************************************************* -CIM Linux_Fan providers for sfcb. Specific for linux, because of usage of -lm_sensors library for hadware monitoring of fans. It uses CMPI, so -it should be usable under any broker supporting this interface. - -There are three providers provided according to CIM model: - * Linux_Fan - - Provides instance for every fan founded by lm_sensors with basic - information. - * Linux_FanSensor - - Associated sensor for each instance of Linux_Fan. - - Value of fan speed can be obtained from property CurrentReading. - * Linux_FanAssociatedSensor - - Provides association of instances of above 2 providers. - -******************************************************************************* - * Build Dependencies -******************************************************************************* - * lm_sensors - installed and configured - * lm_sensors-libs - * lm_sensors-devel - * sblim-cmpi-devel - * sblim-cmpi-base - * sblim-cmpi-base-devel (for library cmpiOSBase_Common) - -******************************************************************************* - * Build and installation (for sfcb) -******************************************************************************* -steps: - * make - * make install - -alternatively: - * make - * install *.so libraries to your cmpi libdir - * sfcbstage -r mof/Linux_Fan.reg mof/Linux_Fan.mof - * sfcbrepos -f - -and restart broker: - systemctl restart sfcb.service diff --git a/fan/cmpiLinux_Fan.c b/fan/cmpiLinux_Fan.c deleted file mode 100644 index 8088a70..0000000 --- a/fan/cmpiLinux_Fan.c +++ /dev/null @@ -1,128 +0,0 @@ -/* This file is part of cmpiLinux_FanProvider. - * - * cmpiLinux_FanProvider 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 3 of the License, or - * (at your option) any later version. - * - * cmpiLinux_FanProvider 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 cmpiLinux_FanProvider. If not, see - * . - */ -#ifndef _XOPEN_SOURCE - //this is for strdup - #define _XOPEN_SOURCE 500 -#endif -#include -#include -#include -#include -#include -#include -#include - -#include "cmpiLinux_Fan.h" - -static CMPIArray * _get_AccessibleFeatures( - CMPIBroker const *_broker, - CMPIStatus *rc, - struct cim_fan const *sptr) -{ - int index = 0; - uint16_t value = 1; - unsigned int i = 1; - - CMPIArray *res = CMNewArray(_broker, 8, CMPI_uint16, rc); - if (!res) { - CMSetStatusWithChars(_broker, rc, CMPI_RC_ERR_FAILED, - "CMNewArray(_broker, 8, CMPI_uint16, rc)"); - _OSBASE_TRACE(2, ("--- _get_AccessibleFeatures failed: %s", - CMGetCharPtr(rc->msg))); - }else { - while (i <= CIM_FAN_AF_FEATURE_MAX) { - if (i & sptr->accessible_features) { - CMSetArrayElementAt(res, index++, (CMPIValue*)(&value), - CMPI_uint16); - } - ++value; - i = i << 1; - } - } - return res; -} - -CMPIObjectPath * _makePath_Fan( - CMPIBroker const *_broker, - CMPIContext const *ctx, - CMPIObjectPath const *cop, - struct cim_fan *sptr, - CMPIStatus *rc) -{ - return _makePath_FanCommon(_ClassName, _broker, ctx, cop, sptr, rc); -} - -CMPIInstance * _makeInst_Fan( - CMPIBroker const *_broker, - CMPIContext const *ctx, - CMPIObjectPath const *cop, - char const **properties, - struct cim_fan *sptr, - CMPIStatus *rc) -{ - CMPIObjectPath *op; - CMPIInstance *ci; - CMPIValue val; - - _OSBASE_TRACE(2, ("--- _makeInst_Fan() called")); - if (!(ci = _makeInst_FanCommon(_ClassName, _broker, ctx, cop, properties, - sptr, rc, &op))) { - return NULL; - } - - // CoolingDevice - val.boolean = true; - CMSetProperty(ci, "ActiveCooling", &val, CMPI_boolean); - - // CIM_Fan - // Linux_Fan - val.array = _get_AccessibleFeatures(_broker, rc, sptr); - if (!rc->rc) { - CMSetProperty(ci, "AccessibleFeatures", &val, CMPI_uint16A); - } - if (!rc->rc && sptr->accessible_features & CIM_FAN_AF_MIN_SPEED) { - val.uint64 = (uint64_t) sptr->min_speed; - CMSetProperty(ci, "MinSpeed", &val, CMPI_uint64); - } - if (!rc->rc && sptr->accessible_features & CIM_FAN_AF_MAX_SPEED) { - val.uint64 = (uint64_t) sptr->max_speed; - CMSetProperty(ci, "MaxSpeed", &val, CMPI_uint64); - } - if (!rc->rc && sptr->accessible_features & CIM_FAN_AF_DIV) { - CMSetProperty(ci, "Divisor", &sptr->divisor, CMPI_uint32); - } - if (!rc->rc && sptr->accessible_features & CIM_FAN_AF_PULSES) { - CMSetProperty(ci, "Pulses", &sptr->pulses, CMPI_uint32); - } - if (!rc->rc && sptr->accessible_features & CIM_FAN_AF_BEEP) { - val.boolean = sptr->beep; - CMSetProperty(ci, "Beep", &val, CMPI_boolean); - } - if (!rc->rc && sptr->accessible_features & CIM_FAN_AF_ALARM) { - CMSetProperty(ci, "Alarm", &sptr->alarm, CMPI_boolean); - } - if (!rc->rc && sptr->accessible_features & CIM_FAN_AF_ALARM_MIN) { - CMSetProperty(ci, "MinAlarm", &sptr->alarm_min, CMPI_boolean); - } - if (!rc->rc && sptr->accessible_features & CIM_FAN_AF_ALARM_MAX) { - CMSetProperty(ci, "MaxAlarm", &sptr->alarm_max, CMPI_boolean); - } - - _OSBASE_TRACE(2, ("--- _makeInst_Fan() exited")); - return ci; -} - diff --git a/fan/cmpiLinux_Fan.h b/fan/cmpiLinux_Fan.h deleted file mode 100644 index 5fc7227..0000000 --- a/fan/cmpiLinux_Fan.h +++ /dev/null @@ -1,40 +0,0 @@ -/* This file is part of cmpiLinux_FanProvider. - * - * cmpiLinux_FanProvider 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 3 of the License, or - * (at your option) any later version. - * - * cmpiLinux_FanProvider 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 cmpiLinux_FanProvider. If not, see - * . - */ -#ifndef CMPILINUX_FAN_H_ -#define CMPILINUX_FAN_H_ - -#include "cmpiLinux_FanCommon.h" - -static char const *_ClassName = "Linux_Fan"; - -CMPIObjectPath * _makePath_Fan( - CMPIBroker const *_broker, - CMPIContext const *ctx, - CMPIObjectPath const *cop, - struct cim_fan *sptr, - CMPIStatus *rc); - -CMPIInstance * _makeInst_Fan( - CMPIBroker const *_broker, - CMPIContext const *ctx, - CMPIObjectPath const *cop, - char const **properties, - struct cim_fan *sptr, - CMPIStatus *rc); - -#endif /* ----- CMPILINUX_FAN_H_ ----- */ - diff --git a/fan/cmpiLinux_FanAssociatedSensorProvider.c b/fan/cmpiLinux_FanAssociatedSensorProvider.c deleted file mode 100644 index 61e7dfb..0000000 --- a/fan/cmpiLinux_FanAssociatedSensorProvider.c +++ /dev/null @@ -1,561 +0,0 @@ -/* This file is part of cmpiLinux_FanProvider. - * - * cmpiLinux_FanProvider 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 3 of the License, or - * (at your option) any later version. - * - * cmpiLinux_FanProvider 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 cmpiLinux_FanProvider. If not, see - * . - */ -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -static char const * _ClassName = "Linux_FanAssociatedSensor"; -static char const * _RefLeft = "Antecedent"; -static char const * _RefRight = "Dependent"; -static char const * _RefLeftClass = "Linux_FanSensor"; -static char const * _RefRightClass = "Linux_Fan"; - -#define UNUSED(x) ((void) (x)) -static const CMPIBroker * _broker; -#ifdef CMPI_VER_100 - #define Linux_FanAssociatedSensorProviderSetInstance \ - Linux_FanAssociatedSensorProviderModifyInstance -#endif - -/* ---------------------------------------------------------------------------*/ -/* Instance Provider Interface */ -/* ---------------------------------------------------------------------------*/ - -CMPIStatus Linux_FanAssociatedSensorProviderCleanup( - CMPIInstanceMI * mi, - const CMPIContext * ctx, - CMPIBoolean terminate) -{ - UNUSED(mi); UNUSED(ctx); UNUSED(terminate); - _OSBASE_TRACE(1,("--- %s CMPI Cleanup() called",_ClassName)); - _OSBASE_TRACE(1,("--- %s CMPI Cleanup() exited",_ClassName)); - CMReturn(CMPI_RC_OK); -} - -CMPIStatus Linux_FanAssociatedSensorProviderEnumInstanceNames( - CMPIInstanceMI * mi, - const CMPIContext * ctx, - const CMPIResult * rslt, - const CMPIObjectPath * ref) -{ - UNUSED(mi); - CMPIStatus rc = {CMPI_RC_OK, NULL}; - int refrc = 0; - - _OSBASE_TRACE(1,("--- %s CMPI EnumInstanceNames() called",_ClassName)); - - refrc = _assoc_create_inst_1toN( _broker,ctx,rslt,ref, - _ClassName,_RefLeftClass,_RefRightClass, - _RefLeft,_RefRight, - 1,0,&rc); - if( refrc != 0 ) { - if( rc.msg != NULL ) { - _OSBASE_TRACE(1, ("--- %s CMPI EnumInstanceNames() failed : %s", - _ClassName,CMGetCharPtr(rc.msg))); - } - else { - _OSBASE_TRACE(1,("--- %s CMPI EnumInstanceNames() failed",_ClassName)); - } - return rc; - } - - CMReturnDone( rslt ); - _OSBASE_TRACE(1,("--- %s CMPI EnumInstanceNames() exited",_ClassName)); - return rc; -} - -CMPIStatus Linux_FanAssociatedSensorProviderEnumInstances( - CMPIInstanceMI * mi, - const CMPIContext * ctx, - const CMPIResult * rslt, - const CMPIObjectPath * ref, - const char ** properties) -{ - UNUSED(mi); UNUSED(properties); - CMPIStatus rc = {CMPI_RC_OK, NULL}; - int refrc = 0; - - _OSBASE_TRACE(1,("--- %s CMPI EnumInstances() called",_ClassName)); - - refrc = _assoc_create_inst_1toN( _broker,ctx,rslt,ref, - _ClassName,_RefLeftClass,_RefRightClass, - _RefLeft,_RefRight, - 1,1,&rc); - if( refrc != 0 ) { - if( rc.msg != NULL ) { - _OSBASE_TRACE(1, ("--- %s CMPI EnumInstances() failed : %s", - _ClassName,CMGetCharPtr(rc.msg))); - } - else { - _OSBASE_TRACE(1,("--- %s CMPI EnumInstances() failed",_ClassName)); - } - return rc; - } - - CMReturnDone( rslt ); - _OSBASE_TRACE(1,("--- %s CMPI EnumInstances() exited",_ClassName)); - return rc; -} - -CMPIStatus Linux_FanAssociatedSensorProviderGetInstance( - CMPIInstanceMI * mi, - const CMPIContext * ctx, - const CMPIResult * rslt, - const CMPIObjectPath * cop, - const char ** properties) -{ - UNUSED(mi); UNUSED(properties); - const CMPIInstance * ci = NULL; - CMPIStatus rc = {CMPI_RC_OK, NULL}; - - _OSBASE_TRACE(1,("--- %s CMPI GetInstance() called",_ClassName)); - - ci = _assoc_get_inst( _broker,ctx,cop,_ClassName,_RefLeft,_RefRight,&rc); - - if( ci == NULL ) { - if( rc.msg != NULL ) { - _OSBASE_TRACE(1, ("--- %s CMPI GetInstance() failed : %s", - _ClassName,CMGetCharPtr(rc.msg))); - } - else { - _OSBASE_TRACE(1,("--- %s CMPI GetInstance() failed",_ClassName)); - } - return rc; - } - - CMReturnInstance( rslt, ci ); - CMReturnDone(rslt); - _OSBASE_TRACE(1,("--- %s CMPI GetInstance() exited",_ClassName)); - return rc; -} - -CMPIStatus Linux_FanAssociatedSensorProviderCreateInstance( - CMPIInstanceMI * mi, - const CMPIContext * ctx, - const CMPIResult * rslt, - const CMPIObjectPath * cop, - const CMPIInstance * ci) -{ - UNUSED(mi); UNUSED(ctx); UNUSED(rslt); UNUSED(cop); UNUSED(ci); - CMPIStatus rc = {CMPI_RC_OK, NULL}; - - _OSBASE_TRACE(1,("--- %s CMPI CreateInstance() called",_ClassName)); - - CMSetStatusWithChars( _broker, &rc, - CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED" ); - - _OSBASE_TRACE(1,("--- %s CMPI CreateInstance() exited",_ClassName)); - return rc; -} - -CMPIStatus Linux_FanAssociatedSensorProviderSetInstance( - CMPIInstanceMI * mi, - const CMPIContext * ctx, - const CMPIResult * rslt, - const CMPIObjectPath * cop, - const CMPIInstance * ci, - const char ** properties) -{ - UNUSED(mi); UNUSED(ctx); UNUSED(rslt); UNUSED(cop); UNUSED(ci); - UNUSED(properties); - CMPIStatus rc = {CMPI_RC_OK, NULL}; - - _OSBASE_TRACE(1,("--- %s CMPI SetInstance() called",_ClassName)); - - CMSetStatusWithChars( _broker, &rc, - CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED" ); - - _OSBASE_TRACE(1,("--- %s CMPI SetInstance() exited",_ClassName)); - return rc; -} - -CMPIStatus Linux_FanAssociatedSensorProviderDeleteInstance( - CMPIInstanceMI * mi, - const CMPIContext * ctx, - const CMPIResult * rslt, - const CMPIObjectPath * cop) -{ - UNUSED(mi); UNUSED(ctx); UNUSED(rslt); UNUSED(cop); - CMPIStatus rc = {CMPI_RC_OK, NULL}; - - _OSBASE_TRACE(1,("--- %s CMPI DeleteInstance() called",_ClassName)); - - CMSetStatusWithChars( _broker, &rc, - CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED" ); - - _OSBASE_TRACE(1,("--- %s CMPI DeleteInstance() exited",_ClassName)); - return rc; -} - -CMPIStatus Linux_FanAssociatedSensorProviderExecQuery( - CMPIInstanceMI * mi, - const CMPIContext * ctx, - const CMPIResult * rslt, - const CMPIObjectPath * ref, - const char * lang, - const char * query) -{ - UNUSED(mi); UNUSED(ctx); UNUSED(rslt); UNUSED(ref); UNUSED(lang); - UNUSED(query); - CMPIStatus rc = {CMPI_RC_OK, NULL}; - - _OSBASE_TRACE(1,("--- %s CMPI ExecQuery() called",_ClassName)); - - CMSetStatusWithChars( _broker, &rc, - CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED" ); - - _OSBASE_TRACE(1,("--- %s CMPI ExecQuery() exited",_ClassName)); - return rc; -} - - -/* ---------------------------------------------------------------------------*/ -/* Associator Provider Interface */ -/* ---------------------------------------------------------------------------*/ - - -CMPIStatus Linux_FanAssociatedSensorProviderAssociationCleanup( - CMPIAssociationMI * mi, - const CMPIContext * ctx, - CMPIBoolean terminate) -{ - UNUSED(mi); UNUSED(ctx); UNUSED(terminate); - _OSBASE_TRACE(1,("--- %s CMPI AssociationCleanup() called",_ClassName)); - _OSBASE_TRACE(1,("--- %s CMPI AssociationCleanup() exited",_ClassName)); - CMReturn(CMPI_RC_OK); -} - -/* - * The intention of associations is to show the relations between different - * classes and their instances. Therefore an association has two properties. - * Each one representing a reference to a certain instance of the specified - * class. We can say, that an association has a left and the right "end". - * - * Linux_RunningOS : - * < role > -> < class > - * Antecedent -> Linux_Fan - * Dependent -> Linux_FanSensor - * - */ - -/* - * general API information - * - * cop : - * Specifies the CMPIObjectPath to the CMPIInstance of the known end of - * the association. Its absolutelly necessary to define this anchor point, - * from where the evaluation of the association starts. - * assocPath : - * If not NULL, it contains the name of the association the caller is - * looking for. The provider should only return values, when the assocPath - * contains the name(s) of the association(s) he is responsible for ! - * role : - * The caller can specify that the source instance ( cop ) has to play - * a certain in the association. The is specified by the - * association definition (see above). That means, role has to contain - * the same value as the the source instance plays in this assoc. - * If this requirement is not true, the provider returns nothing. - */ - -/* - * specification of associators() and associatorNames() - * - * These methods return CMPIInstance ( in the case of associators() ) or - * CMPIObjectPath ( in the case of associatorNames() ) object(s) of the - * opposite end of the association. - * - * resultRole : - * The caller can specify that the target instance(s) has/have to play - * a certain in the association. The is specified by the - * association definition (see above). That means, resultRole has to - * contain the same value as the the target instance(s) plays - * in this assoc. If this requirement is not true, the provider returns - * nothing. - * resultClass : - * The caller can specify that the target instance(s) has/have to be - * instances of a certain . The is specified by the - * association definition (see above). That means, resultClass has to - * contain the same value as the of the target instance(s). - * If this requirement is not true, the provider returns nothing. - */ - -CMPIStatus Linux_FanAssociatedSensorProviderAssociators( - CMPIAssociationMI * mi, - const CMPIContext * ctx, - const CMPIResult * rslt, - const CMPIObjectPath * cop, - const char * assocClass, - const char * resultClass, - const char * role, - const char * resultRole, - const char ** propertyList) -{ - UNUSED(mi); UNUSED(propertyList); - CMPIStatus rc = {CMPI_RC_OK, NULL}; - CMPIObjectPath * op = NULL; - int refrc = 0; - - _OSBASE_TRACE(1,("--- %s CMPI Associators() called",_ClassName)); - - if( assocClass ) { - op = CMNewObjectPath( _broker, CMGetCharPtr(CMGetNameSpace(cop,&rc)), - _ClassName, &rc ); - if( op==NULL ) { - CMSetStatusWithChars( _broker, &rc, - CMPI_RC_ERR_FAILED, "Create CMPIObjectPath failed." ); - _OSBASE_TRACE(2, - ("--- %s CMPI Associators() failed : %s",CMGetCharPtr(rc.msg))); - return rc; - } - } - - if ( (assocClass == NULL) - || (CMClassPathIsA(_broker,op,assocClass,&rc) == 1)) - { - - if( _assoc_check_parameter_const( _broker,cop,_RefLeft,_RefRight, - _RefLeftClass,_RefRightClass, - resultClass,role,resultRole, - &rc ) == 0 ) { goto exit; } - - refrc = _assoc_create_refs_1toN(_broker, ctx, rslt, cop, - _ClassName,_RefLeftClass,_RefRightClass, - _RefLeft,_RefRight, - 1, 1, &rc); - if( refrc != 0 ) { - if( rc.msg != NULL ) { - _OSBASE_TRACE(1, ("--- %s CMPI Associators() failed : %s", - _ClassName,CMGetCharPtr(rc.msg))); - } - else { - _OSBASE_TRACE(1,("--- %s CMPI Associators() failed",_ClassName)); - } - return rc; - } - } - - exit: - CMReturnDone( rslt ); - _OSBASE_TRACE(1,("--- %s CMPI Associators() exited",_ClassName)); - CMReturn(CMPI_RC_OK); -} - -CMPIStatus Linux_FanAssociatedSensorProviderAssociatorNames( - CMPIAssociationMI * mi, - const CMPIContext * ctx, - const CMPIResult * rslt, - const CMPIObjectPath * cop, - const char * assocClass, - const char * resultClass, - const char * role, - const char * resultRole) -{ - UNUSED(mi); - CMPIStatus rc = {CMPI_RC_OK, NULL}; - CMPIObjectPath * op = NULL; - int refrc = 0; - - _OSBASE_TRACE(1,("--- %s CMPI AssociatorNames() called",_ClassName)); - - if( assocClass ) { - op = CMNewObjectPath( _broker, CMGetCharPtr(CMGetNameSpace(cop,&rc)), - _ClassName, &rc ); - if( op==NULL ) { - CMSetStatusWithChars( _broker, &rc, - CMPI_RC_ERR_FAILED, "Create CMPIObjectPath failed." ); - _OSBASE_TRACE(2, ("--- %s CMPI AssociatorNames() failed : %s", - CMGetCharPtr(rc.msg))); - return rc; - } - } - - if( ( assocClass==NULL ) || ( CMClassPathIsA(_broker,op,assocClass,&rc) == 1 ) ) { - - if( _assoc_check_parameter_const( _broker,cop,_RefLeft,_RefRight, - _RefLeftClass,_RefRightClass, - resultClass,role,resultRole, - &rc ) == 0 ) { goto exit; } - - refrc = _assoc_create_refs_1toN(_broker, ctx, rslt, cop, - _ClassName,_RefLeftClass,_RefRightClass, - _RefLeft,_RefRight, - 0, 1, &rc); - if( refrc != 0 ) { - if( rc.msg != NULL ) { - _OSBASE_TRACE(1, ("--- %s CMPI AssociatorNames() failed : %s", - _ClassName,CMGetCharPtr(rc.msg))); - } - else { - _OSBASE_TRACE(1,("--- %s CMPI AssociatorNames() failed",_ClassName)); - } - return rc; - } - } - - exit: - CMReturnDone( rslt ); - _OSBASE_TRACE(1,("--- %s CMPI AssociatorNames() exited",_ClassName)); - CMReturn(CMPI_RC_OK); -} - - -/* - * specification of references() and referenceNames() - * - * These methods return CMPIInstance ( in the case of references() ) or - * CMPIObjectPath ( in the case of referenceNames() ) object(s) of th - * association itself. - */ - -CMPIStatus Linux_FanAssociatedSensorProviderReferences( - CMPIAssociationMI * mi, - const CMPIContext * ctx, - const CMPIResult * rslt, - const CMPIObjectPath * cop, - const char * assocClass, - const char * role, - const char ** propertyList) -{ - UNUSED(mi); UNUSED(propertyList); - CMPIStatus rc = {CMPI_RC_OK, NULL}; - CMPIObjectPath * op = NULL; - int refrc = 0; - - _OSBASE_TRACE(1,("--- %s CMPI References() called",_ClassName)); - - if( assocClass ) { - op = CMNewObjectPath( _broker, CMGetCharPtr(CMGetNameSpace(cop,&rc)), - _ClassName, &rc ); - if( op==NULL ) { - CMSetStatusWithChars( _broker, &rc, - CMPI_RC_ERR_FAILED, "Create CMPIObjectPath failed." ); - _OSBASE_TRACE(2,("--- %s CMPI References() failed : %s",CMGetCharPtr(rc.msg))); - return rc; - } - } - - if( ( assocClass==NULL ) || ( CMClassPathIsA(_broker,op,assocClass,&rc) == 1 ) ) { - - if( _assoc_check_parameter_const( _broker,cop,_RefLeft,_RefRight, - _RefLeftClass,_RefRightClass, - NULL,role,NULL, - &rc ) == 0 ) { goto exit; } - - refrc = _assoc_create_refs_1toN(_broker, ctx, rslt, cop, - _ClassName,_RefLeftClass,_RefRightClass, - _RefLeft,_RefRight, - 1, 0, &rc); - if( refrc != 0 ) { - if( rc.msg != NULL ) { - _OSBASE_TRACE(1, ("--- %s CMPI References() failed : %s", - _ClassName,CMGetCharPtr(rc.msg))); - } - else { - _OSBASE_TRACE(1,("--- %s CMPI References() failed",_ClassName)); - } - return rc; - } - } - - exit: - CMReturnDone( rslt ); - _OSBASE_TRACE(1,("--- %s CMPI References() exited",_ClassName)); - CMReturn(CMPI_RC_OK); -} - -CMPIStatus Linux_FanAssociatedSensorProviderReferenceNames( - CMPIAssociationMI * mi, - const CMPIContext * ctx, - const CMPIResult * rslt, - const CMPIObjectPath * cop, - const char * assocClass, - const char * role) -{ - UNUSED(mi); - CMPIStatus rc = {CMPI_RC_OK, NULL}; - CMPIObjectPath * op = NULL; - int refrc = 0; - - _OSBASE_TRACE(1,("--- %s CMPI ReferenceNames() called",_ClassName)); - - if( assocClass ) { - op = CMNewObjectPath( _broker, CMGetCharPtr(CMGetNameSpace(cop,&rc)), - _ClassName, &rc ); - if( op==NULL ) { - CMSetStatusWithChars( _broker, &rc, - CMPI_RC_ERR_FAILED, "Create CMPIObjectPath failed." ); - _OSBASE_TRACE(2,("--- %s CMPI ReferenceNames() failed : %s",CMGetCharPtr(rc.msg))); - return rc; - } - } - - if( ( assocClass==NULL ) || ( CMClassPathIsA(_broker,op,assocClass,&rc) == 1 ) ) { - - if( _assoc_check_parameter_const( _broker,cop,_RefLeft,_RefRight, - _RefLeftClass,_RefRightClass, - NULL,role,NULL, - &rc ) == 0 ) { goto exit; } - - refrc = _assoc_create_refs_1toN(_broker, ctx, rslt, cop, - _ClassName,_RefLeftClass,_RefRightClass, - _RefLeft,_RefRight, - 0, 0, &rc); - if( refrc != 0 ) { - if( rc.msg != NULL ) { - _OSBASE_TRACE(1,("--- %s CMPI ReferenceNames() failed : %s",_ClassName,CMGetCharPtr(rc.msg))); - } - else { - _OSBASE_TRACE(1,("--- %s CMPI ReferenceNames() failed",_ClassName)); - } - return rc; - } - } - - exit: - CMReturnDone( rslt ); - _OSBASE_TRACE(1,("--- %s CMPI ReferenceNames() exited",_ClassName)); - CMReturn(CMPI_RC_OK); -} - -/* ---------------------------------------------------------------------------*/ -/* Provider Factory */ -/* ---------------------------------------------------------------------------*/ -CMInstanceMIStub( Linux_FanAssociatedSensorProvider, - Linux_FanAssociatedSensorProvider, - _broker, - CMNoHook); - -CMAssociationMIStub( Linux_FanAssociatedSensorProvider, - Linux_FanAssociatedSensorProvider, - _broker, - CMNoHook); - -/* ---------------------------------------------------------------------------*/ -/* end of cmpiLinux_FanAssociatedSensorProvider */ -/* ---------------------------------------------------------------------------*/ - diff --git a/fan/cmpiLinux_FanCommon.c b/fan/cmpiLinux_FanCommon.c deleted file mode 100644 index 68aca46..0000000 --- a/fan/cmpiLinux_FanCommon.c +++ /dev/null @@ -1,252 +0,0 @@ -/* This file is part of cmpiLinux_FanProvider. - * - * cmpiLinux_FanProvider 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 3 of the License, or - * (at your option) any later version. - * - * cmpiLinux_FanProvider 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 cmpiLinux_FanProvider. If not, see - * . - */ -#include -#include -#include -#include -#include -#include -#include - -#include "cmpiLinux_FanCommon.h" - -#define UNUSED(x) ((void) (x)) - -static CMPIArray * _get_OperationalStatus( - CMPIBroker const *_broker, - CMPIStatus *rc, - struct cim_fan const *sptr) -{ - CMPIArray *res = CMNewArray(_broker, 2, CMPI_uint16, rc); - unsigned short val; - if (!res) { - CMSetStatusWithChars(_broker, rc, CMPI_RC_ERR_FAILED, - "CMNewArray(_broker, 2, CMPI_uint16, rc)"); - _OSBASE_TRACE(2, ("--- _get_OperationalStatus failed: %s", - CMGetCharPtr(rc->msg))); - }else { - val = sptr->fault ? 3:1; // Error : OK - *rc = CMSetArrayElementAt(res, 0, (CMPIValue*)(&val), CMPI_uint16); - if (sptr->alarm || sptr->alarm_min || sptr->alarm_max) { - val = 4; // Stressed - *rc = CMSetArrayElementAt(res, 1, (CMPIValue*)(&val), CMPI_uint16); - } - } - return res; -} - -static CMPIArray * _get_StatusDescriptions( - CMPIBroker const *_broker, - CMPIStatus *rc, - struct cim_fan const *sptr) -{ - CMPIArray *res = CMNewArray(_broker, 2, CMPI_string, rc); - if (!res) { - CMSetStatusWithChars(_broker, rc, CMPI_RC_ERR_FAILED, - "CMNewArray(_broker, 2, CMPI_string, rc)"); - _OSBASE_TRACE(2, ("--- _get_StatusDescriptions failed: %s", - CMGetCharPtr(rc->msg))); - }else { - *rc = CMSetArrayElementAt(res, 0, sptr->fault ? - "Chip indicates, that fan is in fault state." - " Possible causes are open diodes, unconnected fan etc." - " Thus the measurement for this channel should not be trusted." - : "Fan seems to be functioning correctly.", CMPI_chars); - if (!rc->rc && (sptr->alarm || sptr->alarm_min || sptr->alarm_max)) { - char buf[100]; - snprintf(buf, 100, "These alarm flags are set by the fan's chip:" - " alarm=%s, min_alarm=%s, max_alarm=%s", - sptr->alarm ? "1":"0", - sptr->alarm_min ? "1":"0", - sptr->alarm_max ? "1":"0"); - CMSetArrayElementAt(res, 1, buf, CMPI_chars); - } - } - return res; -} - -static CMPIArray * _get_OtherIdentifyingInfo( - CMPIBroker const *_broker, - CMPIStatus *rc, - struct cim_fan const *sptr) -{ - CMPIArray *res = CMNewArray(_broker, 2, CMPI_string, rc); - if (!res) { - CMSetStatusWithChars(_broker, rc, CMPI_RC_ERR_FAILED, - "CMNewArray(_broker, 2, CMPI_string, rc)"); - _OSBASE_TRACE(2, ("--- _get_OtherIdentifyingInfo failed: %s", - CMGetCharPtr(rc->msg))); - }else { - CMSetArrayElementAt(res, 0, sptr->chip_name, CMPI_chars); - CMSetArrayElementAt(res, 1, sptr->sys_path, CMPI_chars); - } - return res; -} - -static CMPIArray * _get_IdentifyingDescriptions( - CMPIBroker const *_broker, - CMPIStatus *rc) -{ - CMPIArray *res = CMNewArray(_broker, 2, CMPI_string, rc); - if (!res) { - CMSetStatusWithChars(_broker, rc, CMPI_RC_ERR_FAILED, - "CMNewArray(_broker, 2, CMPI_string, rc)"); - _OSBASE_TRACE(2, ("--- _get_IdentifyingDescriptions failed: %s", - CMGetCharPtr(rc->msg))); - }else { - CMSetArrayElementAt(res, 0, - "ChipName - name of fan's chip.", CMPI_chars); - CMSetArrayElementAt(res, 1, - "SysPath - system path of fan's chip.", CMPI_chars); - } - return res; -} - -CMPIObjectPath * _makePath_FanCommon( - char const *class_name, - CMPIBroker const *_broker, - CMPIContext const *ctx, - CMPIObjectPath const *cop, - struct cim_fan *sptr, - CMPIStatus *rc) -{ - UNUSED(ctx); - - CMPIObjectPath * op = NULL; - - _OSBASE_TRACE(2,("--- _makePath_FanCommon() called")); - - op = CMNewObjectPath(_broker, CMGetCharPtr(CMGetNameSpace(cop, rc)), - class_name, rc); - if (CMIsNullObject(op)) { - CMSetStatusWithChars(_broker, rc, CMPI_RC_ERR_FAILED, - "Create CMPIObjectPath failed"); - _OSBASE_TRACE(2, ("--- _makePath_FanCommon() failed : %s", - CMGetCharPtr(rc->msg))); - }else { - CMAddKey(op, "CreationClassName", class_name, CMPI_chars); - CMAddKey(op, "SystemCreationClassName", CSCreationClassName, - CMPI_chars); - CMAddKey(op, "SystemName", get_system_name(), CMPI_chars); - CMAddKey(op, "DeviceID", sptr->device_id, CMPI_chars); - } - _OSBASE_TRACE(2, ("--- _makePath_FanCommon() exited")); - return op; -} - -CMPIInstance * _makeInst_FanCommon( - char const *class_name, - CMPIBroker const *_broker, - CMPIContext const *ctx, - CMPIObjectPath const *cop, - char const **properties, - struct cim_fan *sptr, - CMPIStatus *rc, - CMPIObjectPath **op) -{ - UNUSED(ctx); - - CMPIInstance *ci = NULL; - CMPIValue val; - uint16_t uint16; - char const *keys[] = { - "CreationClassName", - "SystemCreationClassName", - "SystemName", - "DeviceID", - NULL - }; - char buf[200]; - - _OSBASE_TRACE(2, ("--- _makeInst_FanCommon() called")); - - /* the sblim-cmpi-base package offers some tool methods to get common - * system data - */ - if( !get_system_name() ) { - CMSetStatusWithChars( _broker, rc, - CMPI_RC_ERR_FAILED, "no host name found" ); - _OSBASE_TRACE(2, ("--- _makeInst_FanCommon() failed : %s", - CMGetCharPtr(rc->msg))); - return NULL; - } - - if( !get_os_name() ) { - CMSetStatusWithChars( _broker, rc, - CMPI_RC_ERR_FAILED, "no OS name found" ); - _OSBASE_TRACE(2, ("--- _makeInst_FanCommon() failed : %s", - CMGetCharPtr(rc->msg))); - return NULL; - } - - *op = CMNewObjectPath(_broker, CMGetCharPtr(CMGetNameSpace(cop, rc)), - class_name, rc); - if (CMIsNullObject(*op)) { - CMSetStatusWithChars(_broker, rc, - CMPI_RC_ERR_FAILED, "Create CMPIObjectPath failed."); - _OSBASE_TRACE(2, ("--- _makeInst_FanCommon() failed : %s", - CMGetCharPtr(rc->msg))); - return NULL; - } - ci = CMNewInstance(_broker, *op, rc); - if (CMIsNullObject(ci)) { - CMSetStatusWithChars(_broker, rc, - CMPI_RC_ERR_FAILED, "Create CMPIObjectPath failed."); - _OSBASE_TRACE(2, ("--- _makeInst_FanCommon() failed : %s", - CMGetCharPtr(rc->msg))); - return NULL; - } - CMSetPropertyFilter(ci, properties, keys); - - //* keys ****************************************************************** - CMSetProperty(ci, "CreationClassName", class_name, CMPI_chars); - CMSetProperty(ci, "SystemCreationClassName", CSCreationClassName, - CMPI_chars); - CMSetProperty(ci, "SystemName", get_system_name(), CMPI_chars); - CMSetProperty(ci, "DeviceID", sptr->device_id, CMPI_chars); - - // other properties ******************************************************* - // ManagedElement - CMSetProperty(ci, "Caption", "Computer's fan", CMPI_chars); - CMSetProperty(ci, "Description", "Computer's fan.", CMPI_chars); - snprintf(buf, 200, "Fan \"%s\" on chip \"%s\"", sptr->name, - sptr->chip_name); - CMSetProperty(ci, "ElementName", buf, CMPI_chars); - - // ManagedSystemElement - CMSetProperty(ci, "Name", sptr->name, CMPI_chars); - val.array = _get_OperationalStatus(_broker, rc, sptr); - CMSetProperty(ci, "OperationalStatus", &val, CMPI_uint16A); - val.array = _get_StatusDescriptions(_broker, rc, sptr); - CMSetProperty(ci, "StatusDescriptions", &val, CMPI_stringA); - uint16 = sptr->fault ? 20:5; // Major failure : OK - CMSetProperty(ci, "HealthState", &uint16, CMPI_uint16); - uint16 = sptr->fault ? 5:16; // Stopped : In Service - CMSetProperty(ci, "OperatingStatus", &uint16, CMPI_uint16); - uint16 = sptr->fault ? 3:1; // Error : OK - CMSetProperty(ci, "PrimaryStatus", &uint16, CMPI_uint16); - - // EnabledLogicalElement - val.array = _get_OtherIdentifyingInfo(_broker, rc, sptr); - CMSetProperty(ci, "OtherIdentifyingInfo", &val, CMPI_stringA); - val.array = _get_IdentifyingDescriptions(_broker, rc); - CMSetProperty(ci, "IdentifyingDescriptions", &val, CMPI_stringA); - - _OSBASE_TRACE(2, ("--- _makeInst_FanCommon() exited")); - return ci; -} - diff --git a/fan/cmpiLinux_FanCommon.h b/fan/cmpiLinux_FanCommon.h deleted file mode 100644 index 8134b3b..0000000 --- a/fan/cmpiLinux_FanCommon.h +++ /dev/null @@ -1,41 +0,0 @@ -/* This file is part of cmpiLinux_FanProvider. - * - * cmpiLinux_FanProvider 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 3 of the License, or - * (at your option) any later version. - * - * cmpiLinux_FanProvider 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 cmpiLinux_FanProvider. If not, see - * . - */ -#ifndef CMPILINUX_FANCOMMON_H_ -#define CMPILINUX_FANCOMMON_H_ - -#include -#include "Linux_Fan.h" - -CMPIObjectPath * _makePath_FanCommon( - char const *class_name, - CMPIBroker const *_broker, - CMPIContext const *ctx, - CMPIObjectPath const *cop, - struct cim_fan *sptr, - CMPIStatus *rc); - -CMPIInstance * _makeInst_FanCommon( - char const *class_name, - CMPIBroker const *_broker, - CMPIContext const *ctx, - CMPIObjectPath const *cop, - char const **properties, - struct cim_fan *sptr, - CMPIStatus *rc, - CMPIObjectPath **op); - -#endif /* ----- CMPILINUX_FANCOMMON_H_ ----- */ diff --git a/fan/cmpiLinux_FanProvider.c b/fan/cmpiLinux_FanProvider.c deleted file mode 100644 index 67a1a82..0000000 --- a/fan/cmpiLinux_FanProvider.c +++ /dev/null @@ -1,498 +0,0 @@ -/* This file is part of cmpiLinux_FanProvider. - * - * cmpiLinux_FanProvider 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 3 of the License, or - * (at your option) any later version. - * - * cmpiLinux_FanProvider 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 cmpiLinux_FanProvider. If not, see - * . - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "cmpiLinux_Fan.h" - -#define UNUSED(x) ((void) (x)) -static const CMPIBroker * _broker; - -#ifdef CMPI_VER_100 - #define Linux_FanProviderSetInstance Linux_FanProviderModifyInstance -#endif - -// utilities ****************************************************************** -static bool data_2_uint64_t(CMPIData const * data, uint64_t *res) { - if (data->state != CMPI_goodValue) return false; - switch (data->type) { - case CMPI_string: - errno = 0; - *res = strtoull(CMGetCharPtr(data->value.string), NULL, 10); - if (errno) return false; - break; - case CMPI_sint32: *res = (uint64_t) data->value.sint32; break; - case CMPI_uint32: *res = (uint64_t) data->value.uint32; break; - case CMPI_sint64: *res = (uint64_t) data->value.sint64; break; - default: return false; - } - return true; -} - -/* ---------------------------------------------------------------------------*/ -/* Instance Provider Interface */ -/* ---------------------------------------------------------------------------*/ - - -CMPIStatus Linux_FanProviderCleanup( CMPIInstanceMI * mi, - const CMPIContext * ctx, CMPIBoolean terminate) { - UNUSED(mi); UNUSED(ctx); UNUSED(terminate); - - _OSBASE_TRACE(1,("--- %s CMPI Cleanup() called",_ClassName)); - cleanup_linux_fan_module(); - _OSBASE_TRACE(1,("--- %s CMPI Cleanup() exited",_ClassName)); - CMReturn(CMPI_RC_OK); -} - -CMPIStatus Linux_FanProviderEnumInstanceNames( CMPIInstanceMI * mi, - const CMPIContext * ctx, - const CMPIResult * rslt, - const CMPIObjectPath * ref) { - UNUSED(mi); - - CMPIObjectPath * op = NULL; - CMPIStatus rc = {CMPI_RC_OK, NULL}; - struct fanlist * lptr = NULL; - struct fanlist * rm = NULL; - - _OSBASE_TRACE(1,("--- %s CMPI EnumInstanceNames() called",_ClassName)); - - if (enum_all_fans(&lptr) != 0 ) { - CMSetStatusWithChars( _broker, &rc, - CMPI_RC_ERR_FAILED, "Could not list get fan list." ); - _OSBASE_TRACE(1, ("--- %s CMPI EnumInstanceNames() failed : %s", - _ClassName,CMGetCharPtr(rc.msg))); - return rc; - } - - // iterate fan list - for (rm = lptr; lptr && rc.rc == CMPI_RC_OK ; lptr = lptr->next) { - // method call to create the CMPIInstance object - op = _makePath_Fan(_broker, ctx, ref, lptr->f, &rc); - if (op == NULL || rc.rc != CMPI_RC_OK) { - if (rc.msg != NULL) { - _OSBASE_TRACE(1, ("--- %s CMPI EnumInstanceNames() failed" - ": %s", _ClassName, CMGetCharPtr(rc.msg))); - } - CMSetStatusWithChars(_broker, &rc, CMPI_RC_ERR_FAILED, - "Transformation from internal structure to CIM" - " ObjectPath failed."); - if (rm) free_fanlist(rm); - _OSBASE_TRACE(1, ("--- %s CMPI EnumInstanceNames() failed" - ": %s", _ClassName, CMGetCharPtr(rc.msg))); - return rc; - }else { - CMReturnObjectPath(rslt, op); - } - } - if (rm) free_fanlist(rm); - - CMReturnDone(rslt); - _OSBASE_TRACE(1, ("--- %s CMPI EnumInstanceNames() exited", _ClassName)); - return rc; -} - -CMPIStatus Linux_FanProviderEnumInstances( CMPIInstanceMI * mi, - const CMPIContext * ctx, - const CMPIResult * rslt, - const CMPIObjectPath * ref, - const char ** properties) { - UNUSED(mi); - - CMPIInstance * ci = NULL; - CMPIStatus rc = {CMPI_RC_OK, NULL}; - struct fanlist * lptr = NULL; - struct fanlist * rm = NULL; - - _OSBASE_TRACE(1,("--- %s CMPI EnumInstances() called",_ClassName)); - - if (enum_all_fans(&lptr)) { - CMSetStatusWithChars(_broker, &rc, - CMPI_RC_ERR_FAILED, "Could not list fans."); - _OSBASE_TRACE(1, ("--- %s CMPI EnumInstances() failed : %s", - _ClassName,CMGetCharPtr(rc.msg))); - return rc; - } - - // iterate fan list - for (rm=lptr; lptr && rc.rc == CMPI_RC_OK; lptr = lptr->next) { - // method call to create the CMPIInstance object - ci = _makeInst_Fan(_broker, ctx, ref, properties, lptr->f, &rc); - if (ci == NULL || rc.rc != CMPI_RC_OK ) { - if (rc.msg != NULL ) { - _OSBASE_TRACE(1, ("--- %s CMPI EnumInstances() failed :" - " %s",_ClassName,CMGetCharPtr(rc.msg))); - } - CMSetStatusWithChars( _broker, &rc, - CMPI_RC_ERR_FAILED, "Transformation from internal" - " structure to CIM Instance failed."); - if (rm) free_fanlist(rm); - _OSBASE_TRACE(1, ("--- %s CMPI EnumInstances() failed :" - " %s", _ClassName,CMGetCharPtr(rc.msg))); - return rc; - }else { - CMReturnInstance(rslt, ci); - } - } - if (rm) free_fanlist(rm); - - CMReturnDone(rslt); - _OSBASE_TRACE(1, ("--- %s CMPI EnumInstances() exited", _ClassName)); - return rc; -} - -CMPIStatus Linux_FanProviderGetInstance( CMPIInstanceMI * mi, - const CMPIContext * ctx, - const CMPIResult * rslt, - const CMPIObjectPath * cop, - const char **properties) { - UNUSED(mi); - - CMPIInstance * ci = NULL; - CMPIStatus rc = {CMPI_RC_OK, NULL}; - struct cim_fan * sptr = NULL; - CMPIData data; - CMPIArray * other_identifying_info = NULL; - CMPIString * sys_path = NULL; - CMPIString * fan_name = NULL; - CMPIString * device_id = NULL; - cim_fan_error_t cmdrc; - - _OSBASE_TRACE(1,("--- %s CMPI GetInstance() called",_ClassName)); - - _check_system_key_value_pairs(_broker, cop, "SystemCreationClassName", - "SystemName", &rc); - if (rc.rc != CMPI_RC_OK) { - _OSBASE_TRACE(1, ("--- %s CMPI GetInstance() failed : %s", - _ClassName, CMGetCharPtr(rc.msg))); - return rc; - } - - data = CMGetKey(cop, "OtherIdentifyingInfo", &rc); - if ( !rc.rc - && data.type == CMPI_stringA - && (other_identifying_info = data.value.array) - && !rc.rc - && (CMGetArrayCount(other_identifying_info, &rc) > 1) - && !rc.rc) - { - data = CMGetArrayElementAt(other_identifying_info, 0, &rc); - if (!rc.rc) sys_path = data.value.string; - data = CMGetArrayElementAt(other_identifying_info, 1, &rc); - if (!rc.rc) fan_name = data.value.string; - } - device_id = CMGetKey(cop, "DeviceID", &rc).value.string; - if ((sys_path == NULL || fan_name == NULL) && (device_id == NULL)) { - CMSetStatusWithChars(_broker, &rc, - CMPI_RC_ERR_FAILED, "Could not get fan ID." ); - _OSBASE_TRACE(1, ("--- %s CMPI GetInstance() failed : %s", - _ClassName, CMGetCharPtr(rc.msg))); - return rc; - } - - if (sys_path && fan_name) { - cmdrc = get_fan_data(CMGetCharPtr(sys_path), CMGetCharPtr(fan_name), - &sptr); - } - if ((cmdrc || !sptr) && device_id) { - cmdrc = get_fan_data_by_id(CMGetCharPtr(device_id), &sptr); - } - if (cmdrc || !sptr) { - CMSetStatusWithChars(_broker, &rc, - CMPI_RC_ERR_NOT_FOUND, cim_fan_strerror(cmdrc)); - _OSBASE_TRACE(1, ("--- %s CMPI GetInstance() exited : %s", - _ClassName,CMGetCharPtr(rc.msg))); - return rc; - } - - ci = _makeInst_Fan(_broker, ctx, cop, properties, sptr, &rc); - if (sptr) free_fan(sptr); - - if (ci == NULL) { - if (rc.msg != NULL) { - _OSBASE_TRACE(1, ("--- %s CMPI GetInstance() failed : %s", - _ClassName, CMGetCharPtr(rc.msg))); - }else { - _OSBASE_TRACE(1, ("--- %s CMPI GetInstance() failed", _ClassName)); - } - return rc; - } - - CMReturnInstance(rslt, ci); - CMReturnDone(rslt); - _OSBASE_TRACE(1, ("--- %s CMPI GetInstance() exited", _ClassName)); - return rc; -} - -CMPIStatus Linux_FanProviderCreateInstance( CMPIInstanceMI * mi, - const CMPIContext * ctx, - const CMPIResult * rslt, - const CMPIObjectPath * cop, - const CMPIInstance * ci) { - UNUSED(mi); UNUSED(ctx); UNUSED(rslt); UNUSED(cop); UNUSED(ci); - - CMPIStatus rc = {CMPI_RC_OK, NULL}; - - _OSBASE_TRACE(1, ("--- %s CMPI CreateInstance() called", _ClassName)); - CMSetStatusWithChars(_broker, &rc, - CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED"); - _OSBASE_TRACE(1, ("--- %s CMPI CreateInstance() exited", _ClassName)); - return rc; -} - -CMPIStatus Linux_FanProviderSetInstance( CMPIInstanceMI * mi, - const CMPIContext * ctx, - const CMPIResult * rslt, - const CMPIObjectPath * cop, - const CMPIInstance * ci, - const char ** properties) { - UNUSED(mi); UNUSED(ctx); UNUSED(rslt); UNUSED(properties); - - CMPIStatus rc = {CMPI_RC_OK, NULL}; - CMPIData data; - char const * device_id = NULL; - struct cim_fan * sptr; - cim_fan_prop_value_t cfpv; - cim_fan_error_t cmdrc; - char const * tmp = NULL; - char buf[200]; - - _OSBASE_TRACE(1, ("--- %s CMPI SetInstance() called", _ClassName)); - - _check_system_key_value_pairs(_broker, cop, "SystemCreationClassName", - "SystemName", &rc); - if (rc.rc != CMPI_RC_OK) { - _OSBASE_TRACE(1, ("--- %s CMPI SetInstance() failed : %s", - _ClassName, CMGetCharPtr(rc.msg))); - return rc; - } - - data = CMGetKey(cop, "DeviceID", &rc); - if (data.value.string == NULL) { - CMSetStatusWithChars(_broker, &rc, - CMPI_RC_ERR_FAILED, "Could not get fan ID." ); - _OSBASE_TRACE(1, ("--- %s CMPI SetInstance() failed : %s", - _ClassName, CMGetCharPtr(rc.msg))); - } - device_id = CMGetCharPtr(data.value.string); - if (device_id) { - cmdrc = get_fan_data_by_id(device_id, &sptr); - } - if (cmdrc || !sptr) { - CMSetStatusWithChars(_broker, &rc, - CMPI_RC_ERR_NOT_FOUND, cim_fan_strerror(cmdrc)); - _OSBASE_TRACE(1, ("--- %s CMPI SetInstance() exited : %s", - _ClassName,CMGetCharPtr(rc.msg))); - return rc; - } - - data = CMGetProperty(ci, "MinSpeed", &rc); - if (!rc.rc && data.value.uint64 != (uint64_t) sptr->min_speed) { - tmp = "MinSpeed"; - cfpv.min_speed = data.value.uint64; - cmdrc = set_fan_prop_by_id(device_id, CIM_FAN_MIN_SPEED, &cfpv); - } - data = CMGetProperty(ci , "MaxSpeed", &rc); - if (!cmdrc && !rc.rc && data.value.uint64 != (uint64_t) sptr->max_speed) { - tmp = "MaxSpeed"; - cfpv.max_speed = data.value.uint64; - set_fan_prop_by_id(device_id, CIM_FAN_MAX_SPEED, &cfpv); - } - data = CMGetProperty(ci, "Divisor", &rc); - if (!cmdrc && !rc.rc && data.value.uint32 != sptr->divisor) { - tmp = "Divisor"; - cfpv.divisor = data.value.uint32; - set_fan_prop_by_id(device_id, CIM_FAN_DIV, &cfpv); - } - data = CMGetProperty(ci, "Pulses", &rc); - if (!cmdrc && !rc.rc && data.value.uint32 != sptr->pulses) { - tmp = "Pulses"; - cfpv.pulses = data.value.uint32; - set_fan_prop_by_id(device_id, CIM_FAN_PULSES, &cfpv); - } - data = CMGetProperty(ci, "Beep", &rc); - if (!cmdrc && !rc.rc && data.value.boolean != sptr->beep) { - tmp = "Beep"; - cfpv.beep = data.value.uint32; - set_fan_prop_by_id(device_id, CIM_FAN_BEEP, &cfpv); - } - - if (cmdrc) { - if (tmp && cmdrc == CIM_FAN_SEN_NO_ENTRY) { - snprintf(buf, 200, - "System interface for fan(name=\"%s\", chip=\"%s\") does not" - " provide a way to set \"%s\".", sptr->name, sptr->chip_name, - tmp); - CMSetStatusWithChars(_broker, &rc, - CMPI_RC_ERR_FAILED, buf); - }else { - CMSetStatusWithChars(_broker, &rc, - CMPI_RC_ERR_FAILED, cim_fan_strerror(cmdrc)) - } - _OSBASE_TRACE(2, ("--- %s CMPI SetInstance() exited : %s", - _ClassName, CMGetCharPtr(rc.msg))); - }else { - rc.rc = CMPI_RC_OK; - rc.msg = NULL; - } - - return rc; -} - -CMPIStatus Linux_FanProviderDeleteInstance( CMPIInstanceMI * mi, - const CMPIContext * ctx, - const CMPIResult * rslt, - const CMPIObjectPath * cop) { - UNUSED(mi); UNUSED(ctx); UNUSED(rslt); UNUSED(cop); - - CMPIStatus rc = {CMPI_RC_OK, NULL}; - - _OSBASE_TRACE(1,("--- %s CMPI DeleteInstance() called",_ClassName)); - CMSetStatusWithChars( _broker, &rc, - CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED" ); - _OSBASE_TRACE(1,("--- %s CMPI DeleteInstance() exited",_ClassName)); - return rc; -} - -CMPIStatus Linux_FanProviderExecQuery( CMPIInstanceMI * mi, - const CMPIContext * ctx, - const CMPIResult * rslt, - const CMPIObjectPath * ref, - const char * lang, - const char * query) { - UNUSED(mi); UNUSED(ctx); UNUSED(rslt); UNUSED(ref); UNUSED(lang); - UNUSED(query); - CMPIStatus rc = {CMPI_RC_OK, NULL}; - - _OSBASE_TRACE(1,("--- %s CMPI ExecQuery() called",_ClassName)); - - CMSetStatusWithChars( _broker, &rc, - CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED" ); - - _OSBASE_TRACE(1,("--- %s CMPI ExecQuery() exited",_ClassName)); - return rc; -} - - -/* ---------------------------------------------------------------------------*/ -/* Method Provider Interface */ -/* ---------------------------------------------------------------------------*/ - - -CMPIStatus Linux_FanProviderMethodCleanup( CMPIMethodMI * mi, - const CMPIContext * ctx, CMPIBoolean terminate) { - UNUSED(mi); UNUSED(ctx), UNUSED(terminate); - _OSBASE_TRACE(1,("--- %s CMPI MethodCleanup() called",_ClassName)); - _OSBASE_TRACE(1,("--- %s CMPI MethodCleanup() exited",_ClassName)); - CMReturn(CMPI_RC_OK); -} - -CMPIStatus Linux_FanProviderInvokeMethod( CMPIMethodMI * mi, - const CMPIContext * ctx, - const CMPIResult * rslt, - const CMPIObjectPath * ref, - const char * methodName, - const CMPIArgs * in, - CMPIArgs * out) { - UNUSED(mi); UNUSED(ctx); UNUSED(in); UNUSED(out); - - struct cim_fan * sptr = NULL; - CMPIString * device_id = NULL; - CMPIValue valrc; - CMPIData data; - CMPIString * class = NULL; - CMPIStatus rc = {CMPI_RC_OK, NULL}; - uint64_t desired_speed; - - _OSBASE_TRACE(1, ("--- %s CMPI InvokeMethod() called", _ClassName)); - - class = CMGetClassName(ref, &rc); - - if ( strcasecmp(CMGetCharPtr(class), _ClassName) == 0 - && strcasecmp(methodName, "setspeed") == 0 ) { - if (!(device_id = CMGetKey(ref, "DeviceID", &rc).value.string)) { - CMSetStatusWithChars(_broker, &rc, - CMPI_RC_ERR_FAILED, "Could not get fan ID." ); - _OSBASE_TRACE(1, ("--- %s CMPI InvokeMethod() failed : %s", - _ClassName, CMGetCharPtr(rc.msg))); - }else if (get_fan_data_by_id(CMGetCharPtr(device_id), &sptr) || !sptr) { - CMSetStatusWithChars(_broker, &rc, - CMPI_RC_ERR_NOT_FOUND, "No such Fan found."); - _OSBASE_TRACE(1, ("--- %s CMPI InvokeMethod() failed : %s", - _ClassName, CMGetCharPtr(rc.msg))); - }else { - char errbuf[100]; - char const * errdscr; - data = CMGetArg(in, "DesiredSpeed", &rc); - if (data.state != CMPI_goodValue) { - switch (data.state) { - case CMPI_nullValue: errdscr = "null value"; break; - case CMPI_badValue: errdscr = "bad value"; break; - case CMPI_notFound: errdscr = "not found"; break; - default: errdscr = "unknown error"; - } - snprintf(errbuf, 100, "Argument error: DesiredSpeed - %s", errdscr); - CMSetStatusWithChars(_broker, &rc, - CMPI_RC_ERR_FAILED, errbuf); - }else if (!data_2_uint64_t(&data, &desired_speed)) { - CMSetStatusWithChars(_broker, &rc, CMPI_RC_ERR_FAILED, - "Argument error: DesiredSpeed must be of type uint64"); - }else { - CMSetStatusWithChars(_broker, &rc, - CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED"); - } - } - }else { - CMSetStatusWithChars(_broker, &rc, - CMPI_RC_ERR_METHOD_NOT_AVAILABLE, methodName); - } - - _OSBASE_TRACE(1, ("--- %s CMPI InvokeMethod() exited", _ClassName)); - return rc; -} - -/* ---------------------------------------------------------------------------*/ -/* Provider Factory */ -/* ---------------------------------------------------------------------------*/ - -CMInstanceMIStub( Linux_FanProvider, - Linux_FanProvider, - _broker, - init_linux_fan_module()); - -CMMethodMIStub( Linux_FanProvider, - Linux_FanProvider, - _broker, - init_linux_fan_module()); - -/* ---------------------------------------------------------------------------*/ -/* end of cmpiLinux_FanProvider */ -/* ---------------------------------------------------------------------------*/ - diff --git a/fan/cmpiLinux_FanSensor.c b/fan/cmpiLinux_FanSensor.c deleted file mode 100644 index bbe8b22..0000000 --- a/fan/cmpiLinux_FanSensor.c +++ /dev/null @@ -1,141 +0,0 @@ -/* This file is part of cmpiLinux_FanProvider. - * - * cmpiLinux_FanProvider 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 3 of the License, or - * (at your option) any later version. - * - * cmpiLinux_FanProvider 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 cmpiLinux_FanProvider. If not, see - * . - */ -#include -#include -#include -#include -#include -#include -#include - -#include "cmpiLinux_FanSensor.h" - -static CMPIArray * _get_PossibleStates( - CMPIBroker const *_broker, - CMPIStatus *rc, - struct cim_fan const *sptr) -{ - int index = 0; - - CMPIArray *res = CMNewArray(_broker, 5, CMPI_string, rc); - if (!res) { - CMSetStatusWithChars(_broker, rc, CMPI_RC_ERR_FAILED, - "CMNewArray(_broker, 5, CMPI_string, rc)"); - _OSBASE_TRACE(2, ("--- _get_AccessibleFeatures failed: %s", - CMGetCharPtr(rc->msg))); - }else { - if (sptr->accessible_features & CIM_FAN_AF_MIN_SPEED) { - CMSetArrayElementAt(res, index++, "Below Minimum", CMPI_chars); - CMSetArrayElementAt(res, index++, "At Minumum", CMPI_chars); - } - CMSetArrayElementAt(res, index++, "Normal", CMPI_chars); - if (sptr->accessible_features & CIM_FAN_AF_MAX_SPEED) { - CMSetArrayElementAt(res, index++, "At Maximum", CMPI_chars); - CMSetArrayElementAt(res, index++, "Above Maximum", CMPI_chars); - } - } - return res; -} - -static char const * _get_CurrentState( - struct cim_fan const *sptr) -{ - if (sptr->accessible_features & CIM_FAN_AF_MIN_SPEED) { - if (sptr->speed < sptr->min_speed) return "Below Minimum"; - if (sptr->speed == sptr->min_speed) return "At Minimum"; - } - if (sptr->accessible_features & CIM_FAN_AF_MAX_SPEED) { - if (sptr->speed > sptr->max_speed) return "Above Maximum"; - if (sptr->speed == sptr->max_speed) return "At Maximum"; - } - return "Normal"; -} - - -CMPIObjectPath * _makePath_FanSensor( - CMPIBroker const *_broker, - CMPIContext const *ctx, - CMPIObjectPath const *cop, - struct cim_fan *sptr, - CMPIStatus *rc) -{ - return _makePath_FanCommon(_ClassName, _broker, ctx, cop, sptr, rc); -} - -CMPIInstance * _makeInst_FanSensor( - CMPIBroker const *_broker, - CMPIContext const *ctx, - CMPIObjectPath const *cop, - char const **properties, - struct cim_fan *sptr, - CMPIStatus *rc) -{ - CMPIObjectPath *op; - CMPIInstance *ci; - CMPIValue val; - - char buf[200]; - - _OSBASE_TRACE(2, ("--- _makeInst_FanSensor() called")); - if (!(ci = _makeInst_FanCommon(_ClassName, _broker, ctx, cop, properties, - sptr, rc, &op))) { - return NULL; - } - - // ManagedElement - CMSetProperty(ci, "Caption", "Fan's tachometer", CMPI_chars); - CMSetProperty(ci, "Description", "Associated sensor of fan." - " Giving information about its speed.", CMPI_chars); - snprintf(buf, 200, "Tachometer of fan \"%s\" on chip \"%s\"", sptr->name, - sptr->chip_name); - CMSetProperty(ci, "ElementName", buf, CMPI_chars); - - // Sensor - val.uint16 = 5; // Tachometer - CMSetProperty(ci, "SensorType", &val, CMPI_uint16); - val.array = _get_PossibleStates(_broker, rc, sptr); - CMSetProperty(ci, "PossibleStates", &val, CMPI_stringA); - CMSetProperty(ci, "CurrentState", _get_CurrentState(sptr), CMPI_chars); - - // NumericSensor - val.uint16 = 38; // Revolutions - CMSetProperty(ci, "BaseUnits", &val, CMPI_uint16); - val.sint32 = 0; - CMSetProperty(ci, "UnitModifier", &val, CMPI_sint32); - val.uint16 = 4; // Per Minute - CMSetProperty(ci, "RateUnits", &val, CMPI_uint16); - val.sint32 = (int32_t) sptr->speed; - CMSetProperty(ci, "CurrentReading", &val, CMPI_sint32); - if (sptr->accessible_features & CIM_FAN_AF_MAX_SPEED) { - val.sint32 = (int32_t) sptr->min_speed; - CMSetProperty(ci, "NormalMax", &val, CMPI_sint32); - } - if (sptr->accessible_features & CIM_FAN_AF_MIN_SPEED) { - val.sint32 = (int32_t) sptr->min_speed; - CMSetProperty(ci, "NormalMin", &val, CMPI_sint32); - } - val.sint32 = 0; - CMSetProperty(ci, "MinReadable", &val, CMPI_sint32); - val.boolean = true; - CMSetProperty(ci, "IsLinear", &val, CMPI_boolean); - - // Linux_FanSensor - - _OSBASE_TRACE(2, ("--- _makeInst_FanSensor() exited")); - return ci; -} - diff --git a/fan/cmpiLinux_FanSensor.h b/fan/cmpiLinux_FanSensor.h deleted file mode 100644 index 3d224b5..0000000 --- a/fan/cmpiLinux_FanSensor.h +++ /dev/null @@ -1,40 +0,0 @@ -/* This file is part of cmpiLinux_FanProvider. - * - * cmpiLinux_FanProvider 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 3 of the License, or - * (at your option) any later version. - * - * cmpiLinux_FanProvider 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 cmpiLinux_FanProvider. If not, see - * . - */ -#ifndef CMPILINUX_FANSENSOR_H_ -#define CMPILINUX_FANSENSOR_H_ - -#include "cmpiLinux_FanCommon.h" - -static char const *_ClassName = "Linux_FanSensor"; - -CMPIObjectPath * _makePath_FanSensor( - CMPIBroker const *_broker, - CMPIContext const *ctx, - CMPIObjectPath const *cop, - struct cim_fan *sptr, - CMPIStatus *rc); - -CMPIInstance * _makeInst_FanSensor( - CMPIBroker const *_broker, - CMPIContext const *ctx, - CMPIObjectPath const *cop, - char const **properties, - struct cim_fan *sptr, - CMPIStatus *rc); - -#endif /* ----- CMPILINUX_FANSENSOR_H_ ----- */ - diff --git a/fan/cmpiLinux_FanSensorProvider.c b/fan/cmpiLinux_FanSensorProvider.c deleted file mode 100644 index e3e1092..0000000 --- a/fan/cmpiLinux_FanSensorProvider.c +++ /dev/null @@ -1,327 +0,0 @@ -/* This file is part of cmpiLinux_FanProvider. - * - * cmpiLinux_FanProvider 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 3 of the License, or - * (at your option) any later version. - * - * cmpiLinux_FanProvider 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 cmpiLinux_FanProvider. If not, see - * . - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "cmpiLinux_FanSensor.h" - -#define UNUSED(x) ((void) (x)) -static const CMPIBroker * _broker; - -#ifdef CMPI_VER_100 - #define Linux_FanSensorProviderSetInstance \ - Linux_FanSensorProviderModifyInstance -#endif - -/* ---------------------------------------------------------------------------*/ -/* Instance Provider Interface */ -/* ---------------------------------------------------------------------------*/ - -CMPIStatus Linux_FanSensorProviderCleanup( - CMPIInstanceMI * mi, - const CMPIContext * ctx, - CMPIBoolean terminate) -{ - UNUSED(mi); UNUSED(ctx); UNUSED(terminate); - - _OSBASE_TRACE(1,("--- %s CMPI Cleanup() called",_ClassName)); - cleanup_linux_fan_module(); - _OSBASE_TRACE(1,("--- %s CMPI Cleanup() exited",_ClassName)); - CMReturn(CMPI_RC_OK); -} - -CMPIStatus Linux_FanSensorProviderEnumInstanceNames( - CMPIInstanceMI * mi, - const CMPIContext * ctx, - const CMPIResult * rslt, - const CMPIObjectPath * ref) -{ - UNUSED(mi); - - CMPIObjectPath * op = NULL; - CMPIStatus rc = {CMPI_RC_OK, NULL}; - struct fanlist * lptr = NULL; - struct fanlist * rm = NULL; - - _OSBASE_TRACE(1,("--- %s CMPI EnumInstanceNames() called",_ClassName)); - - if (enum_all_fans(&lptr) != 0 ) { - CMSetStatusWithChars( _broker, &rc, - CMPI_RC_ERR_FAILED, "Could not list get fan list." ); - _OSBASE_TRACE(1, ("--- %s CMPI EnumInstanceNames() failed : %s", - _ClassName,CMGetCharPtr(rc.msg))); - return rc; - } - - // iterate fan list - for (rm = lptr; lptr && rc.rc == CMPI_RC_OK ; lptr = lptr->next) { - // method call to create the CMPIInstance object - op = _makePath_FanSensor(_broker, ctx, ref, lptr->f, &rc); - if (op == NULL || rc.rc != CMPI_RC_OK) { - if (rc.msg != NULL) { - _OSBASE_TRACE(1, ("--- %s CMPI EnumInstanceNames() failed" - ": %s", _ClassName, CMGetCharPtr(rc.msg))); - } - CMSetStatusWithChars(_broker, &rc, CMPI_RC_ERR_FAILED, - "Transformation from internal structure to CIM" - " ObjectPath failed."); - if (rm) free_fanlist(rm); - _OSBASE_TRACE(1, ("--- %s CMPI EnumInstanceNames() failed" - ": %s", _ClassName, CMGetCharPtr(rc.msg))); - return rc; - }else { - CMReturnObjectPath(rslt, op); - } - } - if (rm) free_fanlist(rm); - - CMReturnDone(rslt); - _OSBASE_TRACE(1, ("--- %s CMPI EnumInstanceNames() exited", _ClassName)); - return rc; -} - -CMPIStatus Linux_FanSensorProviderEnumInstances( - CMPIInstanceMI * mi, - const CMPIContext * ctx, - const CMPIResult * rslt, - const CMPIObjectPath * ref, - const char ** properties) -{ - UNUSED(mi); - - CMPIInstance * ci = NULL; - CMPIStatus rc = {CMPI_RC_OK, NULL}; - struct fanlist * lptr = NULL; - struct fanlist * rm = NULL; - - _OSBASE_TRACE(1,("--- %s CMPI EnumInstances() called",_ClassName)); - - if (enum_all_fans(&lptr)) { - CMSetStatusWithChars(_broker, &rc, - CMPI_RC_ERR_FAILED, "Could not list fans."); - _OSBASE_TRACE(1, ("--- %s CMPI EnumInstances() failed : %s", - _ClassName,CMGetCharPtr(rc.msg))); - return rc; - } - - // iterate fan list - for (rm=lptr; lptr && rc.rc == CMPI_RC_OK; lptr = lptr->next) { - // method call to create the CMPIInstance object - ci = _makeInst_FanSensor(_broker, ctx, ref, properties, lptr->f, &rc); - if (ci == NULL || rc.rc != CMPI_RC_OK ) { - if (rc.msg != NULL ) { - _OSBASE_TRACE(1, ("--- %s CMPI EnumInstances() failed :" - " %s",_ClassName,CMGetCharPtr(rc.msg))); - } - CMSetStatusWithChars( _broker, &rc, - CMPI_RC_ERR_FAILED, "Transformation from internal" - " structure to CIM Instance failed."); - if (rm) free_fanlist(rm); - _OSBASE_TRACE(1, ("--- %s CMPI EnumInstances() failed :" - " %s", _ClassName,CMGetCharPtr(rc.msg))); - return rc; - }else { - CMReturnInstance(rslt, ci); - } - } - if (rm) free_fanlist(rm); - - CMReturnDone(rslt); - _OSBASE_TRACE(1, ("--- %s CMPI EnumInstances() exited", _ClassName)); - return rc; -} - -CMPIStatus Linux_FanSensorProviderGetInstance( - CMPIInstanceMI * mi, - const CMPIContext * ctx, - const CMPIResult * rslt, - const CMPIObjectPath * cop, - const char **properties) -{ - UNUSED(mi); - - CMPIInstance * ci = NULL; - CMPIStatus rc = {CMPI_RC_OK, NULL}; - struct cim_fan * sptr = NULL; - CMPIData data; - CMPIArray * other_identifying_info = NULL; - CMPIString * sys_path = NULL; - CMPIString * fan_name = NULL; - CMPIString * device_id = NULL; - cim_fan_error_t cmdrc; - - _OSBASE_TRACE(1,("--- %s CMPI GetInstance() called",_ClassName)); - - data = CMGetKey(cop, "OtherIdentifyingInfo", &rc); - if ( !rc.rc - && data.type == CMPI_stringA - && (other_identifying_info = data.value.array) - && !rc.rc - && (CMGetArrayCount(other_identifying_info, &rc) > 1) - && !rc.rc) - { - data = CMGetArrayElementAt(other_identifying_info, 0, &rc); - if (!rc.rc) sys_path = data.value.string; - data = CMGetArrayElementAt(other_identifying_info, 1, &rc); - if (!rc.rc) fan_name = data.value.string; - } - device_id = CMGetKey(cop, "DeviceID", &rc).value.string; - if ((sys_path == NULL || fan_name == NULL) && (device_id == NULL)) { - CMSetStatusWithChars(_broker, &rc, - CMPI_RC_ERR_FAILED, "Could not get fan ID." ); - _OSBASE_TRACE(1, ("--- %s CMPI GetInstance() failed : %s", - _ClassName, CMGetCharPtr(rc.msg))); - return rc; - } - - if (sys_path && fan_name) { - cmdrc = get_fan_data(CMGetCharPtr(sys_path), CMGetCharPtr(fan_name), - &sptr); - } - if ((cmdrc || !sptr) && device_id) { - cmdrc = get_fan_data_by_id(CMGetCharPtr(device_id), &sptr); - } - if (cmdrc || !sptr) { - CMSetStatusWithChars(_broker, &rc, - CMPI_RC_ERR_NOT_FOUND, cim_fan_strerror(cmdrc)); - _OSBASE_TRACE(1, ("--- %s CMPI GetInstance() exited : %s", - _ClassName,CMGetCharPtr(rc.msg))); - return rc; - } - - ci = _makeInst_FanSensor(_broker, ctx, cop, properties, sptr, &rc); - if (sptr) free_fan(sptr); - - if (ci == NULL) { - if (rc.msg != NULL) { - _OSBASE_TRACE(1, ("--- %s CMPI GetInstance() failed : %s", - _ClassName, CMGetCharPtr(rc.msg))); - }else { - _OSBASE_TRACE(1, ("--- %s CMPI GetInstance() failed", _ClassName)); - } - return rc; - } - - CMReturnInstance(rslt, ci); - CMReturnDone(rslt); - _OSBASE_TRACE(1, ("--- %s CMPI GetInstance() exited", _ClassName)); - return rc; -} - -CMPIStatus Linux_FanSensorProviderCreateInstance( - CMPIInstanceMI * mi, - const CMPIContext * ctx, - const CMPIResult * rslt, - const CMPIObjectPath * cop, - const CMPIInstance * ci) -{ - UNUSED(mi); UNUSED(ctx); UNUSED(rslt); UNUSED(cop); UNUSED(ci); - - CMPIStatus rc = {CMPI_RC_OK, NULL}; - - _OSBASE_TRACE(1, ("--- %s CMPI CreateInstance() called", _ClassName)); - CMSetStatusWithChars(_broker, &rc, - CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED"); - _OSBASE_TRACE(1, ("--- %s CMPI CreateInstance() exited", _ClassName)); - return rc; -} - -CMPIStatus Linux_FanSensorProviderSetInstance( - CMPIInstanceMI * mi, - const CMPIContext * ctx, - const CMPIResult * rslt, - const CMPIObjectPath * cop, - const CMPIInstance * ci, - const char ** properties) -{ - UNUSED(mi); UNUSED(ctx); UNUSED(rslt); UNUSED(cop); - UNUSED(ci); UNUSED(properties); - - CMPIStatus rc = {CMPI_RC_OK, NULL}; - - _OSBASE_TRACE(1, ("--- %s CMPI SetInstance() called", _ClassName)); - CMSetStatusWithChars(_broker, &rc, - CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED"); - _OSBASE_TRACE(1, ("--- %s CMPI SetInstance() exited", _ClassName)); - return rc; -} - -CMPIStatus Linux_FanSensorProviderDeleteInstance( - CMPIInstanceMI * mi, - const CMPIContext * ctx, - const CMPIResult * rslt, - const CMPIObjectPath * cop) -{ - UNUSED(mi); UNUSED(ctx); UNUSED(rslt); UNUSED(cop); - - CMPIStatus rc = {CMPI_RC_OK, NULL}; - - _OSBASE_TRACE(1,("--- %s CMPI DeleteInstance() called",_ClassName)); - CMSetStatusWithChars( _broker, &rc, - CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED" ); - _OSBASE_TRACE(1,("--- %s CMPI DeleteInstance() exited",_ClassName)); - return rc; -} - -CMPIStatus Linux_FanSensorProviderExecQuery( - CMPIInstanceMI * mi, - const CMPIContext * ctx, - const CMPIResult * rslt, - const CMPIObjectPath * ref, - const char * lang, - const char * query) -{ - UNUSED(mi); UNUSED(ctx); UNUSED(rslt); UNUSED(ref); UNUSED(lang); - UNUSED(query); - CMPIStatus rc = {CMPI_RC_OK, NULL}; - - _OSBASE_TRACE(1,("--- %s CMPI ExecQuery() called",_ClassName)); - - CMSetStatusWithChars( _broker, &rc, - CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED" ); - - _OSBASE_TRACE(1,("--- %s CMPI ExecQuery() exited",_ClassName)); - return rc; -} - - -/* ---------------------------------------------------------------------------*/ -/* Provider Factory */ -/* ---------------------------------------------------------------------------*/ - -CMInstanceMIStub( Linux_FanSensorProvider, - Linux_FanSensorProvider, - _broker, - init_linux_fan_module()); - -/* ---------------------------------------------------------------------------*/ -/* end of cmpiLinux_FanSensorProvider */ -/* ---------------------------------------------------------------------------*/ - diff --git a/fan/mof/Linux_Fan.mof b/fan/mof/Linux_Fan.mof deleted file mode 100644 index 02766e6..0000000 --- a/fan/mof/Linux_Fan.mof +++ /dev/null @@ -1,112 +0,0 @@ -// -// Linux_Fan.mof -// - -#pragma locale ("en_US") -//#pragma namespace ("root/cimv2") - -// =================================================================== -// Linux_Fan -// =================================================================== - -[ Provider("cmpi:cmpiLinux_FanProvider") ] -class Linux_Fan : CIM_Fan { - - [ Key, Override("DeviceID"), - Description("Uniquely identifies fan. It is a composition of - SysPath and Name glued with slash ('/').") ] - string DeviceId; - - [ Override("Name"), - Description("Name of fan provided by system.") ] - string Name; - - [ Description("Array of fan features, that are exposed through system - interface. In other words: those that are readible/writable."), - ValueMap { "1", "2", "3", "4", "5", "6", "7", "8" }, - Values { "MinSpeed", "MaxSpeed", "Divisor", "Pulses", "Beep", - "Alarm", "MinAlarm", "MaxAlarm" } - ] - uint16 AccessibleFeatures[]; - - [ Description("Minimum speed value."), - Write, - Units("Revolutions per Minute") ] - uint64 MinSpeed; - - [ Description("Maximum speed value."), - Write, - Units("Revolutions per Minute") ] - uint64 MaxSpeed; - - [ Description("Fan divisisor. It affects Minimum and Maximum speed value - and accuracy of readings. - The drivers account for the 'fan divisor' in their calculation - of RPM. So changing the fan divisor will NOT change the - nominal RPM reading, it will only affect the minimum and maximum - readings and the accuracy of the readings. - The actual formula is RPM = (60 * 22500) / (count * divisor)"), - Write ] - uint32 Divisor; - - [ Description("Number of tachometer pulses per fan revolution. - Integer value, typically between 1 and 4. - This value is a characteristic of the fan connected to the - device's input, so it has to be set in accordance with the fan - model."), - Write ] - uint32 Pulses; - - [ Description("This indicates, whether a PC's speaker should beep - when an alarm occurs."), - Write ] - boolean Beep; - - [ Description("ALARM warning indicating, that current speed is out of - range. This information is supplied by fan's chip driver.") ] - boolean Alarm; - - [ Description("ALARM warning indicating, that current speed is below - the critical level. This information is supplied by fan's chip driver.") - ] - boolean MinAlarm; - - [ Description("ALARM warning indicating, that current speed is above - the critical level. This information is supplied by fan's chip driver.") - ] - boolean MaxAlarm; - -}; - -// =================================================================== -// Linux_FanSensor -// =================================================================== -[ Provider("cmpi:cmpiLinux_FanSensorProvider") ] -class Linux_FanSensor : CIM_NumericSensor { - - [ Key, Override("DeviceID"), - Description("Uniquely identifies fan. It is a composition of - SysPath and Name glued with slash ('/').") ] - string DeviceId; - - [ Key, Override("Name"), - Description("Name of fan provided by system.") ] - string Name; - -}; - - -// =================================================================== -// Associations -// =================================================================== -[ Association, - Provider("cmpi:cmpiLinux_FanAssociatedSensorProvider") ] -class Linux_FanAssociatedSensor : CIM_AssociatedSensor { - - [ Override("Antecedent") ] - Linux_FanSensor REF Antecedent; - - [ Override("Dependent") ] - Linux_Fan REF Dependent; - -}; diff --git a/fan/mof/Linux_Fan.reg b/fan/mof/Linux_Fan.reg deleted file mode 100644 index 9d21edb..0000000 --- a/fan/mof/Linux_Fan.reg +++ /dev/null @@ -1,18 +0,0 @@ -[Linux_Fan] - provider: Linux_FanProvider - location: cmpiLinux_FanProvider - type: instance method - namespace: root/cimv2 - -[Linux_FanSensor] - provider: Linux_FanSensorProvider - location: cmpiLinux_FanSensorProvider - type: instance - namespace: root/cimv2 - -[Linux_FanAssociatedSensor] - provider: Linux_FanAssociatedSensorProvider - location: cmpiLinux_FanAssociatedSensorProvider - type: instance association - namespace: root/cimv2 - diff --git a/providers/cmpi-service/AUTHORS b/providers/cmpi-service/AUTHORS deleted file mode 100644 index c64b60d..0000000 --- a/providers/cmpi-service/AUTHORS +++ /dev/null @@ -1 +0,0 @@ -Vitezslav Crhonek \ No newline at end of file diff --git a/providers/cmpi-service/COPYING b/providers/cmpi-service/COPYING deleted file mode 100644 index 94a9ed0..0000000 --- a/providers/cmpi-service/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/providers/cmpi-service/ChangeLog b/providers/cmpi-service/ChangeLog deleted file mode 100644 index eca4bdd..0000000 --- a/providers/cmpi-service/ChangeLog +++ /dev/null @@ -1 +0,0 @@ -No changes. \ No newline at end of file diff --git a/providers/cmpi-service/Makefile.am b/providers/cmpi-service/Makefile.am deleted file mode 100644 index 5cf4745..0000000 --- a/providers/cmpi-service/Makefile.am +++ /dev/null @@ -1,38 +0,0 @@ -# Start from an empty extra distribution file list -EXTRA_DIST= - -# providerdir defines where provider libraries will be installed (@PROVIDERDIR@ is set by the configure script) -providerdir = @PROVIDERDIR@ - -provider_LTLIBRARIES = libService.la - -libService_la_SOURCES = Service.c -libService_la_LIBADD = -lServiceUtils -lserviceutil -libService_la_LDFLAGS = -avoid-version - -lib_LTLIBRARIES = libServiceUtils.la libserviceutil.la -libServiceUtils_la_SOURCES= ServiceUtils.c -libServiceUtils_la_LDFLAGS = -Wc,-nostartfiles -libserviceutil_la_SOURCES = util/serviceutil.c -libserviceutil_la_LDFLAGS = -Wc,-nostartfiles - -noinst_HEADERS = ServiceUtils.h util/serviceutil.h - -# Mof file -SCHEMAS=mof/Linux_Service.mof -REGISTRATIONS=mof/Linux_Service.registration - -pkgdata_DATA=$(SCHEMAS) $(REGISTRATIONS) -pkgdata_SCRIPTS=provider-register.sh - -EXTRA_DIST+=mof $(pkgdata_SCRIPTS) -# Register the provider(s) and class definition(s) to the current CIM server/CIMOM -postinstall: - sh provider-register.sh -t @CIMSERVER@ -r $(REGISTRATIONS) -m $(SCHEMAS) -preuninstall: - sh provider-register.sh -d -t @CIMSERVER@ -r $(REGISTRATIONS) -m $(SCHEMAS) - - -# Install util/syslog-service.sh -bin_SCRIPTS = util/serviceutil.sh util/servicedisc.sh -EXTRA_DIST+=$(bin_SCRIPTS) diff --git a/providers/cmpi-service/NEWS b/providers/cmpi-service/NEWS deleted file mode 100644 index 047ccd0..0000000 --- a/providers/cmpi-service/NEWS +++ /dev/null @@ -1 +0,0 @@ -No news. \ No newline at end of file diff --git a/providers/cmpi-service/README b/providers/cmpi-service/README deleted file mode 100644 index 62658fb..0000000 --- a/providers/cmpi-service/README +++ /dev/null @@ -1,6 +0,0 @@ -RPM creation: - -./autoconfiscate.sh -./configure PROVIDERDIR=/usr/lib64/cmpi CIMSERVER=sfcb -make distcheck -rpmbuild with tarball and .spec diff --git a/providers/cmpi-service/Service.c b/providers/cmpi-service/Service.c deleted file mode 100644 index 8ab8591..0000000 --- a/providers/cmpi-service/Service.c +++ /dev/null @@ -1,343 +0,0 @@ -/* - * Service.c - * - * Copyright (C) 2012 Red Hat, Inc. All rights reserved. - * - * 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, see . - * - * Based on Syslog_Service.c from sblim-cmpi-syslog written by - * R Sharada , Copyright (c) IBM Corp. 2003, 2009 - * - * Red Hat Author(s): Vitezslav Crhonek - * - */ - -#include -#include -#include -#include - -#include "ServiceUtils.h" -#include "util/serviceutil.h" -#define LOCALCLASSNAME "Linux_Service" - -static const CMPIBroker *_broker; - -#ifdef CMPI_VER_100 -#define ServiceSetInstance ServiceModifyInstance -#endif - - - -/* Instance MI Cleanup */ -CMPIStatus -ServiceCleanup(CMPIInstanceMI *mi, - const CMPIContext *ctx, - CMPIBoolean terminate) -{ - CMReturn(CMPI_RC_OK); -} - - - -/* Instance MI Functions */ -CMPIStatus -ServiceEnumInstanceNames(CMPIInstanceMI *mi, - const CMPIContext *ctx, - const CMPIResult *rslt, - const CMPIObjectPath *ref) -{ - CMPIObjectPath *op = NULL; - CMPIStatus st = {CMPI_RC_OK,NULL}; - void *enumhdl = NULL; - Service servicebuf; - int i = 0; - SList *slist = NULL; - - service_debug(stderr,"ServiceEnumInstanceNames() called, ctx %p, result %p, op %p", ctx, rslt, ref); - - memset(&servicebuf, '\0', sizeof(Service)); - - slist = Service_Find_All(); - - for(i = 0; i < slist->cnt; i++) - { - enumhdl = Service_Begin_Enum(slist->name[i]); - if (enumhdl == NULL) - { - CMSetStatusWithChars(_broker, &st, CMPI_RC_ERR_FAILED, - "Could not begin service names enumeration"); - Service_Free_SList(slist); - return st; - } - else - { - if (Service_Next_Enum(enumhdl, &servicebuf, slist->name[i])) - { - // build object path from buffer - op = makeServicePath(_broker, - LOCALCLASSNAME, - CMGetCharPtr(CMGetNameSpace(ref, NULL)), - &servicebuf); - if (CMIsNullObject(op)) - { - CMSetStatusWithChars(_broker, &st, CMPI_RC_ERR_FAILED, - "Could not construct object path"); - goto label; - } - CMReturnObjectPath(rslt, op); - } -label: - CMReturnDone(rslt); - Service_End_Enum(enumhdl); - } - } - - Service_Free_SList(slist); - return st; -} - - - -CMPIStatus -ServiceEnumInstances(CMPIInstanceMI *mi, - const CMPIContext *ctx, - const CMPIResult *rslt, - const CMPIObjectPath *ref, - const char **properties) -{ - CMPIInstance *in = NULL; - CMPIStatus st = {CMPI_RC_OK,NULL}; - void *enumhdl = NULL; - Service servicebuf; - int i = 0; - SList *slist = NULL; - - service_debug(stderr,"ServiceEnumInstances() called, ctx %p, result %p, op %p", ctx, rslt, ref); - - memset(&servicebuf, '\0', sizeof(Service)); - - slist = Service_Find_All(); - - for(i = 0; i < slist->cnt; i++) - { - enumhdl = Service_Begin_Enum(slist->name[i]); - if (enumhdl == NULL) - { - CMSetStatusWithChars(_broker, &st, CMPI_RC_ERR_FAILED, - "Could not begin service instances enumeration"); - Service_Free_SList(slist); - return st; - } - else - { - if (Service_Next_Enum(enumhdl, &servicebuf, slist->name[i])) - { - // build object instance from buffer - in = makeServiceInstance(_broker, - LOCALCLASSNAME, - CMGetCharPtr(CMGetNameSpace(ref, NULL)), - &servicebuf); - if (CMIsNullObject(in)) - { - CMSetStatusWithChars(_broker, &st, CMPI_RC_ERR_FAILED, - "Could not construct instance"); - goto label; - } - CMReturnInstance(rslt, in); - } -label: - CMReturnDone(rslt); - Service_End_Enum(enumhdl); - } - } - - Service_Free_SList(slist); - return st; -} - - - -CMPIStatus -ServiceGetInstance(CMPIInstanceMI *mi, - const CMPIContext *ctx, - const CMPIResult *rslt, - const CMPIObjectPath *cop, - const char **properties) -{ - CMPIInstance *in = NULL; - CMPIStatus st = {CMPI_RC_OK,NULL}; - CMPIData nd; - void *enumhdl = NULL; - Service servicebuf; - char *name = NULL; - int i = 0; - - memset(&servicebuf, '\0', sizeof(Service)); - - service_debug(stderr,"ServiceGetInstance() called, ctx %p, result %p, op %p", ctx, rslt, cop); - - nd = CMGetKey(cop, "Name", &st); - name = CMGetCharPtr(nd.value.string); - - service_debug(stderr,"Name = %s", name); - - enumhdl = Service_Begin_Enum(name); - if (enumhdl == NULL) { - CMSetStatusWithChars(_broker, &st, CMPI_RC_ERR_FAILED, - "Could not begin service instances enumeration"); - return st; - } else { - if (Service_Next_Enum(enumhdl,&servicebuf, name)) { - if (strncmp(name, servicebuf.svName, 6)==0) { - // build object instance from buffer - in = makeServiceInstance(_broker, - LOCALCLASSNAME, - CMGetCharPtr(CMGetNameSpace(cop,NULL)), - &servicebuf); - if (CMIsNullObject(in)) { - CMSetStatusWithChars(_broker, &st, CMPI_RC_ERR_FAILED, - "Could not construct instance"); - goto label; - } - CMReturnInstance(rslt,in); - } - } -label: - CMReturnDone(rslt); - Service_End_Enum(enumhdl); - } - - return st; -} - - - -/* Instance MI functions - not supported */ -CMPIStatus -ServiceCreateInstance(CMPIInstanceMI *mi, - const CMPIContext *ctx, - const CMPIResult *rslt, - const CMPIObjectPath *cop, - const CMPIInstance *ci) -{ - CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); -} - - - -CMPIStatus -ServiceSetInstance(CMPIInstanceMI *mi, - const CMPIContext *ctx, - const CMPIResult *rslt, - const CMPIObjectPath *cop, - const CMPIInstance *ci, - const char **properties) -{ - CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); -} - - - -CMPIStatus -ServiceDeleteInstance(CMPIInstanceMI *mi, - const CMPIContext *ctx, - const CMPIResult *rslt, - const CMPIObjectPath *cop) -{ - CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); -} - -CMPIStatus -ServiceExecQuery(CMPIInstanceMI *mi, - const CMPIContext *ctx, - const CMPIResult *rslt, - const CMPIObjectPath *cop, - const char *lang, - const char *query) -{ - CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); -} - - - -/* Method MI Cleanup */ -CMPIStatus -ServiceMethodCleanup(CMPIMethodMI *mi, - const CMPIContext *ctx, - CMPIBoolean terminate) -{ - CMReturn(CMPI_RC_OK); -} - - - -/* Method MI Functions */ -CMPIStatus -ServiceInvokeMethod(CMPIMethodMI *mi, - const CMPIContext *ctx, - const CMPIResult *rslt, - const CMPIObjectPath *cop, - const char *method, - const CMPIArgs *in, - CMPIArgs *out) -{ - CMPIStatus st = {CMPI_RC_OK,NULL}; - CMPIData dt; - char typebuf[1000]; - char *name = NULL; - - memset(&typebuf, '\0', sizeof(typebuf)); - - dt = CMGetKey(cop, "Name", &st); - if (st.rc != CMPI_RC_OK) - { - CMSetStatusWithChars(_broker, &st, CMPI_RC_ERR_FAILED, - "Could not get instance name"); - - } - else - { - name = CMGetCharPtr(dt.value.string); - if (Service_Operation(name, method, typebuf, sizeof(typebuf))) - { - /* If the function returns 1, then failure */ - CMSetStatusWithChars(_broker, &st, CMPI_RC_ERR_FAILED, - "Could not get instance type"); - } - else - { - CMReturnData(rslt, typebuf, CMPI_chars); - CMReturnDone(rslt); - } - } - - return st; -} - - - -/* Instance MI Factory */ -CMInstanceMIStub(Service, - Service, - _broker, - CMNoHook); - - - -/* Method MI Factory */ -CMMethodMIStub(Service, - Service, - _broker, - CMNoHook); diff --git a/providers/cmpi-service/ServiceUtils.c b/providers/cmpi-service/ServiceUtils.c deleted file mode 100644 index 37bb081..0000000 --- a/providers/cmpi-service/ServiceUtils.c +++ /dev/null @@ -1,119 +0,0 @@ -/* - * ServiceUtils.c - * - * Copyright (C) 2012 Red Hat, Inc. All rights reserved. - * - * 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, see . - * - * Based on Syslog_ServiceUtils.c from sblim-cmpi-syslog written by - * R Sharada , Copyright (c) IBM Corp. 2003, 2009 - * - * Red Hat Author(s): Vitezslav Crhonek - * - */ - -#include -#include -#include -#include -#include - -#include "ServiceUtils.h" -#include "util/serviceutil.h" -static char sccn[] = "CIM_UnitaryComputerSystem"; -static char ccn[] = "Linux_Service"; -static char csn[500] = ""; - - - -char * -SystemCreationClassName() -{ - return sccn; -} - - - -char * -SystemName() -{ - if (*csn == 0) - gethostname(csn, sizeof(csn)); - return csn; -} - - - -char * -CreationClassName() -{ - return ccn; -} - - - -CMPIObjectPath * -makeServicePath(const CMPIBroker *broker, - const char *classname, - const char *namespace, - Service *svc) -{ - CMPIObjectPath *op = NULL; - - op = CMNewObjectPath(broker, - (char*)namespace, - (char*)classname, - NULL); - if (!CMIsNullObject(op)) - { - CMAddKey(op, "CreationClassName", CreationClassName(), CMPI_chars); - CMAddKey(op, "SystemCreationClassName", SystemCreationClassName(), CMPI_chars); - CMAddKey(op, "SystemName", SystemName(), CMPI_chars); - CMAddKey(op, "Name", svc->svName, CMPI_chars); - } - - return op; -} - - - -CMPIInstance * -makeServiceInstance(const CMPIBroker *broker, - const char * classname, - const char * namespace, - Service *svc) -{ - CMPIInstance *in = NULL; - CMPIObjectPath *op = CMNewObjectPath(broker, - (char*) namespace, - (char*) classname, - NULL); - if (!CMIsNullObject(op)) - { - in = CMNewInstance(broker, op, NULL); - if (!CMIsNullObject(in)) - { - CMSetProperty(in, "CreationClassName", CreationClassName(), CMPI_chars); - CMSetProperty(in, "SystemCreationClassName", SystemCreationClassName(), CMPI_chars); - CMSetProperty(in, "SystemName", SystemName(), CMPI_chars); - CMSetProperty(in, "Name", svc->svName, CMPI_chars); - CMSetProperty(in, "Status", svc->svStatus, CMPI_chars); - CMSetProperty(in, "Started", &svc->svStarted, CMPI_boolean); - CMSetProperty(in, "EnabledDefault", (CMPIValue*) &(svc->svEnabledDefault), CMPI_uint16); - } - } - - return in; -} - diff --git a/providers/cmpi-service/ServiceUtils.h b/providers/cmpi-service/ServiceUtils.h deleted file mode 100644 index a79833c..0000000 --- a/providers/cmpi-service/ServiceUtils.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * ServiceUtils.h - * - * Copyright (C) 2012 Red Hat, Inc. All rights reserved. - * - * 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, see . - * - * Based on Syslog_ServiceUtils.h from sblim-cmpi-syslog written by - * R Sharada , Copyright (c) IBM Corp. 2003, 2009 - * - * Red Hat Author(s): Vitezslav Crhonek - * - */ - -#ifndef SERVICEUTILS_H -#define SERVICEUTILS_H - -#include "util/serviceutil.h" - -CMPIObjectPath * -makeServicePath(const CMPIBroker *broker, const char *classname, const char *namespace, Service *svc); - -CMPIInstance * -makeServiceInstance(const CMPIBroker *broker, const char *classname, const char *namespace, Service *svc); - -#endif diff --git a/providers/cmpi-service/acinclude.m4 b/providers/cmpi-service/acinclude.m4 deleted file mode 100644 index 52538d0..0000000 --- a/providers/cmpi-service/acinclude.m4 +++ /dev/null @@ -1,407 +0,0 @@ -dnl -dnl $Id: acinclude.m4,v 1.2 2009/05/22 03:50:48 tyreld Exp $ -dnl -dnl -dnl (C) Copyright IBM Corp. 2004, 2005, 2009 -dnl -dnl THIS FILE IS PROVIDED UNDER THE TERMS OF THE ECLIPSE PUBLIC LICENSE -dnl ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE -dnl CONSTITUTES RECIPIENTS ACCEPTANCE OF THE AGREEMENT. -dnl -dnl You can obtain a current copy of the Eclipse Public License from -dnl http://www.eclipse.org/legal/epl-v10.html -dnl -dnl Author: Konrad Rzeszutek -dnl Contributors: Viktor Mihajlovski -dnl Date : 09/20/2004 -dnl -dnl -dnl CHECK_CMPI: Check for CMPI headers and set the CPPFLAGS -dnl with the -I -dnl -dnl CHECK_PEGASUS_2_3_2: Check for Pegasus 2.3.2 and set -dnl the HAVE_PEGASUS_2_3_2 -dnl flag -dnl - -AC_DEFUN([CHECK_PEGASUS_2_3_2], - [ - AC_MSG_CHECKING(for Pegasus 2.3.2) - if which cimserver > /dev/null 2>&1 - then - test_CIMSERVER=`cimserver -v` - fi - if test "$test_CIMSERVER" == "2.3.2"; then - AC_MSG_RESULT(yes) - AC_DEFINE_UNQUOTED(HAVE_PEGASUS_2_3_2,1,[Defined to 1 if Pegasus 2.3.2 is used]) - else - AC_MSG_RESULT(no) - - fi - ] -) - -dnl -dnl CHECK_PEGASUS_2_4: Check for Pegasus 2.4 and set the -dnl the -DPEGASUS_USE_EXPERIMENTAL_INTERFACES flag -dnl -AC_DEFUN([CHECK_PEGASUS_2_4], - [ - AC_MSG_CHECKING(for Pegasus 2.4) - if which cimserver > /dev/null 2>&1 - then - test_CIMSERVER=`cimserver -v` - fi - if test "$test_CIMSERVER" == "2.4"; then - AC_MSG_RESULT(yes) - CPPFLAGS="$CPPFLAGS -DPEGASUS_USE_EXPERIMENTAL_INTERFACES" - AC_DEFINE_UNQUOTED(HAVE_PEGASUS_2_4,1,[Defined to 1 if Pegasus 2.4 is used]) - else - AC_MSG_RESULT(no) - - fi - ] -) - - -dnl -dnl Helper functions -dnl -AC_DEFUN([_CHECK_CMPI], - [ - AC_MSG_CHECKING($1) - AC_TRY_LINK( - [ - #include - #include - #include - #include - ], - [ - CMPIBroker broker; - CMPIStatus status = {CMPI_RC_OK, NULL}; - CMPIString *s = CMNewString(&broker, "TEST", &status); - ], - [ - have_CMPI=yes - dnl AC_MSG_RESULT(yes) - ], - [ - have_CMPI=no - dnl AC_MSG_RESULT(no) - ]) - -]) - -AC_DEFUN([_CHECK_INDHELP_HEADER], - [ - AC_MSG_CHECKING($1) - AC_TRY_COMPILE( - [ - #include - #include - ], - [ - CMPISelectExp *filter = NULL; - ind_set_select("/root/cimv2",NULL,filter); - ], - [ - have_INDHELP=yes - dnl AC_MSG_RESULT(yes) - ], - [ - have_INDHELP=no - dnl AC_MSG_RESULT(no) - ]) - -]) - -dnl -dnl The main function to check for CMPI headers -dnl Modifies the CPPFLAGS with the right include directory and sets -dnl the 'have_CMPI' to either 'no' or 'yes' -dnl - -AC_DEFUN([CHECK_CMPI], - [ - AC_MSG_CHECKING(for CMPI headers) - dnl Check just with the standard include paths - CMPI_CPP_FLAGS="$CPPFLAGS" - _CHECK_CMPI(standard) - if test "$have_CMPI" == "yes"; then - dnl The standard include paths worked. - AC_MSG_RESULT(yes) - else - _DIRS_="/usr/include/cmpi \ - /usr/local/include/cmpi \ - $PEGASUS_ROOT/src/Pegasus/Provider/CMPI \ - /opt/tog-pegasus/include/Pegasus/Provider/CMPI \ - /usr/include/Pegasus/Provider/CMPI \ - /usr/include/openwbem \ - /usr/sniacimom/include" - for _DIR_ in $_DIRS_ - do - _cppflags=$CPPFLAGS - _include_CMPI="$_DIR_" - CPPFLAGS="$CPPFLAGS -I$_include_CMPI" - _CHECK_CMPI($_DIR_) - if test "$have_CMPI" == "yes"; then - dnl Found it - AC_MSG_RESULT(yes) - dnl Save the new -I parameter - CMPI_CPP_FLAGS="$CPPFLAGS" - break - fi - CPPFLAGS=$_cppflags - done - fi - CPPFLAGS="$CMPI_CPP_FLAGS" - if test "$have_CMPI" == "no"; then - AC_MSG_ERROR(no. Sorry cannot find CMPI headers files.) - fi - ] -) - -dnl -dnl The main function to check for the indication_helper header. -dnl Modifies the CPPFLAGS with the right include directory and sets -dnl the 'have_INDHELP' to either 'no' or 'yes' -dnl - -AC_DEFUN([CHECK_INDHELP_HEADER], - [ - INDHELP_CPP_FLAGS="$CPPFLAGS" - AC_MSG_CHECKING(for indication helper header) - dnl Check just with the standard include paths - _CHECK_INDHELP_HEADER(standard) - if test "$have_INDHELP" == "yes"; then - dnl The standard include paths worked. - AC_MSG_RESULT(yes) - else - _DIRS_="/usr/include/sblim \ - /usr/local/include/sblim" - for _DIR_ in $_DIRS_ - do - _cppflags=$CPPFLAGS - _include_INDHELP="$_DIR_" - CPPFLAGS="$CPPFLAGS -I$_include_INDHELP" - _CHECK_INDHELP_HEADER($_DIR_) - if test "$have_INDHELP" == "yes"; then - dnl Found it - AC_MSG_RESULT(yes) - dnl Save the new -I parameter - INDHELP_CPP_FLAGS="$CPPFLAGS" - break - fi - CPPFLAGS=$_cppflags - done - fi - CPPFLAGS="$INDHELP_CPP_FLAGS" - if test "$have_INDHELP" == "no"; then - AC_MSG_RESULT(no) - fi - ] -) - -dnl -dnl The check for the CMPI provider directory -dnl Sets the PROVIDERDIR variable. -dnl - -AC_DEFUN([CHECK_PROVIDERDIR], - [ - AC_MSG_CHECKING(for CMPI provider directory) - _DIRS="$libdir/cmpi" - save_exec_prefix=${exec_prefix} - save_prefix=${prefix} - if test xNONE == x${prefix}; then - prefix=/usr/local - fi - if test xNONE == x${exec_prefix}; then - exec_prefix=$prefix - fi - for _dir in $_DIRS - do - _xdir=`eval echo $_dir` - AC_MSG_CHECKING( $_dir ) - if test -d $_xdir ; then - dnl Found it - AC_MSG_RESULT(yes) - if test x"$PROVIDERDIR" == x ; then - PROVIDERDIR=$_dir - fi - break - fi - done - if test x"$PROVIDERDIR" == x ; then - PROVIDERDIR="$libdir"/cmpi - AC_MSG_RESULT(implied: $PROVIDERDIR) - fi - exec_prefix=$save_exec_prefix - prefix=$save_prefix - ] -) - -dnl -dnl The "check" for the CIM server type in PATH and -dnl the sbin directories. -dnl Sets the CIMSERVER variable. -dnl - -AC_DEFUN([CHECK_CIMSERVER], - [ - AC_MSG_CHECKING(for CIM servers) - if test x"$CIMSERVER" = x - then - _SERVERS="sfcbd cimserver owcimomd" - _SAVE_PATH=$PATH - PATH=/usr/sbin:/usr/local/sbin:$PATH - for _name in $_SERVERS - do - AC_MSG_CHECKING( $_name ) - for _path in `echo $PATH | sed "s/:/ /g"` - do - if test -f $_path/$_name ; then - dnl Found it - AC_MSG_RESULT(yes) - if test x"$CIMSERVER" == x ; then - case $_name in - sfcbd) CIMSERVER=sfcb;; - cimserver) CIMSERVER=pegasus;; - owcimomd) CIMSERVER=openwbem;; - esac - fi - break; - fi - done - done - PATH=$_SAVE_PATH - if test x"$CIMSERVER" == x ; then - CIMSERVER=sfcb - AC_MSG_RESULT(implied: $CIMSERVER) - fi - fi - # Cross platform only needed for sfcb currently - if test $CIMSERVER = sfcb - then - AC_REQUIRE([AC_CANONICAL_HOST]) - AC_CHECK_SIZEOF(int) - case "$build_cpu" in - i*86) case "$host_cpu" in - powerpc*) if test $ac_cv_sizeof_int == 4 - then - REGISTER_FLAGS="-X P32" - fi ;; - esac ;; - esac - AC_SUBST(REGISTER_FLAGS) - fi - ] -) - -dnl -dnl The check for the SBLIM test suite -dnl Sets the TESTSUITEDIR variable and the TESTSUITE conditional -dnl - -AC_DEFUN([CHECK_TESTSUITE], - [ - AC_MSG_CHECKING(for SBLIM testsuite) - _DIRS="$datadir/sblim-testsuite" - save_exec_prefix=${exec_prefix} - save_prefix=${prefix} - if test xNONE == x${prefix}; then - prefix=/usr/local - fi - if test xNONE == x${exec_prefix}; then - exec_prefix=$prefix - fi - for _name in $_DIRS - do - AC_MSG_CHECKING( $_name ) - _xname=`eval echo $_name` - if test -x $_xname/run.sh ; then - dnl Found it - AC_MSG_RESULT(yes) - if test x"$TESTSUITEDIR" == x; then - TESTSUITEDIR=$_name - fi - AC_SUBST(TESTSUITEDIR) - break; - fi - done - if test x"$TESTSUITEDIR" == x ; then - AC_MSG_RESULT(no) - fi - AM_CONDITIONAL(TESTSUITE,[test x"$TESTSUITEDIR" != x]) - exec_prefix=$save_exec_prefix - prefix=$save_prefix - ] -) - -dnl -dnl The main function to check for the cmpi-base common header -dnl Modifies the CPPFLAGS with the right include directory and sets -dnl the 'have_SBLIMBASE' to either 'no' or 'yes' -dnl -AC_DEFUN([_CHECK_SBLIM_BASE], - [ - AC_MSG_CHECKING($1) - _ldflags=$LDFLAGS - LDFLAGS="$LDFLAGS -lcmpiOSBase_Common" - AC_TRY_LINK( - [ - #include - ], - [ - get_system_name(); - ], - [ - have_SBLIMBASE=yes - LDFLAGS=$_ldflags - dnl AC_MSG_RESULT(yes) - ], - [ - have_SBLIMBASE=no - LDFLAGS=$_ldflags - dnl AC_MSG_RESULT(no) - ]) - -]) - -AC_DEFUN([CHECK_SBLIM_BASE], - [ - AC_MSG_CHECKING(for SBLIM Base) - SBLIMBASE_CPP_FLAGS="$CPPFLAGS" - dnl Check just with the standard include paths - _CHECK_SBLIM_BASE(standard) - if test "$have_SBLIMBASE" == "yes"; then - dnl The standard include paths worked. - AC_MSG_RESULT(yes) - else - _DIRS_="/usr/include/sblim \ - /usr/local/include/sblim" - for _DIR_ in $_DIRS_ - do - _cppflags=$CPPFLAGS - _include_SBLIMBASE="$_DIR_" - CPPFLAGS="$CPPFLAGS -I$_include_SBLIMBASE" - _CHECK_SBLIM_BASE($_DIR_) - if test "$have_SBLIMBASE" == "yes"; then - dnl Found it - AC_MSG_RESULT(yes) - dnl Save the new -I parameter - SBLIMBASE_CPP_FLAGS="$CPPFLAGS" - LIBSBLIMBASE=-lcmpiOSBase_Common - break - fi - CPPFLAGS=$_cppflags - done - fi - CPPFLAGS=$SBLIMBASE_CPP_FLAGS - AC_SUBST(LIBSBLIMBASE) - if test "$have_SBLIMBASE" == "no"; then - AC_MSG_ERROR(no. The required SBLIM Base package is missing.) - fi - ] -) diff --git a/providers/cmpi-service/autoconfiscate.sh b/providers/cmpi-service/autoconfiscate.sh deleted file mode 100755 index 70a21a7..0000000 --- a/providers/cmpi-service/autoconfiscate.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/sh -# $Id: autoconfiscate.sh,v 1.2 2009/05/22 03:50:48 tyreld Exp $ -# ============================================================================ -# (C) Copyright IBM Corp. 2005, 2009 -# -# THIS FILE IS PROVIDED UNDER THE TERMS OF THE ECLIPSE PUBLIC LICENSE -# ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE -# CONSTITUTES RECIPIENTS ACCEPTANCE OF THE AGREEMENT. -# -# You can obtain a current copy of the Eclipse Public License from -# http://www.eclipse.org/legal/epl-v10.html -# -# Author: Viktor Mihajlovski, -# Contributors: Dr. Gareth S. Bestor, -# Last Updated: April 15, 2005 -# Description: -# Setup autoconf/automake build environment for package. -# Run this script as the first step of building this package. -# ============================================================================ -# NO CHANGES SHOULD BE NECESSARY TO THIS FILE -# ============================================================================ - -echo "Running aclocal ..." && -aclocal --force && - -echo "Running autoheader ..." && -autoheader --force && - -echo "Running libtool ..." && -libtoolize --force && - -echo "Running automake ..." && -automake --add-missing --force-missing && - -echo "Running autoconf ..." && -autoconf --force && - -echo "You may now run ./configure" - diff --git a/providers/cmpi-service/cmpi-service.spec b/providers/cmpi-service/cmpi-service.spec deleted file mode 100644 index 90f7a40..0000000 --- a/providers/cmpi-service/cmpi-service.spec +++ /dev/null @@ -1,91 +0,0 @@ -%global provider_dir %{_libdir}/cmpi - -Summary: service instrumentation -Name: cmpi-service -Version: 0.0.1 -Release: 1%{?dist} -License: GPLv2+ -Group: Applications/System -URL: http://www.redhat.com -Source0: %{name}-%{version}.tar.gz - -BuildRequires: libtool -Requires: cim-server -Requires: /etc/ld.so.conf.d -Requires(post): /sbin/ldconfig -Requires(postun): /sbin/ldconfig - -%description -Standards Based Linux Instrumentation Syslog Providers - -%prep -%setup -q - -%build -%ifarch s390 s390x ppc ppc64 -export CFLAGS="$RPM_OPT_FLAGS -fsigned-char" -%else -export CFLAGS="$RPM_OPT_FLAGS" -%endif -%configure \ - CIMSERVER=sfcb \ - PROVIDERDIR=%{provider_dir} -sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' libtool -sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool -make - -%install -rm -rf $RPM_BUILD_ROOT -make install DESTDIR=$RPM_BUILD_ROOT -# remove unused libtool files -rm -f $RPM_BUILD_ROOT/%{_libdir}/*a -rm -f $RPM_BUILD_ROOT/%{provider_dir}/*a -# shared libraries -mkdir -p $RPM_BUILD_ROOT/%{_sysconfdir}/ld.so.conf.d -echo "%{_libdir}/cmpi" > $RPM_BUILD_ROOT/%{_sysconfdir}/ld.so.conf.d/%{name}-%{_arch}.conf -# move libraries to provider dir -mv $RPM_BUILD_ROOT/%{_libdir}/lib[Ss]ervice*.so* $RPM_BUILD_ROOT/%{provider_dir} -# add shebang to the scripts -#sed -i -e '1i#!/bin/sh' $RPM_BUILD_ROOT/%{_bindir}/serviceutil.sh - -%files -%defattr(-,root,root,-) -%{_bindir}/serviceutil.sh -%{_bindir}/servicedisc.sh -%{provider_dir}/lib[Ss]ervice*.so* -%{_datadir}/%{name} -%config(noreplace) %{_sysconfdir}/ld.so.conf.d/%{name}-%{_arch}.conf - -%define SERVICE_SCHEMA %{_datadir}/%{name}/Linux_Service.mof -%define SERVICE_REGISTRATION %{_datadir}/%{name}/Linux_Service.registration - -%pre -# If upgrading, deregister old version -if [ $1 -gt 1 ]; then - %{_datadir}/%{name}/provider-register.sh -d \ - -r %{SERVICE_REGISTRATION} -m %{SERVICE_SCHEMA} > /dev/null 2>&1 || :; -fi - -%post -/sbin/ldconfig -if [ $1 -ge 1 ]; then -# Register Schema and Provider - this is higly provider specific - %{_datadir}/%{name}/provider-register.sh \ - -r %{SERVICE_REGISTRATION} -m %{SERVICE_SCHEMA} > /dev/null 2>&1 || :; -fi; - -%preun -# Deregister only if not upgrading -if [ $1 -eq 0 ]; then - %{_datadir}/%{name}/provider-register.sh -d \ - -r %{SERVICE_REGISTRATION} -m %{SERVICE_SCHEMA} > /dev/null 2>&1 || :; -fi - -%postun -p /sbin/ldconfig - -%clean -rm -rf $RPM_BUILD_ROOT - -%changelog -* Thu Mar 29 2012 Vitezslav Crhonek - 0.0.1-1 -- Initial support diff --git a/providers/cmpi-service/configure.ac b/providers/cmpi-service/configure.ac deleted file mode 100644 index fc0c9c6..0000000 --- a/providers/cmpi-service/configure.ac +++ /dev/null @@ -1,74 +0,0 @@ -# -*- Autoconf -*- -# Process this file with autoconf to produce a configure script. - -AC_PREREQ(2.59) -AC_INIT(SBLIM Service Provider, 0.0.1, vcrhonek@redhat.com, cmpi-service) -AC_CONFIG_HEADER([config.h]) -AM_INIT_AUTOMAKE - -AC_CANONICAL_HOST -case $host_cpu in - i*86) HW=INTEL;; - s390*) HW=S390;; - ppc*) HW=PPC;; - x86_64) HW=X86_64;; - ia64) HW=IA64;; - **) HW=GENERIC;; -esac - -# Configuration Arguments -AC_ARG_VAR([PROVIDERDIR],[the directory where the CMPI providers will be installed.]) -AC_ARG_VAR([CIMSERVER],[the target CIM server (pegasus|sfcb|openwbem|sniacimom).]) - -# Checks for programs. -AC_PROG_CC -AC_PROG_INSTALL -AC_PROG_LIBTOOL - -# Check for required CMPI header files (defined in acinclude.m4) -CHECK_CMPI - -# Check for required libraries (defined in acinclude.m4) -CHECK_PROVIDERDIR - -# Check for CIM Server (defined in acinclude.m4) -CHECK_CIMSERVER - -# Checks for header files. -AC_HEADER_DIRENT -AC_HEADER_STDC -AC_HEADER_SYS_WAIT -AC_CHECK_HEADERS([fcntl.h langinfo.h limits.h malloc.h stdlib.h string.h sys/time.h unistd.h]) - -# Checks for typedefs, structures, and compiler characteristics. -AC_C_CONST -AC_C_INLINE -AC_TYPE_MODE_T -AC_TYPE_OFF_T -AC_TYPE_SIZE_T -AC_HEADER_TIME -AC_STRUCT_TM - -AC_FUNC_MALLOC -AC_FUNC_STAT -AC_CHECK_FUNCS([gethostname strcasecmp strchr strdup strstr]) - -AC_CONFIG_FILES([Makefile]) - -# Extend CPPFLAGS -CPPFLAGS="$CPPFLAGS -D$HW" - -# Display configuration options -echo "-------------------------------------------------------" -echo "Configuration for $PACKAGE complete." -echo "" -echo "The following configuration options have been selected:" -echo "CIMSERVER: " $CIMSERVER -echo "PROVIDERDIR: " $PROVIDERDIR -echo "SYSLOG:" $SYSLOG -echo "CPPFLAGS:" $CPPFLAGS -echo "-------------------------------------------------------" - -AC_OUTPUT - -echo "You may now run make" diff --git a/providers/cmpi-service/mof/Linux_Service.mof b/providers/cmpi-service/mof/Linux_Service.mof deleted file mode 100644 index cf59c10..0000000 --- a/providers/cmpi-service/mof/Linux_Service.mof +++ /dev/null @@ -1,58 +0,0 @@ -// -// Linux_Service.mof -// -// Copyright (C) 2012 Red Hat, Inc. All rights reserved. -// -// 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, see . -// -// Red Hat Author(s): Vitezslav Crhonek -// - -[ Description("Class representing Linux Service"), - Provider("cmpi:Service") -] -class Linux_Service : CIM_Service -{ - [ Override("StartService"), - Provider("cmpi:Service") ] - uint32 StartService(); - - [ Override("StopService"), - Provider("cmpi:Service") ] - uint32 StopService(); - - [ Provider("cmpi:Service") ] - uint32 ReloadService(); - - [ Provider("cmpi:Service") ] - uint32 RestartService(); - - [ Provider("cmpi:Service") ] - uint32 TryRestartService(); - - [ Provider("cmpi:Service") ] - uint32 CondRestartService(); - - [ Provider("cmpi:Service") ] - uint32 ReloadOrRestartService(); - - [ Provider("cmpi:Service") ] - uint32 ReloadOrTryRestartService(); - - [ Provider("cmpi:Service") ] - uint32 TurnServiceOn(); - - [ Provider("cmpi:Service") ] - uint32 TurnServiceOff(); -}; diff --git a/providers/cmpi-service/mof/Linux_Service.registration b/providers/cmpi-service/mof/Linux_Service.registration deleted file mode 100644 index ecf288b..0000000 --- a/providers/cmpi-service/mof/Linux_Service.registration +++ /dev/null @@ -1,2 +0,0 @@ -# Classname Namespace Providername Libraryname Capabilities ... -Linux_Service root/cimv2 Service Service instance method diff --git a/providers/cmpi-service/provider-register.sh b/providers/cmpi-service/provider-register.sh deleted file mode 100755 index db0681c..0000000 --- a/providers/cmpi-service/provider-register.sh +++ /dev/null @@ -1,755 +0,0 @@ -#!/bin/sh -# $Id: provider-register.sh,v 1.2 2009/05/22 03:50:49 tyreld Exp $ -# ================================================================== -# (C) Copyright IBM Corp. 2005, 2009 -# -# THIS FILE IS PROVIDED UNDER THE TERMS OF THE ECLIPSE PUBLIC LICENSE -# ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE -# CONSTITUTES RECIPIENTS ACCEPTANCE OF THE AGREEMENT. -# -# You can obtain a current copy of the Eclipse Public License from -# http://www.eclipse.org/legal/epl-v10.html -# -# Author: Viktor Mihajlovski -# Contributors: -# Description: Script to install class definitions (MOFs) and -# registration data for a variety of supported CIMOMs -# ================================================================== - -pegasus_repository() -{ - for p in $PEGASUS_HOME /var/lib/Pegasus /var/lib/pegasus \ - /usr/local/var/lib/pegasus /var/local/lib/pegasus /var/opt/tog-pegasus - do - if test -d $p/repository - then - echo $p/$1 - return 0 - fi - done - return 1 -} - -pegasus_path() -{ - for p in $PEGASUS_HOME/bin /usr/bin /usr/sbin /usr/local/bin \ - /usr/local/sbin /opt/tog-pegasus/bin /opt/tog-pegasus/sbin - do - if test -x $p/$1 - then - echo $p/$1 - return 0 - fi - done - return 1 -} - -pegasus_transform() -{ - OUTFILE=$1 - shift - regfiles=$* - PROVIDERMODULES=`cat $regfiles 2> /dev/null | grep -v '^[[:space:]]*#.*' | cut -d ' ' -f 4 | sort | uniq` - if test x"$PROVIDERMODULES" = x - then - echo Failed to read registration files >&2 - return 1 - fi - PROVIDERS=`cat $regfiles 2> /dev/null | grep -v '^[[:space:]]*#.*' | cut -d ' ' -f 3-4 | sort | uniq` - -# produce ProviderModules - echo > $OUTFILE - chatter "Processing provider modules:" $PROVIDERMODULES - for pm in $PROVIDERMODULES - do - cat >> $OUTFILE <> $OUTFILE <&2 - return 1;; - esac - done - cat >> $OUTFILE < /dev/null 2>&1 - then - CIMMOF=`pegasus_path cimmof` - if test $? != 0 - then - echo "Error: cimmof not found" >&2 - return 1 - fi - state=active - else - CIMMOF=`pegasus_path cimmofl` - if test $? != 0 - then - echo "Error: cimmofl not found" >&2 - return 1 - fi - PEGASUSREPOSITORY=`pegasus_repository` - if test $? != 0 - then - echo "Error: pegasus repository not found" >&2 - return 1 - fi - CIMMOF="$CIMMOF -R $PEGASUSREPOSITORY" - state=inactive - fi - - mofpath= - mymofs= - myregs= - mofmode=1 - namespace=$1 - shift - - while test x$1 != x - do - if test $1 = ":" - then - mofmode=0 - shift - continue - fi - if test $mofmode = 1 - then - if test x$mofpath = x - then - mofpath=`dirname $1` - fi - mymofs="$mymofs $1" - else - myregs="$myregs $1" - fi - shift - done - - for _TEMPDIR in /var/tmp /tmp - do - if test -w $_TEMPDIR - then - _REGFILENAME=$_TEMPDIR/$$.mof - break - fi - done - - - trap "rm -f $_REGFILENAME" EXIT - - if pegasus_transform $_REGFILENAME $myregs - then - chatter Registering providers with $state cimserver - $CIMMOF -uc -I $mofpath -n $namespace $mymofs && - $CIMMOF -uc -n root/PG_Interop $_REGFILENAME - else - echo "Failed to build pegasus registration MOF." >&2 - return 1 - fi -} - -pegasus_uninstall() -{ - mymofs= - myregs= - mofmode=1 - namespace=$1 - shift - - while test x$1 != x - do - if test $1 = ":" - then - mofmode=0 - shift - continue - fi - if test $mofmode = 1 - then - mymofs="$mymofs $1" - else - myregs="$myregs $1" - fi - shift - done - - if ps -C cimserver > /dev/null 2>&1 - then - PROVIDERMODULES=`cat $myregs 2> /dev/null | grep -v '^[[:space:]]*#.*' | cut -d ' ' -f 4 | sort | uniq` - if test x"$PROVIDERMODULES" = x - then - echo Failed to read registration files >&2 - return 1 - fi - CIMPROVIDER=`pegasus_path cimprovider` - if test $? != 0 - then - echo "Error: cimprovider not found" >&2 - return 1 - fi - for pm in $PROVIDERMODULES - do - chatter "Remove provider module" $pm - $CIMPROVIDER -d -m $pm > /dev/null && - $CIMPROVIDER -r -m $pm > /dev/null - done - WBEMEXEC=`pegasus_path wbemexec` - if test $? != 0 - then - echo "Error: wbemexec not found" >&2 - return 1 - fi - CLASSES=`cat $myregs 2> /dev/null | grep -v '^[[:space:]]*#.*' | cut -d ' ' -f 1 | grep -v '^CIM_'` - - for _TEMPDIR in /var/tmp /tmp - do - if test -w $_TEMPDIR - then - _DELETE_NAME=$TEMPDIR/delete-class.mof - break - fi - done - - trap "rm -f $_DELETE_NAME" EXIT - - for cls in $CLASSES - do - chatter Delete CIM Class $cls - cat > $_DELETE_NAME < - - - - - -EOFA - for ns in `echo $namespace | sed 's?/? ?'g` - do - cat >> $_DELETE_NAME < -EOFX - done - cat >> $_DELETE_NAME < - - - - - - - -EOFE - $WBEMEXEC > /dev/null $_DELETE_NAME - done - else - echo "Sorry, cimserver must be running to deregister the providers." >&2 - return 1 - fi -} - -sfcb_transform() -{ - OUTFILE=$1 - shift - regfiles=$* - -#produce sfcb registraion - for rf in $regfiles - do - cat $rf | grep -v '^[[:space:]]*#.*' | while read CLASSNAME NAMESPACE PROVIDERNAME PROVIDERMODULE CAPS - do - chatter "Registering class" $CLASSNAME - cat >> $OUTFILE < /dev/null 2>&1 - then - # sfcb is running -- need to restart - for INITSCRIPT in /etc/rc.d/init.d/sblim-sfcb /etc/init.d/sfcb /usr/local/etc/init.d/sfcb none - do - if test -x $INITSCRIPT - then - break; - fi - done - chatter "Shutting down sfcb." - if test $INITSCRIPT = none - then - killall sfcbd - else - $INITSCRIPT stop - fi - t=0 - while ps -C sfcbd > /dev/null 2>&1 - do - sleep 1 - t=`expr $t + 1` - if test $t -gt 10 - then - echo "Timed out waiting for sfcb shutdown..." >&2 - echo "Please stop sfcb manually and rebuild the repository using sfcbrepos." >&2 - return 1 - fi - done - chatter "Rebuilding repository." - sfcbrepos -f $endian - if test $? != 0 - then - echo "Repository rebuild failed." >&2 - return 1 - fi - - if test $INITSCRIPT = none - then - echo "No init script found - you need to start sfcbd manually." >&2 - return 1 - else - chatter "Restarting sfcb." - $INITSCRIPT start - fi - else - # Not running - rebuild repository - chatter "Rebuilding repository." - sfcbrepos -f $endian - fi -} - -sfcb_install() -{ - mymofs= - myregs= - mofmode=1 - namespace=$1 - shift - - while test x$1 != x - do - if test $1 = ":" - then - mofmode=0 - shift - baseregname=`basename $1 .registration` - continue - fi - if test $mofmode = 1 - then - mymofs="$mymofs $1" - else - myregs="$myregs $1" - fi - shift - done - - for _TEMPDIR in /var/tmp /tmp - do - if test -w $_TEMPDIR - then - _REGFILENAME=$_TEMPDIR/$baseregname.reg - break - fi - done - - trap "rm -f $_REGFILENAME" EXIT - - if sfcb_transform $_REGFILENAME $myregs - then - chatter "Staging provider registration." - sfcbstage -n $namespace -r $_REGFILENAME $mymofs - if test $? != 0 - then - echo "Failed to stage provider registration." >&2 - return 1 - fi - sfcb_rebuild - else - echo "Failed to build sfcb registration file." >&2 - return 1 - fi -} - -sfcb_uninstall() -{ - mymofs= - namespace=$1 - shift - - while test x$1 != x - do - if test $1 = ":" - then - shift - baseregname=`basename $1 .registration` - break - fi - mymofs="$mymofs `basename $1`" - shift - done - - # "Unstage" MOFs and the registration file - chatter "Unstaging provider registrations." - sfcbunstage -n $namespace -r $baseregname.reg $mymofs - - # Rebuild repository - sfcb_rebuild -} - -openwbem_transform() -{ - OUTFILE=$1 - shift - moffiles=$* - - if rm -f $OUTFILE - then - for _f in $moffiles - do - sed "s/Provider *( *\"cmpi:/Provider(\"cmpi::/g" < $_f >> $OUTFILE - done - fi -} - -openwbem_repository() -{ - for p in /var/lib/openwbem /usr/local/var/openwbem - do - if test -f $p/schema.dat - then - echo $p - return 0 - fi - done - return 1 -} - -openwbem_install() -{ - CIMMOF=`which owmofc 2> /dev/null` - if test $? != 0 - then - echo "Error: cimmof not found" >&2 - return 1 - fi - - if ps -C owcimomd > /dev/null 2>&1 - then - state=active - else - CIMMOF="$CIMMOF -d `openwbem_repository`" - if test $? != 0 - then - echo "Error: OpenWBEM repository not found" >&2 - return 1 - fi - state=inactive - fi - - for _TEMPDIR in /var/tmp /tmp - do - if test -w $_TEMPDIR - then - _REGFILENAME=$_TEMPDIR/$$.mof - break - fi - done - - trap "rm -f $_REGFILENAME" EXIT - - if openwbem_transform $_REGFILENAME $* - then - chatter Registering providers with $state owcimomd - $CIMMOF $_REGFILENAME > /dev/null - else - echo "Failed to build OpenWBEM registration MOF." >&2 - return 1 - fi -} - -openwbem_uninstall() -{ - CIMMOF=`which owmofc 2> /dev/null` - if test $? != 0 - then - echo "Error: cimmof not found" >&2 - return 1 - fi - - if ps -C owcimomd > /dev/null 2>&1 - then - state=active - else - CIMMOF="$CIMMOF -d `openwbem_repository`" - if test $? != 0 - then - echo "Error: OpenWBEM repository not found" >&2 - return 1 - fi - state=inactive - fi - - for _TEMPDIR in /var/tmp /tmp - do - if test -w $_TEMPDIR - then - _REGFILENAME=$_TEMPDIR/$$.mof - break - fi - done - - trap "rm -f $_REGFILENAME" EXIT - - if openwbem_transform $_REGFILENAME $* - then - chatter Deregistering providers with $state owcimomd - $CIMMOF -r $_REGFILENAME > /dev/null - else - echo "Failed to build OpenWBEM registration MOF." >&2 - return 1 - fi -} - -cim_server() -{ - for exname in sfcbd cimserver owcimomd - do - if pegasus_path $exname > /dev/null - then - case $exname in - sfcbd) echo sfcb; return 0;; - cimserver) echo pegasus; return 0;; - owcimomd) echo openwbem; return 0;; - esac - break; - fi - done - echo unknown - return 1 -} - -usage() -{ - echo "usage: $0 [-h] [-v] [-d] [-t ] [-n ] -r regfile ... -m mof ..." -} - -chatter() -{ - if test x$verbose != x - then - echo $* - fi -} - -gb_getopt() -{ - rmode=0 - mmode=0 - options= - moffiles= - registrations= - while [ -n "$1" ] - do - case $1 in - -r) mmode=0; - rmode=1; - shift;; - -m) mmode=1; - rmode=0; - shift;; - -*) mmode=0; - rmode=0; - options="$options $1"; - shift;; - **) if [ $mmode = 1 ] - then moffiles="$moffiles $1" - elif [ $rmode = 1 ] - then registrations="$registrations -r $1" - else options="$options $1"; - fi; - shift;; - esac - done - echo $options $registrations $moffiles -} - -prepargs=`gb_getopt $*` -args=`getopt dvhX:t:r:n: $prepargs` -rc=$? - -if [ $rc = 127 ] -then - echo "warning: getopt not found ...continue without syntax check" - args=$prepargs -elif [ $rc != 0 ] -then - usage $0 - exit 1 -fi - -namespace="root/cimv2" - -set -- $args - -while [ -n "$1" ] -do - case $1 in - -h) help=1; - shift; - break;; - -v) verbose=1; - shift;; - -X) endian="-X $2"; - shift 2;; - -d) deregister=1; - shift;; - -t) cimserver=$2; - shift 2;; - -n) namespace=$2; - shift 2;; - -r) regs="$regs $2"; - shift 2;; - --) shift; - break;; - **) break;; - esac -done - -mofs=$* - -if [ "$help" = "1" ] -then - usage - echo -e "\t-h display help message" - echo -e "\t-v verbose mode" - echo -e "\t-d deregister provider and uninstall schema" - echo -e "\t-t specify cimserver type (pegasus|sfcb|openwbem|sniacimom)" - echo -e "\t-r specify registration files" - echo -e "\t-m specify schema mof files" - echo -e "\t-X create repository for alternate platform (sfcb only at the moment)." - echo -e "\t-n target namespace definition (default: root/cimv2)." - echo - echo Use this command to install schema mofs and register providers. - echo CIM Server Type is required as well as at least one registration file and one mof. - exit 0 -fi - -if test x"$mofs" = x || test x"$regs" = x -then - usage $0 - exit 1 -fi - -if test x$cimserver = x -then - cimserver=`cim_server` - if test $? = 0 - then - chatter "Autoselected CIM server type:" $cimserver - else - echo "CIM server type could not be determined, specify with -t." >&2 - exit 1 - fi -fi - -if test x$deregister = x -then - case $cimserver in - pegasus) pegasus_install $namespace $mofs ":" $regs;; - sfcb) sfcb_install $namespace $mofs ":" $regs;; - openwbem) openwbem_install $mofs ;; - sniacimom) echo sniacimom not yet supported && exit 1 ;; - **) echo "Invalid CIM Server Type " $cimserver && exit 1;; - esac -else - case $cimserver in - pegasus) pegasus_uninstall $namespace $mofs ":" $regs;; - sfcb) sfcb_uninstall $namespace $mofs ":" $regs;; - openwbem) openwbem_uninstall $mofs ;; - sniacimom) echo sniacimom not yet supported && exit 1 ;; - **) echo "Invalid CIM Server Type " $cimserver && exit 1;; - esac -fi diff --git a/providers/cmpi-service/util/servicedisc.sh b/providers/cmpi-service/util/servicedisc.sh deleted file mode 100755 index 6d6fbb7..0000000 --- a/providers/cmpi-service/util/servicedisc.sh +++ /dev/null @@ -1,45 +0,0 @@ -# -# servicedisc.sh -# -# Copyright (C) 2012 Red Hat, Inc. All rights reserved. -# -# 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, see . -# -# Red Hat Author(s): Vitezslav Crhonek -# - -# path to systemd service directory -SYSTEMD_SDIR=/lib/systemd/system -# path to sysv service initscript directory -SYSV_SDIR=/etc/rc.d/init.d - -if [ -d $SYSTEMD_SDIR ]; -then - for i in $SYSTEMD_SDIR/*.service; - do - SFILE=${i#$SYSTEMD_SDIR/} - echo ${SFILE%.service} - done - exit 0 -elif [ -d $SYSV_SDIR ]; -then - for i in $SYSV_SDIR/*; - do - echo ${i#$SYSV_SDIR/} - done - exit 0 -fi - -# unsupported init system -exit 1 diff --git a/providers/cmpi-service/util/serviceutil.c b/providers/cmpi-service/util/serviceutil.c deleted file mode 100644 index 829d0ec..0000000 --- a/providers/cmpi-service/util/serviceutil.c +++ /dev/null @@ -1,262 +0,0 @@ -/* - * serviceutil.c - * - * Copyright (C) 2012 Red Hat, Inc. All rights reserved. - * - * 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, see . - * - * Based on syslogserviceutil.c from sblim-cmpi-syslog written by - * R Sharada , Copyright (c) IBM Corp. 2003, 2009 - * - * Red Hat Author(s): Vitezslav Crhonek - * - */ - -#define _GNU_SOURCE - -#include -#include -#include -#include -#include -#include - -#include "serviceutil.h" - -#define OPERATION_BUFSIZE 300 -#define STATUS_BUFSIZE 2000 -#define MAX_SLIST_CNT 1000 - -/* FIXME don't use tmpnam function */ - -char *suscript = "serviceutil.sh"; -char *sdscript = "servicedisc.sh"; - -typedef struct { - FILE *fp; - char name[L_tmpnam]; - FILE *fp2; - char name2[L_tmpnam]; -} Control; - -void -Service_Free_SList(SList *slist) -{ - int i; - - if (slist == NULL) - return; - - for(i = 0; i < slist->cnt; i++) - free(slist->name[i]); - free(slist->name); - free(slist); - - return; -} - -SList * -Service_Find_All(void) -{ - char svname[256]; - char cmdbuffer[STATUS_BUFSIZE]; - Control *cc = malloc(sizeof(Control)); - SList *slist; - - if (cc && tmpnam(cc->name)) - { - snprintf(cmdbuffer, STATUS_BUFSIZE, "%s > %s", sdscript, cc->name); - if (system(cmdbuffer) == 0) - cc->fp = fopen(cc->name, "r"); - else - { - free(cc); - cc=NULL; - return NULL; - } - slist = malloc(sizeof(SList)); - slist->name = malloc(MAX_SLIST_CNT * sizeof(char *)); - slist->cnt = 0; - while (fgets(svname, sizeof(svname), cc->fp) != NULL) - { - slist->name[slist->cnt] = strndup(svname, strlen(svname) - 1); - slist->cnt++; - } - return slist; - } - else - { - return NULL; - } -} - -void * -Service_Begin_Enum(const char *service) -{ - char cmdbuffer[STATUS_BUFSIZE]; - Control *cc = malloc(sizeof(Control)); - - memset(&cmdbuffer, '\0', sizeof(cmdbuffer)); - - if (cc && tmpnam(cc->name) && tmpnam(cc->name2)) - { - snprintf(cmdbuffer, STATUS_BUFSIZE, "%s status %s > %s", suscript, service, cc->name); - if (system(cmdbuffer) == 0) - { - cc->fp = fopen(cc->name, "r"); - snprintf(cmdbuffer, STATUS_BUFSIZE, "%s is-enabled %s > %s", suscript, service, cc->name2); - if (system(cmdbuffer) == 0) - { - cc->fp2 = fopen(cc->name2, "r"); - } - else - { - free(cc); - cc=NULL; - } - } - else - { - free(cc); - cc=NULL; - } - } - - return cc; -} - -int -Service_Next_Enum(void *handle, Service* svc, const char *service) -{ - char result[2000]; - char svname[256]; - int pid = 0; - Control *cc = (Control *) handle; - int state = 0, ret = 0; - - memset(&result, '\0', sizeof(result)); - memset(&svname, '\0', sizeof(svname)); - - if (cc && svc) - { - svc->svEnabledDefault = 5; - while (fgets(result, sizeof(result), cc->fp) != NULL) - { - if (strncmp(result, "stopped", 7) == 0) - { - svc->pid = 0; - ret = 1; - } - else - { - state = sscanf(result,"%d %s", &pid, svname); - svc->pid = pid; - if (state) ret = 1; - } - } - svc->svName = strdup(service); - - while (fgets(result, sizeof(result), cc->fp2) != NULL) - { - if (strncmp(result, "enabled", 7) == 0) - svc->svEnabledDefault = 2; - if (strncmp(result, "disabled", 8) == 0) - svc->svEnabledDefault = 3; - } - } - - if (svc) - { - if (svc->pid) - { - svc->svStarted = 1; - svc->svStatus = strdup("OK"); - } - else - { - svc->svStarted = 0; - svc->svStatus = strdup("Stopped"); - } - } - - return ret; -} - -void -Service_End_Enum(void *handle) -{ - Control *cc = (Control *) handle; - - if (cc) { - fclose(cc->fp); - fclose(cc->fp2); - remove(cc->name); - remove(cc->name2); - free(cc); - } -} - -int -Service_Operation(const char *service, const char *method, char *result, int resultlen) -{ - char cmdbuffer[OPERATION_BUFSIZE]; - FILE *fcmdout = NULL; - char *op = NULL; - char *cmdout; - int fd; - - memset(&cmdbuffer, '\0', sizeof(cmdbuffer)); - memset(&cmdout, '\0', sizeof(cmdout)); - asprintf(&cmdout, "%s", "/tmp/Service_OperationXXXXXX"); - - if (!strcasecmp(method, "startservice")) - op="start"; - else if (!strcasecmp(method, "stopservice")) - op="stop"; - else if (!strcasecmp(method, "reloadservice")) - op="reload"; - else if (!strcasecmp(method, "restartservice")) - op="restart"; - else if (!strcasecmp(method, "tryrestartservice")) - op="try-restart"; - else if (!strcasecmp(method, "condrestartservice")) - op="condrestart"; - else if (!strcasecmp(method, "reloadorrestartservice")) - op="reload-or-restart"; - else if (!strcasecmp(method, "reloadortryrestartservice")) - op="reload-or-try-restart"; - else if (!strcasecmp(method, "turnserviceon")) - op="enable"; - else if (!strcasecmp(method, "turnserviceoff")) - op="disable"; - else - return -1; - - if (op && ((fd = mkstemp(cmdout)) != -1)) - { - snprintf(cmdbuffer, OPERATION_BUFSIZE, "%s %s %s > %s", suscript, op, service, cmdout); - if (system(cmdbuffer) == 0) - { - /* we got some output? */ - if ((fcmdout = fopen(cmdout, "r")) && fgets(result, resultlen, fcmdout)) - { - fclose(fcmdout); - } - close(fd); - return 0; - } - } - - return 1; -} diff --git a/providers/cmpi-service/util/serviceutil.h b/providers/cmpi-service/util/serviceutil.h deleted file mode 100644 index a4a9d11..0000000 --- a/providers/cmpi-service/util/serviceutil.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * serviceutil.sh - * - * Copyright (C) 2012 Red Hat, Inc. All rights reserved. - * - * 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, see . - * - * Based on syslogserviceutil.h from sblim-cmpi-syslog written by - * R Sharada , Copyright (c) IBM Corp. 2003, 2009 - * - * Red Hat Author(s): Vitezslav Crhonek - * - */ - -#ifndef SERVICEUTIL_H -#define SERVICEUTIL_H - -#include - -#ifdef DEBUG -#define service_debug(fd, args...) fprintf(fd, args) -#else -#define service_debug(a, b...) -#endif - -#define ARRAY_SIZE(name) (sizeof(name) / sizeof(name[0])) - -struct _Service { - char *svSystemCCname; - char *svSystemname; - char *svCCname; - char *svName; /* "rsyslog", "httpd", ... */ - char *svStatus; /* "Stopped", "OK" */ - int *svEnabledDefault; /* 5 - "Not Applicable", 2 - "Enabled", 3 - "Disabled" */ - int svStarted; /* 0, 1 */ - int pid; /* PID */ -}; - -struct _SList { - char **name; - int cnt; -}; - -typedef struct _Service Service; -typedef struct _SList SList; - -void Service_Free_SList(SList *slist); -SList *Service_Find_All(void); - -void *Service_Begin_Enum(const char *service); -int Service_Next_Enum(void *handle, Service* svc, const char *service); -void Service_End_Enum(void *handle); - -int Service_Operation(const char *service, const char *method, char *result, int resultlen); - -#endif diff --git a/providers/cmpi-service/util/serviceutil.sh b/providers/cmpi-service/util/serviceutil.sh deleted file mode 100755 index c4d9efd..0000000 --- a/providers/cmpi-service/util/serviceutil.sh +++ /dev/null @@ -1,90 +0,0 @@ -# -# serviceutil.sh -# -# Copyright (C) 2012 Red Hat, Inc. All rights reserved. -# -# 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, see . -# -# Based on syslog-service.sh from sblim-cmpi-syslog written by -# R Sharada , Copyright (c) IBM Corp. 2003, 2009 -# -# Red Hat Author(s): Vitezslav Crhonek -# - -# path to systemd service directory -SYSTEMD_SDIR=/lib/systemd/system -# path to sysv service initscript directory -SYSV_SDIR=/etc/rc.d/init.d -# service unit name -SUNIT_NAME=$2.service - -if [ -f $SYSTEMD_SDIR/$SUNIT_NAME ]; -then - case "$1" in - start|stop|reload|restart|try-restart|condrestart|reload-or-restart|reload-or-try-restart|enable|disable|is-enabled) - systemctl $1 $SUNIT_NAME - ;; - status) - output=`systemctl status $SUNIT_NAME` - if echo "$output" | grep Active: | grep inactive > /dev/null 2>&1; then - echo "stopped" - elif echo "$output" | grep Active: | grep failed > /dev/null 2>&1; then - echo "stopped" # TODO - should be failed and propagated to the state property - else - pid=`echo "$output" | sed -n -e 's/^[ \t]\+Main PID:[ \t]\+\([0-9]\+\).*/\1/p'` - echo "$pid $2" - fi - ;; - *) - echo "Unsupported method!" - exit 1 - esac -elif [ -f $SYSV_SDIR/$2 ]; -then - case "$1" in - start|stop|reload|restart|condrestart) - $SYSV_SDIR/$2 $1 - ;; - status) - output=`$SYSV_SDIR/$2 status` - if echo "$output" | grep "stopped" > /dev/null 2>&1; then - echo "stopped" - elif echo "$output" | grep "not running" > /dev/null 2>&1; then - echo "stopped" - elif echo "$output" | grep "running" > /dev/null 2>&1; then - echo "$output" | awk '{print $3 " " $1}' | tr -d '=)=' - fi - ;; - is-enabled) - CUR_RLVL=`runlevel | cut -d " " -f 2` - output=`chkconfig --list tog-pegasus | cut -f $((CUR_RLVL + 2))` - if echo "$output" | grep "on" > /dev/null 2>&1; then - echo "enabled" - elif echo "$output" | grep "off" > /dev/null 2>&1; then - echo "disabled" - fi - ;; - enable) - chkconfig $2 on - ;; - disable) - chkconfig $2 off - ;; - *) - echo "Unsupported method!" - exit 1 - esac -fi - -exit 0 diff --git a/providers/power/CMakeLists.txt b/providers/power/CMakeLists.txt deleted file mode 100644 index 72087b7..0000000 --- a/providers/power/CMakeLists.txt +++ /dev/null @@ -1,19 +0,0 @@ - -cmake_minimum_required (VERSION 2.6) - -set(CMAKE_C_FLAGS "-std=c99 -Wall -pedantic -g") - -add_subdirectory(src) - -if(CMAKE_SIZEOF_VOID_P EQUAL 4) - set(LIB_SUFFIX "") -else(CMAKE_SIZEOF_VOID_P EQUAL 4) - SET(LIB_SUFFIX 64) -endif(CMAKE_SIZEOF_VOID_P EQUAL 4) - -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/src/Linux_PowerManagement.registration DESTINATION share/sblim-cmpi-power/) -install(FILES Linux_PowerManagement.mof DESTINATION share/sblim-cmpi-power/) -install(FILES provider-register.sh DESTINATION share/sblim-cmpi-power/) - -add_custom_target(register - ${CMAKE_CURRENT_SOURCE_DIR}/provider-register.sh -m ${CMAKE_CURRENT_SOURCE_DIR}/Linux_PowerManagement.mof -r ${CMAKE_CURRENT_BINARY_DIR}/src/Linux_PowerManagement.registration) diff --git a/providers/power/Linux_PowerManagement.mof b/providers/power/Linux_PowerManagement.mof deleted file mode 100644 index 21dfa38..0000000 --- a/providers/power/Linux_PowerManagement.mof +++ /dev/null @@ -1,58 +0,0 @@ -[ Provider("cmpi:cmpiLinux_PowerManagement") ] -class Linux_PowerManagementService: CIM_PowerManagementService -{ -}; - -[ Association, - Provider("cmpi:cmpiLinux_PowerManagement") ] -class Linux_AssociatedPowerManagementService: CIM_AssociatedPowerManagementService -{ - [ Override ("ServiceProvided"), - Max ( 1 ), - Description ( "The Service that is available." )] - Linux_PowerManagementService REF ServiceProvided; - - [ Override ("UserOfService"), - Description ( "The ManagedElement that can use the Service." )] - Linux_ComputerSystem REF UserOfService; -}; - -[ Provider("cmpi:cmpiLinux_PowerManagement") ] -class Linux_PowerManagementCapabilities: CIM_PowerManagementCapabilities -{ -}; - -[ Association, - Provider("cmpi:cmpiLinux_PowerManagement") ] -class Linux_HostedService: CIM_HostedService -{ - [ Override ("Antecedent"), - Min ( 1 ), - Max ( 1 ), - Description ( "The hosting System." )] - Linux_ComputerSystem REF Antecedent; - - [ Override ( "Dependent" ), - Weak, - Description ( "The Service hosted on the System." )] - Linux_PowerManagementService REF Dependent; -}; - -[ Provider("cmpi:cmpiLinux_PowerManagement") ] -class Linux_ConcreteJob: CIM_ConcreteJob -{ -}; - -[ Provider("cmpi:cmpiLinux_PowerManagement") ] -class Linux_ElementCapabilities: CIM_ElementCapabilities -{ - [ Key, - Min ( 1 ), - Description ( "The managed element." )] - Linux_PowerManagementService REF ManagedElement; - - [ Key, - Description ( "The Capabilities object associated with the element." )] - Linux_PowerManagementCapabilities REF Capabilities; -}; - diff --git a/providers/power/provider-register.sh b/providers/power/provider-register.sh deleted file mode 100755 index b156427..0000000 --- a/providers/power/provider-register.sh +++ /dev/null @@ -1,755 +0,0 @@ -#!/bin/sh -# $Id: provider-register.sh,v 1.9 2009/05/23 02:52:50 tyreld Exp $ -# ================================================================== -# (C) Copyright IBM Corp. 2002, 2009, 2009 -# -# THIS FILE IS PROVIDED UNDER THE TERMS OF THE ECLIPSE PUBLIC LICENSE -# ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE -# CONSTITUTES RECIPIENTS ACCEPTANCE OF THE AGREEMENT. -# -# You can obtain a current copy of the Eclipse Public License from -# http://www.eclipse.org/legal/epl-v10.html -# -# Author: Viktor Mihajlovski -# Contributors: -# Description: Script to install class definitions (MOFs) and -# registration data for a variety of supported CIMOMs -# ================================================================== - -pegasus_repository() -{ - for p in $PEGASUS_HOME /var/lib/Pegasus /var/lib/pegasus \ - /usr/local/var/lib/pegasus /var/local/lib/pegasus /var/opt/tog-pegasus - do - if test -d $p/repository - then - echo $p/$1 - return 0 - fi - done - return 1 -} - -pegasus_path() -{ - for p in $PEGASUS_HOME/bin /usr/bin /usr/sbin /usr/local/bin \ - /usr/local/sbin /opt/tog-pegasus/bin /opt/tog-pegasus/sbin - do - if test -x $p/$1 - then - echo $p/$1 - return 0 - fi - done - return 1 -} - -pegasus_transform() -{ - OUTFILE=$1 - shift - regfiles=$* - PROVIDERMODULES=`cat $regfiles 2> /dev/null | grep -v '^[[:space:]]*#.*' | cut -d ' ' -f 4 | sort | uniq` - if test x"$PROVIDERMODULES" = x - then - echo Failed to read registration files >&2 - return 1 - fi - PROVIDERS=`cat $regfiles 2> /dev/null | grep -v '^[[:space:]]*#.*' | cut -d ' ' -f 3-4 | sort | uniq` - -# produce ProviderModules - echo > $OUTFILE - chatter "Processing provider modules:" $PROVIDERMODULES - for pm in $PROVIDERMODULES - do - cat >> $OUTFILE <> $OUTFILE <&2 - return 1;; - esac - done - cat >> $OUTFILE < /dev/null 2>&1 - then - CIMMOF=`pegasus_path cimmof` - if test $? != 0 - then - echo "Error: cimmof not found" >&2 - return 1 - fi - state=active - else - CIMMOF=`pegasus_path cimmofl` - if test $? != 0 - then - echo "Error: cimmofl not found" >&2 - return 1 - fi - PEGASUSREPOSITORY=`pegasus_repository` - if test $? != 0 - then - echo "Error: pegasus repository not found" >&2 - return 1 - fi - CIMMOF="$CIMMOF -R $PEGASUSREPOSITORY" - state=inactive - fi - - mofpath= - mymofs= - myregs= - mofmode=1 - namespace=$1 - shift - - while test x$1 != x - do - if test $1 = ":" - then - mofmode=0 - shift - continue - fi - if test $mofmode = 1 - then - if test x$mofpath = x - then - mofpath=`dirname $1` - fi - mymofs="$mymofs $1" - else - myregs="$myregs $1" - fi - shift - done - - for _TEMPDIR in /var/tmp /tmp - do - if test -w $_TEMPDIR - then - _REGFILENAME=$_TEMPDIR/$$.mof - break - fi - done - - - trap "rm -f $_REGFILENAME" EXIT - - if pegasus_transform $_REGFILENAME $myregs - then - chatter Registering providers with $state cimserver - $CIMMOF -uc -I $mofpath -n $namespace $mymofs && - $CIMMOF -uc -n root/PG_Interop $_REGFILENAME - else - echo "Failed to build pegasus registration MOF." >&2 - return 1 - fi -} - -pegasus_uninstall() -{ - mymofs= - myregs= - mofmode=1 - namespace=$1 - shift - - while test x$1 != x - do - if test $1 = ":" - then - mofmode=0 - shift - continue - fi - if test $mofmode = 1 - then - mymofs="$mymofs $1" - else - myregs="$myregs $1" - fi - shift - done - - if ps -C cimserver > /dev/null 2>&1 - then - PROVIDERMODULES=`cat $myregs 2> /dev/null | grep -v '^[[:space:]]*#.*' | cut -d ' ' -f 4 | sort | uniq` - if test x"$PROVIDERMODULES" = x - then - echo Failed to read registration files >&2 - return 1 - fi - CIMPROVIDER=`pegasus_path cimprovider` - if test $? != 0 - then - echo "Error: cimprovider not found" >&2 - return 1 - fi - for pm in $PROVIDERMODULES - do - chatter "Remove provider module" $pm - $CIMPROVIDER -d -m $pm > /dev/null && - $CIMPROVIDER -r -m $pm > /dev/null - done - WBEMEXEC=`pegasus_path wbemexec` - if test $? != 0 - then - echo "Error: wbemexec not found" >&2 - return 1 - fi - CLASSES=`cat $myregs 2> /dev/null | grep -v '^[[:space:]]*#.*' | cut -d ' ' -f 1 | grep -v '^CIM_'` - - for _TEMPDIR in /var/tmp /tmp - do - if test -w $_TEMPDIR - then - _DELETE_NAME=$TEMPDIR/delete-class.mof - break - fi - done - - trap "rm -f $_DELETE_NAME" EXIT - - for cls in $CLASSES - do - chatter Delete CIM Class $cls - cat > $_DELETE_NAME < - - - - - -EOFA - for ns in `echo $namespace | sed 's?/? ?'g` - do - cat >> $_DELETE_NAME < -EOFX - done - cat >> $_DELETE_NAME < - - - - - - - -EOFE - $WBEMEXEC > /dev/null $_DELETE_NAME - done - else - echo "Sorry, cimserver must be running to deregister the providers." >&2 - return 1 - fi -} - -sfcb_transform() -{ - OUTFILE=$1 - shift - regfiles=$* - -#produce sfcb registraion - for rf in $regfiles - do - cat $rf | grep -v '^[[:space:]]*#.*' | while read CLASSNAME NAMESPACE PROVIDERNAME PROVIDERMODULE CAPS - do - chatter "Registering class" $CLASSNAME - cat >> $OUTFILE < /dev/null 2>&1 - then - # sfcb is running -- need to restart - for INITSCRIPT in /etc/init.d/sfcb /usr/local/etc/init.d/sfcb none - do - if test -x $INITSCRIPT - then - break; - fi - done - chatter "Shutting down sfcb." - if test $INITSCRIPT = none - then - killall sfcbd - else - $INITSCRIPT stop - fi - t=0 - while ps -C sfcbd > /dev/null 2>&1 - do - sleep 1 - t=`expr $t + 1` - if test $t -gt 10 - then - echo "Timed out waiting for sfcb shutdown..." >&2 - echo "Please stop sfcb manually and rebuild the repository using sfcbrepos." >&2 - return 1 - fi - done - chatter "Rebuilding repository." - sfcbrepos -f $endian - if test $? != 0 - then - echo "Repository rebuild failed." >&2 - return 1 - fi - - if test $INITSCRIPT = none - then - echo "No init script found - you need to start sfcbd manually." >&2 - return 1 - else - chatter "Restarting sfcb." - $INITSCRIPT start - fi - else - # Not running - rebuild repository - chatter "Rebuilding repository." - sfcbrepos -f $endian - fi -} - -sfcb_install() -{ - mymofs= - myregs= - mofmode=1 - namespace=$1 - shift - - while test x$1 != x - do - if test $1 = ":" - then - mofmode=0 - shift - baseregname=`basename $1 .registration` - continue - fi - if test $mofmode = 1 - then - mymofs="$mymofs $1" - else - myregs="$myregs $1" - fi - shift - done - - for _TEMPDIR in /var/tmp /tmp - do - if test -w $_TEMPDIR - then - _REGFILENAME=$_TEMPDIR/$baseregname.reg - break - fi - done - - trap "rm -f $_REGFILENAME" EXIT - - if sfcb_transform $_REGFILENAME $myregs - then - chatter "Staging provider registration." - sfcbstage -n $namespace -r $_REGFILENAME $mymofs - if test $? != 0 - then - echo "Failed to stage provider registration." >&2 - return 1 - fi - sfcb_rebuild - else - echo "Failed to build sfcb registration file." >&2 - return 1 - fi -} - -sfcb_uninstall() -{ - mymofs= - namespace=$1 - shift - - while test x$1 != x - do - if test $1 = ":" - then - shift - baseregname=`basename $1 .registration` - break - fi - mymofs="$mymofs `basename $1`" - shift - done - - # "Unstage" MOFs and the registration file - chatter "Unstaging provider registrations." - sfcbunstage -n $namespace -r $baseregname.reg $mymofs - - # Rebuild repository - sfcb_rebuild -} - -openwbem_transform() -{ - OUTFILE=$1 - shift - moffiles=$* - - if rm -f $OUTFILE - then - for _f in $moffiles - do - sed "s/Provider *( *\"cmpi:/Provider(\"cmpi::/g" < $_f >> $OUTFILE - done - fi -} - -openwbem_repository() -{ - for p in /var/lib/openwbem /usr/local/var/openwbem - do - if test -f $p/schema.dat - then - echo $p - return 0 - fi - done - return 1 -} - -openwbem_install() -{ - CIMMOF=`which owmofc 2> /dev/null` - if test $? != 0 - then - echo "Error: cimmof not found" >&2 - return 1 - fi - - if ps -C owcimomd > /dev/null 2>&1 - then - state=active - else - CIMMOF="$CIMMOF -d `openwbem_repository`" - if test $? != 0 - then - echo "Error: OpenWBEM repository not found" >&2 - return 1 - fi - state=inactive - fi - - for _TEMPDIR in /var/tmp /tmp - do - if test -w $_TEMPDIR - then - _REGFILENAME=$_TEMPDIR/$$.mof - break - fi - done - - trap "rm -f $_REGFILENAME" EXIT - - if openwbem_transform $_REGFILENAME $* - then - chatter Registering providers with $state owcimomd - $CIMMOF $_REGFILENAME > /dev/null - else - echo "Failed to build OpenWBEM registration MOF." >&2 - return 1 - fi -} - -openwbem_uninstall() -{ - CIMMOF=`which owmofc 2> /dev/null` - if test $? != 0 - then - echo "Error: cimmof not found" >&2 - return 1 - fi - - if ps -C owcimomd > /dev/null 2>&1 - then - state=active - else - CIMMOF="$CIMMOF -d `openwbem_repository`" - if test $? != 0 - then - echo "Error: OpenWBEM repository not found" >&2 - return 1 - fi - state=inactive - fi - - for _TEMPDIR in /var/tmp /tmp - do - if test -w $_TEMPDIR - then - _REGFILENAME=$_TEMPDIR/$$.mof - break - fi - done - - trap "rm -f $_REGFILENAME" EXIT - - if openwbem_transform $_REGFILENAME $* - then - chatter Deregistering providers with $state owcimomd - $CIMMOF -r $_REGFILENAME > /dev/null - else - echo "Failed to build OpenWBEM registration MOF." >&2 - return 1 - fi -} - -cim_server() -{ - for exname in sfcbd cimserver owcimomd - do - if pegasus_path $exname > /dev/null - then - case $exname in - sfcbd) echo sfcb; return 0;; - cimserver) echo pegasus; return 0;; - owcimomd) echo openwbem; return 0;; - esac - break; - fi - done - echo unknown - return 1 -} - -usage() -{ - echo "usage: $0 [-h] [-v] [-d] [-t ] [-n ] -r regfile ... -m mof ..." -} - -chatter() -{ - if test x$verbose != x - then - echo $* - fi -} - -gb_getopt() -{ - rmode=0 - mmode=0 - options= - moffiles= - registrations= - while [ -n "$1" ] - do - case $1 in - -r) mmode=0; - rmode=1; - shift;; - -m) mmode=1; - rmode=0; - shift;; - -*) mmode=0; - rmode=0; - options="$options $1"; - shift;; - **) if [ $mmode = 1 ] - then moffiles="$moffiles $1" - elif [ $rmode = 1 ] - then registrations="$registrations -r $1" - else options="$options $1"; - fi; - shift;; - esac - done - echo $options $registrations $moffiles -} - -prepargs=`gb_getopt $*` -args=`getopt dvhX:t:r:n: $prepargs` -rc=$? - -if [ $rc = 127 ] -then - echo "warning: getopt not found ...continue without syntax check" - args=$prepargs -elif [ $rc != 0 ] -then - usage $0 - exit 1 -fi - -namespace="root/cimv2" - -set -- $args - -while [ -n "$1" ] -do - case $1 in - -h) help=1; - shift; - break;; - -v) verbose=1; - shift;; - -X) endian="-X $2"; - shift 2;; - -d) deregister=1; - shift;; - -t) cimserver=$2; - shift 2;; - -n) namespace=$2; - shift 2;; - -r) regs="$regs $2"; - shift 2;; - --) shift; - break;; - **) break;; - esac -done - -mofs=$* - -if [ "$help" = "1" ] -then - usage - echo -e "\t-h display help message" - echo -e "\t-v verbose mode" - echo -e "\t-d deregister provider and uninstall schema" - echo -e "\t-t specify cimserver type (pegasus|sfcb|openwbem|sniacimom)" - echo -e "\t-r specify registration files" - echo -e "\t-m specify schema mof files" - echo -e "\t-X create repository for alternate platform (sfcb only at the moment)." - echo -e "\t-n target namespace definition (default: root/cimv2)." - echo - echo Use this command to install schema mofs and register providers. - echo CIM Server Type is required as well as at least one registration file and one mof. - exit 0 -fi - -if test x"$mofs" = x || test x"$regs" = x -then - usage $0 - exit 1 -fi - -if test x$cimserver = x -then - cimserver=`cim_server` - if test $? = 0 - then - chatter "Autoselected CIM server type:" $cimserver - else - echo "CIM server type could not be determined, specify with -t." >&2 - exit 1 - fi -fi - -if test x$deregister = x -then - case $cimserver in - pegasus) pegasus_install $namespace $mofs ":" $regs;; - sfcb) sfcb_install $namespace $mofs ":" $regs;; - openwbem) openwbem_install $mofs ;; - sniacimom) echo sniacimom not yet supported && exit 1 ;; - **) echo "Invalid CIM Server Type " $cimserver && exit 1;; - esac -else - case $cimserver in - pegasus) pegasus_uninstall $namespace $mofs ":" $regs;; - sfcb) sfcb_uninstall $namespace $mofs ":" $regs;; - openwbem) openwbem_uninstall $mofs ;; - sniacimom) echo sniacimom not yet supported && exit 1 ;; - **) echo "Invalid CIM Server Type " $cimserver && exit 1;; - esac -fi diff --git a/providers/power/sblim_cmpi_power_test.py b/providers/power/sblim_cmpi_power_test.py deleted file mode 100755 index f67fd87..0000000 --- a/providers/power/sblim_cmpi_power_test.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/python - -import sys -import pywbem - -if len(sys.argv) < 4: - print """Usage: %s
[username] [password] - Connect to CIM server at address and change the power state of the machine. - -Available states: - 4 - sleep - 5 - force reboot - 7 - hibernate - 8 - force poweroff - 12 - poweroff - 15 - reboot - -Example: %s https://127.0.0.1"5989 4 root redhat""" % (sys.argv[0], sys.argv[0]) - sys.exit(1) - -url = sys.argv[1] -try: - state = int(sys.argv[2]) -except ValueError: - print >>sys.stderr, "Unknown state: %s" % sys.argv[2] - sys.exit(4) - -username = None -password = None -if len(sys.argv) > 3: - username = sys.argv[3] -if len(sys.argv) > 4: - password = sys.argv[4] - -cliconn = pywbem.WBEMConnection(url, (username, password)) - -computerSystems = cliconn.ExecQuery('WQL', 'select * from Linux_ComputerSystem') - -if len(computerSystems) == 0: - print >>sys.stderr, "No usable Linux_ComputerSystem instance found." - sys.exit(2) - -if len(computerSystems) > 1: - print >>sys.stderr, "More than one Linux_ComputerSystem instance found, don't know which to use." - sys.exit(3) - -print cliconn.InvokeMethod("RequestPowerStateChange", "Linux_PowerManagementService", - ManagedElement=computerSystems[0].path, - TimeoutPeriod=pywbem.datetime.now(), - PowerState=pywbem.Uint16(state), - Time=pywbem.datetime.now() - ) diff --git a/providers/power/src/CMakeLists.txt b/providers/power/src/CMakeLists.txt deleted file mode 100644 index c9d0f40..0000000 --- a/providers/power/src/CMakeLists.txt +++ /dev/null @@ -1,70 +0,0 @@ - -find_package(PkgConfig) - -# Read CIM classes out of MOF file -execute_process(COMMAND sed -e "/class/ !D" -e "s/class \\(.*\\):.*/\\1/g" - INPUT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../Linux_PowerManagement.mof - OUTPUT_VARIABLE CIM_CLASSES -) - -# And fill list with them -string(REGEX MATCHALL "[a-zA-Z_-]+" CIM_CLASSES ${CIM_CLASSES}) - -# Get headers and sources names from the list of CIM classes -set(CIM_HEADERS "") -set(CIM_PROVIDERS "") -foreach(CLASS ${CIM_CLASSES}) - set(CIM_HEADERS ${CIM_HEADERS} ${CLASS}.h) - set(PROVIDER ${CLASS}Provider.c) - set(CIM_PROVIDERS ${CIM_PROVIDERS} ${PROVIDER}) -endforeach(CLASS ${CIM_CLASSES}) - -# Add library -add_library(cmpiLinux_PowerManagement SHARED - power.c - trace.c - globals.c - ${CIM_PROVIDERS} - ${CIM_HEADERS} -) - -# Link konkret library -target_link_libraries(cmpiLinux_PowerManagement "-lkonkret") -include_directories(/usr/include/cmpi ${CMAKE_CURRENT_BINARY_DIR}) - -# Check if we have upower and link it -pkg_check_modules(upower upower-glib) -if (${upower_FOUND}) - add_definitions(-DHAS_UPOWER) - target_link_libraries(cmpiLinux_PowerManagement ${upower_LIBRARIES}) - include_directories(${upower_INCLUDE_DIRS}) -endif (${upower_FOUND}) - -# Check if we have systemctl -find_program(systemctl NAMES systemctl) -if (${systemctl_FOUND}) - add_definitions(-DHAS_SYSTEMCTL) -endif (${systemctl_FOUND}) - -find_program(konkret NAMES konkret) -find_program(konkretreg NAMES konkretreg) - -# Generate headers for CIM classes -add_custom_command(OUTPUT ${CIM_HEADERS} - COMMAND KONKRET_SCHEMA_DIR=/usr/share/mof/cim-current - ${konkret} - -m /usr/share/sblim-cmpi-base/Linux_Base.mof - -m ${CMAKE_CURRENT_SOURCE_DIR}/../Linux_PowerManagement.mof - ${CIM_CLASSES} - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/../Linux_PowerManagement.mof - COMMENT "Generating headers from .mof file" - ) - -add_custom_command(TARGET cmpiLinux_PowerManagement - POST_BUILD - COMMAND ${konkretreg} -r libcmpiLinux_PowerManagement.so > Linux_PowerManagement.registration - COMMENT "Generating .reg file from library" - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - ) - -install(TARGETS cmpiLinux_PowerManagement DESTINATION lib${LIB_SUFFIX}/cmpi) diff --git a/providers/power/src/Linux_AssociatedPowerManagementServiceProvider.c b/providers/power/src/Linux_AssociatedPowerManagementServiceProvider.c deleted file mode 100644 index 7d61d83..0000000 --- a/providers/power/src/Linux_AssociatedPowerManagementServiceProvider.c +++ /dev/null @@ -1,294 +0,0 @@ - -#include "Linux_AssociatedPowerManagementService.h" -#include "Linux_PowerManagementService.h" -#include "Linux_ComputerSystem.h" - -#include "power.h" - -#include "trace.h" -#include "globals.h" - -static const CMPIBroker* _cb; - -static void Linux_AssociatedPowerManagementServiceInitialize(CMPIInstanceMI *mi) -{ - mi->hdl = power_ref(_cb); -} - -static void Linux_AssociatedPowerManagementServiceAssociationInitialize(CMPIAssociationMI *mi) -{ - mi->hdl = power_ref(_cb); -} - -static CMPIStatus Linux_AssociatedPowerManagementServiceCleanup( - CMPIInstanceMI* mi, - const CMPIContext* cc, - CMPIBoolean term) -{ - TRACE(1, "Linux_AssociatedPowerManagementServiceCleanup\n"); - - power_unref(mi->hdl); - mi->hdl = NULL; - - CMReturn(CMPI_RC_OK); -} - -static CMPIStatus Linux_AssociatedPowerManagementServiceEnumInstanceNames( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop) -{ - TRACE(1, "Linux_AssociatedPowerManagementServiceEnumInstanceNames\n"); - - return KDefaultEnumerateInstanceNames( - _cb, mi, cc, cr, cop); -} - -static CMPIStatus Linux_AssociatedPowerManagementServiceEnumInstances( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char** properties) -{ - TRACE(1, "Linux_AssociatedPowerManagementServiceEnumInstances\n"); - - const char *ns = KNameSpace(cop); - - Linux_AssociatedPowerManagementService w; - Linux_AssociatedPowerManagementService_Init(&w, _cb, ns); - - Linux_ComputerSystemRef computerSystemRef; - Linux_ComputerSystemRef_Init(&computerSystemRef, _cb, ns); - Linux_ComputerSystemRef_Set_Name(&computerSystemRef, get_system_name()); - Linux_ComputerSystemRef_Set_CreationClassName(&computerSystemRef, "Linux_ComputerSystem"); - Linux_AssociatedPowerManagementService_Set_UserOfService(&w, &computerSystemRef); - - Linux_PowerManagementServiceRef powerManagementServiceRef; - Linux_PowerManagementServiceRef_Init(&powerManagementServiceRef, _cb, ns); - Linux_PowerManagementServiceRef_Set_Name(&powerManagementServiceRef, get_system_name()); - Linux_PowerManagementServiceRef_Set_SystemName(&powerManagementServiceRef, get_system_name()); - Linux_PowerManagementServiceRef_Set_CreationClassName(&powerManagementServiceRef, "Linux_PowerManagementService"); - Linux_PowerManagementServiceRef_Set_SystemCreationClassName(&powerManagementServiceRef, "Linux_ComputerSystem"); - Linux_AssociatedPowerManagementService_Set_ServiceProvided(&w, &powerManagementServiceRef); - - int count; - unsigned short *list = power_available_requested_power_states(mi->hdl, &count); - Linux_AssociatedPowerManagementService_Init_AvailableRequestedPowerStates(&w, count); - for (int i = 0; i < count; i++) { - Linux_AssociatedPowerManagementService_Set_AvailableRequestedPowerStates(&w, i, list[i]); - } - - Linux_AssociatedPowerManagementService_Set_TransitioningToPowerState(&w, power_transitioning_to_power_state(mi->hdl)); - Linux_AssociatedPowerManagementService_Set_PowerState(&w, 2); - Linux_AssociatedPowerManagementService_Set_RequestedPowerState(&w, power_requested_power_state(mi->hdl)); - - KReturnInstance(cr, w); - CMReturn(CMPI_RC_OK); -} - -static CMPIStatus Linux_AssociatedPowerManagementServiceGetInstance( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char** properties) -{ - TRACE(1, "Linux_AssociatedPowerManagementServiceGetInstance\n"); - - return KDefaultGetInstance( - _cb, mi, cc, cr, cop, properties); -} - -static CMPIStatus Linux_AssociatedPowerManagementServiceCreateInstance( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const CMPIInstance* ci) -{ - CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); -} - -static CMPIStatus Linux_AssociatedPowerManagementServiceModifyInstance( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const CMPIInstance* ci, - const char**properties) -{ - CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); -} - -static CMPIStatus Linux_AssociatedPowerManagementServiceDeleteInstance( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop) -{ - CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); -} - -static CMPIStatus Linux_AssociatedPowerManagementServiceExecQuery( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char* lang, - const char* query) -{ - CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); -} - -static CMPIStatus Linux_AssociatedPowerManagementServiceAssociationCleanup( - CMPIAssociationMI* mi, - const CMPIContext* cc, - CMPIBoolean term) -{ - power_unref(mi->hdl); - mi->hdl = NULL; - - CMReturn(CMPI_RC_OK); -} - -static CMPIStatus Linux_AssociatedPowerManagementServiceAssociators( - CMPIAssociationMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char* assocClass, - const char* resultClass, - const char* role, - const char* resultRole, - const char** properties) -{ - TRACE(1, "Linux_AssociatedPowerManagementServiceAssociators\n" - "\tassocClass: %s\n" - "\tresultClass: %s\n" - "\trole: %s\n" - "\tresultRole: %s\n", assocClass, resultClass, role, resultRole); - - if (!assocClass) { - assocClass = "Linux_AssociatedPowerManagementService"; - } - - return KDefaultAssociators( - _cb, - mi, - cc, - cr, - cop, - Linux_AssociatedPowerManagementService_ClassName, - assocClass, - resultClass, - role, - resultRole, - properties); -} - -static CMPIStatus Linux_AssociatedPowerManagementServiceAssociatorNames( - CMPIAssociationMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char* assocClass, - const char* resultClass, - const char* role, - const char* resultRole) -{ - TRACE(1, "Linux_AssociatedPowerManagementServiceAssociatorNames\n" - "\tassocClass: %s\n" - "\tresultClass: %s\n" - "\trole: %s\n" - "\tresultRole: %s\n", assocClass, resultClass, role, resultRole); - - if (!assocClass) { - assocClass = "Linux_AssociatedPowerManagementService"; - } - - return KDefaultAssociatorNames( - _cb, - mi, - cc, - cr, - cop, - Linux_AssociatedPowerManagementService_ClassName, - assocClass, - resultClass, - role, - resultRole); -} - -static CMPIStatus Linux_AssociatedPowerManagementServiceReferences( - CMPIAssociationMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char* assocClass, - const char* role, - const char** properties) -{ - TRACE(1, "Linux_AssociatedPowerManagementServiceReferences\n" - "\tassocClass: %s\n" - "\trole: %s\n", assocClass, role); - - if (!assocClass) { - assocClass = "Linux_AssociatedPowerManagementService"; - } - - return KDefaultReferences( - _cb, - mi, - cc, - cr, - cop, - Linux_AssociatedPowerManagementService_ClassName, - assocClass, - role, - properties); -} - -static CMPIStatus Linux_AssociatedPowerManagementServiceReferenceNames( - CMPIAssociationMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char* assocClass, - const char* role) -{ - TRACE(1, "Linux_AssociatedPowerManagementServiceReferenceNames(assocClass: %s, role: %s)\n", assocClass, role); - - if (!assocClass) { - assocClass = "Linux_AssociatedPowerManagementService"; - } - - return KDefaultReferenceNames( - _cb, - mi, - cc, - cr, - cop, - Linux_AssociatedPowerManagementService_ClassName, - assocClass, - role); -} - -CMInstanceMIStub( - Linux_AssociatedPowerManagementService, - Linux_AssociatedPowerManagementService, - _cb, - Linux_AssociatedPowerManagementServiceInitialize(&mi)) - -CMAssociationMIStub( - Linux_AssociatedPowerManagementService, - Linux_AssociatedPowerManagementService, - _cb, - Linux_AssociatedPowerManagementServiceAssociationInitialize(&mi)) - -KONKRET_REGISTRATION( - "root/cimv2", - "Linux_AssociatedPowerManagementService", - "Linux_AssociatedPowerManagementService", - "instance association") diff --git a/providers/power/src/Linux_ConcreteJobProvider.c b/providers/power/src/Linux_ConcreteJobProvider.c deleted file mode 100644 index 361d045..0000000 --- a/providers/power/src/Linux_ConcreteJobProvider.c +++ /dev/null @@ -1,206 +0,0 @@ -#include -#include -#include "Linux_ConcreteJob.h" - -static const CMPIBroker* _cb = NULL; - -#include "power.h" -#include "trace.h" - -static void Linux_ConcreteJobInitializeInstance(CMPIInstanceMI *mi) -{ - mi->hdl = power_ref(_cb); -} - -static void Linux_ConcreteJobInitializeMethod(CMPIMethodMI *mi) -{ - mi->hdl = power_ref(_cb); -} - -static CMPIStatus Linux_ConcreteJobCleanup( - CMPIInstanceMI* mi, - const CMPIContext* cc, - CMPIBoolean term) -{ - if (power_get_jobs(mi->hdl) != NULL) { - // We have jobs running -> do not unload - CMReturn(CMPI_RC_DO_NOT_UNLOAD); - } - power_unref(mi->hdl); - CMReturn(CMPI_RC_OK); -} - -static CMPIStatus Linux_ConcreteJobEnumInstanceNames( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop) -{ - return KDefaultEnumerateInstanceNames( - _cb, mi, cc, cr, cop); -} - -static CMPIStatus Linux_ConcreteJobEnumInstances( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char** properties) -{ - CMPIStatus status; - const char *ns = KNameSpace(cop); - - TRACE(1, "Linux_ConcreteJobEnumInstances"); - PowerStateChangeJob *powerStateChangeJob; - GList *plist = power_get_jobs(mi->hdl); - - while (plist) { - powerStateChangeJob = plist->data; - Linux_ConcreteJob concreteJob; - Linux_ConcreteJob_Init(&concreteJob, _cb, ns); - Linux_ConcreteJob_Set_InstanceID(&concreteJob, "Linux_PowerStateChange_ConcreteJob:123"); // TODO: unique ID - Linux_ConcreteJob_Set_JobState(&concreteJob, job_state(powerStateChangeJob)); - Linux_ConcreteJob_Set_TimeOfLastStateChange(&concreteJob, CMNewDateTimeFromBinary(_cb, ((uint64_t) job_timeOfLastChange(powerStateChangeJob)) * 1000000, 0, &status)); - //Linux_ConcreteJob_Set_ - KReturnInstance(cr, concreteJob); - plist = g_list_next(plist); - } - - CMReturn(CMPI_RC_OK); -} - -static CMPIStatus Linux_ConcreteJobGetInstance( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char** properties) -{ - return KDefaultGetInstance( - _cb, mi, cc, cr, cop, properties); -} - -static CMPIStatus Linux_ConcreteJobCreateInstance( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const CMPIInstance* ci) -{ - - CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); -} - -static CMPIStatus Linux_ConcreteJobModifyInstance( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const CMPIInstance* ci, - const char** properties) -{ - CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); -} - -static CMPIStatus Linux_ConcreteJobDeleteInstance( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop) -{ - CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); -} - -static CMPIStatus Linux_ConcreteJobExecQuery( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char* lang, - const char* query) -{ - CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); -} - -CMInstanceMIStub( - Linux_ConcreteJob, - Linux_ConcreteJob, - _cb, - Linux_ConcreteJobInitializeInstance(&mi)) - -static CMPIStatus Linux_ConcreteJobMethodCleanup( - CMPIMethodMI* mi, - const CMPIContext* cc, - CMPIBoolean term) -{ - power_unref(mi->hdl); - CMReturn(CMPI_RC_OK); -} - -static CMPIStatus Linux_ConcreteJobInvokeMethod( - CMPIMethodMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char* meth, - const CMPIArgs* in, - CMPIArgs* out) -{ - return Linux_ConcreteJob_DispatchMethod( - _cb, mi, cc, cr, cop, meth, in, out); -} - -CMMethodMIStub( - Linux_ConcreteJob, - Linux_ConcreteJob, - _cb, - Linux_ConcreteJobInitializeMethod(&mi)) - -KUint32 Linux_ConcreteJob_KillJob( - const CMPIBroker* cb, - CMPIMethodMI* mi, - const CMPIContext* context, - const Linux_ConcreteJobRef* self, - const KBoolean* DeleteOnKill, - CMPIStatus* status) -{ - KUint32 result = KUINT32_INIT; - - KSetStatus(status, ERR_NOT_SUPPORTED); - return result; -} - -KUint32 Linux_ConcreteJob_RequestStateChange( - const CMPIBroker* cb, - CMPIMethodMI* mi, - const CMPIContext* context, - const Linux_ConcreteJobRef* self, - const KUint16* RequestedState, - const KDateTime* TimeoutPeriod, - CMPIStatus* status) -{ - KUint32 result = KUINT32_INIT; - - KSetStatus(status, ERR_NOT_SUPPORTED); - return result; -} - -KUint32 Linux_ConcreteJob_GetError( - const CMPIBroker* cb, - CMPIMethodMI* mi, - const CMPIContext* context, - const Linux_ConcreteJobRef* self, - KString* Error, - CMPIStatus* status) -{ - KUint32 result = KUINT32_INIT; - - KSetStatus(status, ERR_NOT_SUPPORTED); - return result; -} - -KONKRET_REGISTRATION( - "root/cimv2", - "Linux_ConcreteJob", - "Linux_ConcreteJob", - "instance method") diff --git a/providers/power/src/Linux_ElementCapabilitiesProvider.c b/providers/power/src/Linux_ElementCapabilitiesProvider.c deleted file mode 100644 index 62c42e6..0000000 --- a/providers/power/src/Linux_ElementCapabilitiesProvider.c +++ /dev/null @@ -1,225 +0,0 @@ -#include -#include "Linux_ElementCapabilities.h" -#include -#include "globals.h" - -static const CMPIBroker* _cb; - -static void Linux_ElementCapabilitiesInitialize() -{ -} - -static CMPIStatus Linux_ElementCapabilitiesCleanup( - CMPIInstanceMI* mi, - const CMPIContext* cc, - CMPIBoolean term) -{ - CMReturn(CMPI_RC_OK); -} - -static CMPIStatus Linux_ElementCapabilitiesEnumInstanceNames( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop) -{ - return KDefaultEnumerateInstanceNames( - _cb, mi, cc, cr, cop); -} - -static CMPIStatus Linux_ElementCapabilitiesEnumInstances( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char** properties) -{ - const char *ns = KNameSpace(cop); - - Linux_ElementCapabilities w; - Linux_ElementCapabilities_Init(&w, _cb, ns); - - Linux_PowerManagementServiceRef powerManagementServiceRef; - Linux_PowerManagementServiceRef_Init(&powerManagementServiceRef, _cb, ns); - Linux_PowerManagementServiceRef_Set_Name(&powerManagementServiceRef, get_system_name()); - Linux_PowerManagementServiceRef_Set_SystemName(&powerManagementServiceRef, get_system_name()); - Linux_PowerManagementServiceRef_Set_CreationClassName(&powerManagementServiceRef, "Linux_PowerManagementService"); - Linux_PowerManagementServiceRef_Set_SystemCreationClassName(&powerManagementServiceRef, "Linux_ComputerSystem"); - - Linux_ElementCapabilities_Set_ManagedElement(&w, &powerManagementServiceRef); - - Linux_PowerManagementCapabilitiesRef powerManagementCapabilitiesRef; - Linux_PowerManagementCapabilitiesRef_Init(&powerManagementCapabilitiesRef, _cb, ns); - Linux_PowerManagementCapabilitiesRef_Set_InstanceID(&powerManagementCapabilitiesRef, "RedHat:PowerManagementCapabilities"); - - Linux_ElementCapabilities_Set_Capabilities(&w, &powerManagementCapabilitiesRef); - - KReturnInstance(cr, w); - CMReturn(CMPI_RC_OK); -} - -static CMPIStatus Linux_ElementCapabilitiesGetInstance( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char** properties) -{ - return KDefaultGetInstance( - _cb, mi, cc, cr, cop, properties); -} - -static CMPIStatus Linux_ElementCapabilitiesCreateInstance( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const CMPIInstance* ci) -{ - CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); -} - -static CMPIStatus Linux_ElementCapabilitiesModifyInstance( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const CMPIInstance* ci, - const char**properties) -{ - CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); -} - -static CMPIStatus Linux_ElementCapabilitiesDeleteInstance( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop) -{ - CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); -} - -static CMPIStatus Linux_ElementCapabilitiesExecQuery( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char* lang, - const char* query) -{ - CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); -} - -static CMPIStatus Linux_ElementCapabilitiesAssociationCleanup( - CMPIAssociationMI* mi, - const CMPIContext* cc, - CMPIBoolean term) -{ - CMReturn(CMPI_RC_OK); -} - -static CMPIStatus Linux_ElementCapabilitiesAssociators( - CMPIAssociationMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char* assocClass, - const char* resultClass, - const char* role, - const char* resultRole, - const char** properties) -{ - return KDefaultAssociators( - _cb, - mi, - cc, - cr, - cop, - Linux_ElementCapabilities_ClassName, - assocClass, - resultClass, - role, - resultRole, - properties); -} - -static CMPIStatus Linux_ElementCapabilitiesAssociatorNames( - CMPIAssociationMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char* assocClass, - const char* resultClass, - const char* role, - const char* resultRole) -{ - return KDefaultAssociatorNames( - _cb, - mi, - cc, - cr, - cop, - Linux_ElementCapabilities_ClassName, - assocClass, - resultClass, - role, - resultRole); -} - -static CMPIStatus Linux_ElementCapabilitiesReferences( - CMPIAssociationMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char* assocClass, - const char* role, - const char** properties) -{ - return KDefaultReferences( - _cb, - mi, - cc, - cr, - cop, - Linux_ElementCapabilities_ClassName, - assocClass, - role, - properties); -} - -static CMPIStatus Linux_ElementCapabilitiesReferenceNames( - CMPIAssociationMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char* assocClass, - const char* role) -{ - return KDefaultReferenceNames( - _cb, - mi, - cc, - cr, - cop, - Linux_ElementCapabilities_ClassName, - assocClass, - role); -} - -CMInstanceMIStub( - Linux_ElementCapabilities, - Linux_ElementCapabilities, - _cb, - Linux_ElementCapabilitiesInitialize()) - -CMAssociationMIStub( - Linux_ElementCapabilities, - Linux_ElementCapabilities, - _cb, - Linux_ElementCapabilitiesInitialize()) - -KONKRET_REGISTRATION( - "root/cimv2", - "Linux_ElementCapabilities", - "Linux_ElementCapabilities", - "instance association") diff --git a/providers/power/src/Linux_HostedServiceProvider.c b/providers/power/src/Linux_HostedServiceProvider.c deleted file mode 100644 index 4f6c7ac..0000000 --- a/providers/power/src/Linux_HostedServiceProvider.c +++ /dev/null @@ -1,258 +0,0 @@ - -#include -#include -#include "Linux_HostedService.h" -#include "Linux_ComputerSystem.h" - -#include "globals.h" -#include "trace.h" - -static const CMPIBroker* _cb; - -static void Linux_HostedServiceInitialize() -{ -} - -static CMPIStatus Linux_HostedServiceCleanup( - CMPIInstanceMI* mi, - const CMPIContext* cc, - CMPIBoolean term) -{ - CMReturn(CMPI_RC_OK); -} - -static CMPIStatus Linux_HostedServiceEnumInstanceNames( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop) -{ - return KDefaultEnumerateInstanceNames( - _cb, mi, cc, cr, cop); -} - -static CMPIStatus Linux_HostedServiceEnumInstances( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char** properties) -{ - const char *ns = KNameSpace(cop); - - Linux_HostedService w; - Linux_HostedService_Init(&w, _cb, ns); - - /* - * TODO: Find instance dynamically based on Name property - */ - /* - CMPIObjectPath *computerSystemOP = CMNewObjectPath(_cb, ns, "CIM_ComputerSystem", &rc); - CMPIEnumeration *en = CBEnumInstanceNames(_cb, cc, computerSystemOP, &rc); - while (CMHasNext(en, &rc)) { - data = CMGetNext(en, &rc); - if (data.type != CMPI_ref) { - TRACE(1, "Not a reference\n"); - continue; - } - fprintf(stderr, "object: %s\n", CMGetCharsPtr(CMObjectPathToString(data.value.ref, &rc), &rc)); - - name = data.value.ref->ft->getKey(data.value.ref, "Name", &rc); - if (name.type != CMPI_string) { - fprintf(stderr, "Non-string name %d\n", name.type); - continue; - } - if (rc.rc != CMPI_RC_OK) return rc; - - fprintf(stderr, "Name: %s\n", CMGetCharsPtr(name.value.string, &rc)); - if (strcmp(CMGetCharsPtr(name.value.string, &rc), get_system_name()) == 0) { - TRACE(1, "Found\n"); - CIM_ComputerSystemRef_InitFromObjectPath(&computerSystemRef, _cb, data.value.ref); - break; - } - } - */ - - Linux_ComputerSystemRef computerSystemRef; - Linux_ComputerSystemRef_Init(&computerSystemRef, _cb, ns); - Linux_ComputerSystemRef_Set_Name(&computerSystemRef, get_system_name()); - Linux_ComputerSystemRef_Set_CreationClassName(&computerSystemRef, "Linux_ComputerSystem"); - Linux_HostedService_Set_Antecedent(&w, &computerSystemRef); - - Linux_PowerManagementServiceRef powerManagementServiceRef; - Linux_PowerManagementServiceRef_Init(&powerManagementServiceRef, _cb, ns); - Linux_PowerManagementServiceRef_Set_Name(&powerManagementServiceRef, get_system_name()); - Linux_PowerManagementServiceRef_Set_SystemName(&powerManagementServiceRef, get_system_name()); - Linux_PowerManagementServiceRef_Set_CreationClassName(&powerManagementServiceRef, "Linux_PowerManagementService"); - Linux_PowerManagementServiceRef_Set_SystemCreationClassName(&powerManagementServiceRef, "Linux_ComputerSystem"); - Linux_HostedService_Set_Dependent(&w, &powerManagementServiceRef); - - KReturnInstance(cr, w); - CMReturn(CMPI_RC_OK); -} - -static CMPIStatus Linux_HostedServiceGetInstance( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char** properties) -{ - return KDefaultGetInstance( - _cb, mi, cc, cr, cop, properties); -} - -static CMPIStatus Linux_HostedServiceCreateInstance( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const CMPIInstance* ci) -{ - CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); -} - -static CMPIStatus Linux_HostedServiceModifyInstance( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const CMPIInstance* ci, - const char**properties) -{ - CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); -} - -static CMPIStatus Linux_HostedServiceDeleteInstance( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop) -{ - CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); -} - -static CMPIStatus Linux_HostedServiceExecQuery( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char* lang, - const char* query) -{ - CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); -} - -static CMPIStatus Linux_HostedServiceAssociationCleanup( - CMPIAssociationMI* mi, - const CMPIContext* cc, - CMPIBoolean term) -{ - CMReturn(CMPI_RC_OK); -} - -static CMPIStatus Linux_HostedServiceAssociators( - CMPIAssociationMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char* assocClass, - const char* resultClass, - const char* role, - const char* resultRole, - const char** properties) -{ - return KDefaultAssociators( - _cb, - mi, - cc, - cr, - cop, - Linux_HostedService_ClassName, - assocClass, - resultClass, - role, - resultRole, - properties); -} - -static CMPIStatus Linux_HostedServiceAssociatorNames( - CMPIAssociationMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char* assocClass, - const char* resultClass, - const char* role, - const char* resultRole) -{ - return KDefaultAssociatorNames( - _cb, - mi, - cc, - cr, - cop, - Linux_HostedService_ClassName, - assocClass, - resultClass, - role, - resultRole); -} - -static CMPIStatus Linux_HostedServiceReferences( - CMPIAssociationMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char* assocClass, - const char* role, - const char** properties) -{ - return KDefaultReferences( - _cb, - mi, - cc, - cr, - cop, - Linux_HostedService_ClassName, - assocClass, - role, - properties); -} - -static CMPIStatus Linux_HostedServiceReferenceNames( - CMPIAssociationMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char* assocClass, - const char* role) -{ - return KDefaultReferenceNames( - _cb, - mi, - cc, - cr, - cop, - Linux_HostedService_ClassName, - assocClass, - role); -} - -CMInstanceMIStub( - Linux_HostedService, - Linux_HostedService, - _cb, - Linux_HostedServiceInitialize()) - -CMAssociationMIStub( - Linux_HostedService, - Linux_HostedService, - _cb, - Linux_HostedServiceInitialize()) - -KONKRET_REGISTRATION( - "root/cimv2", - "Linux_HostedService", - "Linux_HostedService", - "instance association") diff --git a/providers/power/src/Linux_PowerManagementCapabilitiesProvider.c b/providers/power/src/Linux_PowerManagementCapabilitiesProvider.c deleted file mode 100644 index bb74e34..0000000 --- a/providers/power/src/Linux_PowerManagementCapabilitiesProvider.c +++ /dev/null @@ -1,162 +0,0 @@ -#include -#include "Linux_PowerManagementCapabilities.h" - -#include "power.h" - -static const CMPIBroker* _cb = NULL; - -static void Linux_PowerManagementCapabilitiesInitialize(CMPIInstanceMI *mi) -{ - mi->hdl = power_ref(_cb); -} - -static void Linux_PowerManagementCapabilitiesInitializeMethod(CMPIMethodMI *mi) -{ - mi->hdl = power_ref(_cb); -} - -static CMPIStatus Linux_PowerManagementCapabilitiesCleanup( - CMPIInstanceMI* mi, - const CMPIContext* cc, - CMPIBoolean term) -{ - power_unref(mi->hdl); - mi->hdl = NULL; - CMReturn(CMPI_RC_OK); -} - -static CMPIStatus Linux_PowerManagementCapabilitiesEnumInstanceNames( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop) -{ - return KDefaultEnumerateInstanceNames( - _cb, mi, cc, cr, cop); -} - -static CMPIStatus Linux_PowerManagementCapabilitiesEnumInstances( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char** properties) -{ - const char *ns = KNameSpace(cop); - - Linux_PowerManagementCapabilities w; - Linux_PowerManagementCapabilities_Init(&w, _cb, ns); - // TODO: make it unique - Linux_PowerManagementCapabilities_Set_InstanceID(&w, "Linux:PowerManagementCapabilities"); - Linux_PowerManagementCapabilities_Set_ElementName(&w, "Linux:PowerManagementCapabilities"); - Linux_PowerManagementCapabilities_Set_Caption(&w, "Linux:PowerManagementCapabilities"); - - int count; - unsigned short *list = power_available_requested_power_states(mi->hdl, &count); - Linux_PowerManagementCapabilities_Init_PowerStatesSupported(&w, count); - for (int i = 0; i < count; i++) { - Linux_PowerManagementCapabilities_Set_PowerStatesSupported(&w, i, list[i]); - } - - // TODO: get this list dynamically from PowerStatesSupported (see SMASH) - Linux_PowerManagementCapabilities_Init_PowerChangeCapabilities(&w, 3); - Linux_PowerManagementCapabilities_Set_PowerChangeCapabilities(&w, 0, Linux_PowerManagementCapabilities_PowerChangeCapabilities_Power_State_Settable); - Linux_PowerManagementCapabilities_Set_PowerChangeCapabilities(&w, 1, Linux_PowerManagementCapabilities_PowerChangeCapabilities_Power_Cycling_Supported); - Linux_PowerManagementCapabilities_Set_PowerChangeCapabilities(&w, 2, Linux_PowerManagementCapabilities_PowerChangeCapabilities_Graceful_Shutdown_Supported); - KReturnInstance(cr, w); - CMReturn(CMPI_RC_OK); -} - -static CMPIStatus Linux_PowerManagementCapabilitiesGetInstance( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char** properties) -{ - return KDefaultGetInstance( - _cb, mi, cc, cr, cop, properties); -} - -static CMPIStatus Linux_PowerManagementCapabilitiesCreateInstance( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const CMPIInstance* ci) -{ - CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); -} - -static CMPIStatus Linux_PowerManagementCapabilitiesModifyInstance( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const CMPIInstance* ci, - const char** properties) -{ - CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); -} - -static CMPIStatus Linux_PowerManagementCapabilitiesDeleteInstance( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop) -{ - CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); -} - -static CMPIStatus Linux_PowerManagementCapabilitiesExecQuery( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char* lang, - const char* query) -{ - CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); -} - -CMInstanceMIStub( - Linux_PowerManagementCapabilities, - Linux_PowerManagementCapabilities, - _cb, - Linux_PowerManagementCapabilitiesInitialize(&mi)) - -static CMPIStatus Linux_PowerManagementCapabilitiesMethodCleanup( - CMPIMethodMI* mi, - const CMPIContext* cc, - CMPIBoolean term) -{ - power_unref(mi->hdl); - mi->hdl = NULL; - - CMReturn(CMPI_RC_OK); -} - -static CMPIStatus Linux_PowerManagementCapabilitiesInvokeMethod( - CMPIMethodMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char* meth, - const CMPIArgs* in, - CMPIArgs* out) -{ - return Linux_PowerManagementCapabilities_DispatchMethod( - _cb, mi, cc, cr, cop, meth, in, out); -} - -CMMethodMIStub( - Linux_PowerManagementCapabilities, - Linux_PowerManagementCapabilities, - _cb, - Linux_PowerManagementCapabilitiesInitializeMethod(&mi)) - -KONKRET_REGISTRATION( - "root/cimv2", - "Linux_PowerManagementCapabilities", - "Linux_PowerManagementCapabilities", - "instance method") diff --git a/providers/power/src/Linux_PowerManagementServiceProvider.c b/providers/power/src/Linux_PowerManagementServiceProvider.c deleted file mode 100644 index 8ce3f6c..0000000 --- a/providers/power/src/Linux_PowerManagementServiceProvider.c +++ /dev/null @@ -1,278 +0,0 @@ - -#include "Linux_PowerManagementService.h" - -#include "power.h" -#include "globals.h" -#include "trace.h" - -static const CMPIBroker* _cb = NULL; - -static void Linux_PowerManagementServiceInitialize(CMPIInstanceMI *mi) -{ - mi->hdl = power_ref(_cb); -} - -static void Linux_PowerManagementServiceMethodInitialize(CMPIMethodMI *mi) -{ - mi->hdl = power_ref(_cb); -} - - -static CMPIStatus Linux_PowerManagementServiceCleanup( - CMPIInstanceMI* mi, - const CMPIContext* cc, - CMPIBoolean term) -{ - TRACE(1, "Linux_PowerManagementServiceCleanup\n"); - - power_unref(mi->hdl); - mi->hdl = NULL; - - CMReturn(CMPI_RC_OK); -} - -static CMPIStatus Linux_PowerManagementServiceEnumInstanceNames( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop) -{ - TRACE(1, "Linux_PowerManagementServiceEnumInstanceNames\n"); - - return KDefaultEnumerateInstanceNames( - _cb, mi, cc, cr, cop); -} - -static CMPIStatus Linux_PowerManagementServiceEnumInstances( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char** properties) -{ - TRACE(1, "Linux_PowerManagementServiceEnumInstances\n"); - - Linux_PowerManagementService w; - - Linux_PowerManagementService_Init(&w, _cb, KNameSpace(cop)); - Linux_PowerManagementService_Set_CreationClassName(&w, "Linux_PowerManagementService"); - Linux_PowerManagementService_Set_Name(&w, get_system_name()); - Linux_PowerManagementService_Set_SystemCreationClassName(&w, "Linux_ComputerSystem"); - Linux_PowerManagementService_Set_SystemName(&w, get_system_name()); - - /* EnabledState is an integer enumeration that indicates the enabled - * and disabled states of an element. It can also indicate the transitions - * between these requested states. - */ - Linux_PowerManagementService_Set_EnabledState(&w, Linux_PowerManagementService_EnabledDefault_Enabled); - - - /* RequestedState is an integer enumeration that indicates the last - * requested or desired state for the element, irrespective of the mechanism - * through which it was requested. The actual state of the element is - * represented by EnabledState. This property is provided to compare the - * last requested and current enabled or disabled states. - */ - Linux_PowerManagementService_Set_RequestedState(&w, Linux_PowerManagementService_RequestedState_No_Change); - - Linux_PowerManagementService_Init_AvailableRequestedStates(&w, 2); - Linux_PowerManagementService_Set_AvailableRequestedStates(&w, 0, 2); // Enabled - Linux_PowerManagementService_Set_AvailableRequestedStates(&w, 1, 3); // Disabled - - - Linux_PowerManagementService_Print(&w, stderr); - - KReturnInstance(cr, w); - CMReturn(CMPI_RC_OK); -} - -static CMPIStatus Linux_PowerManagementServiceGetInstance( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char** properties) -{ - return KDefaultGetInstance( - _cb, mi, cc, cr, cop, properties); -} - -static CMPIStatus Linux_PowerManagementServiceCreateInstance( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const CMPIInstance* ci) -{ - CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); -} - -static CMPIStatus Linux_PowerManagementServiceModifyInstance( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const CMPIInstance* ci, - const char** properties) -{ - CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); -} - -static CMPIStatus Linux_PowerManagementServiceDeleteInstance( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop) -{ - CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); -} - -static CMPIStatus Linux_PowerManagementServiceExecQuery( - CMPIInstanceMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char* lang, - const char* query) -{ - CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); -} - -CMInstanceMIStub( - Linux_PowerManagementService, - Linux_PowerManagementService, - _cb, - Linux_PowerManagementServiceInitialize(&mi)) - -static CMPIStatus Linux_PowerManagementServiceMethodCleanup( - CMPIMethodMI* mi, - const CMPIContext* cc, - CMPIBoolean term) -{ - power_unref(mi->hdl); - mi->hdl = NULL; - CMReturn(CMPI_RC_OK); -} - -static CMPIStatus Linux_PowerManagementServiceInvokeMethod( - CMPIMethodMI* mi, - const CMPIContext* cc, - const CMPIResult* cr, - const CMPIObjectPath* cop, - const char* meth, - const CMPIArgs* in, - CMPIArgs* out) -{ - return Linux_PowerManagementService_DispatchMethod( - _cb, mi, cc, cr, cop, meth, in, out); -} - -CMMethodMIStub( - Linux_PowerManagementService, - Linux_PowerManagementService, - _cb, - Linux_PowerManagementServiceMethodInitialize(&mi)) - -KUint32 Linux_PowerManagementService_RequestStateChange( - const CMPIBroker* cb, - CMPIMethodMI* mi, - const CMPIContext* context, - const Linux_PowerManagementServiceRef* self, - const KUint16* RequestedState, - KRef* Job, - const KDateTime* TimeoutPeriod, - CMPIStatus* status) -{ - KUint32 result = KUINT32_INIT; - - KSetStatus(status, ERR_NOT_SUPPORTED); - return result; - -} - -KUint32 Linux_PowerManagementService_StartService( - const CMPIBroker* cb, - CMPIMethodMI* mi, - const CMPIContext* context, - const Linux_PowerManagementServiceRef* self, - CMPIStatus* status) -{ - KUint32 result = KUINT32_INIT; - - KSetStatus(status, ERR_NOT_SUPPORTED); - return result; -} - -KUint32 Linux_PowerManagementService_StopService( - const CMPIBroker* cb, - CMPIMethodMI* mi, - const CMPIContext* context, - const Linux_PowerManagementServiceRef* self, - CMPIStatus* status) -{ - KUint32 result = KUINT32_INIT; - - KSetStatus(status, ERR_NOT_SUPPORTED); - return result; -} - -KUint32 Linux_PowerManagementService_SetPowerState( - const CMPIBroker* cb, - CMPIMethodMI* mi, - const CMPIContext* context, - const Linux_PowerManagementServiceRef* self, - const KUint16* PowerState, - const KRef* ManagedElement, - const KDateTime* Time, - CMPIStatus* status) -{ - KUint32 result = KUINT32_INIT; - - KSetStatus(status, ERR_NOT_SUPPORTED); - return result; -} - -KUint32 Linux_PowerManagementService_RequestPowerStateChange( - const CMPIBroker* cb, - CMPIMethodMI* mi, - const CMPIContext* context, - const Linux_PowerManagementServiceRef* self, - const KUint16* PowerState, - const KRef* ManagedElement, - const KDateTime* Time, - KRef* Job, - const KDateTime* TimeoutPeriod, - CMPIStatus* status) -{ - TRACE(1, "Linux_PowerManagementService_RequestPowerStateChange\n"); - KUint32 result = KUINT32_INIT; - - if (Time->exists && Time->null && TimeoutPeriod->exists && TimeoutPeriod->null) { - /* SMASH says: The TimeoutPeriod and Time parameters shall not be - * supported for the same invocation of the RequestPowerStateChange( ) - * method. When the TimeoutPeriod and Time parameters are specified - * for the same method invocation, the method shall return a value of 2. - */ - KUint32_Set(&result, 2); - return result; - } - - // Time argument is not handled because we don't support powering on systems - - if (!PowerState->exists || PowerState->null) { - TRACE(1, "wrong PowerState\n"); - KSetStatus(status, ERR_INVALID_PARAMETER); - return result; - } - power_request_power_state(mi->hdl, PowerState->value); - - KSetStatus(status, OK); - KUint32_Set(&result, 4096); - return result; -} - -KONKRET_REGISTRATION( - "root/cimv2", - "Linux_PowerManagementService", - "Linux_PowerManagementService", - "instance method") diff --git a/providers/power/src/globals.c b/providers/power/src/globals.c deleted file mode 100644 index 2ba5075..0000000 --- a/providers/power/src/globals.c +++ /dev/null @@ -1,24 +0,0 @@ - -#include "globals.h" - -#define _XOPEN_SOURCE 500 - -#include -#include -#include "trace.h" - -static char *_hostname = NULL; - -const char *get_system_name() -{ - if (_hostname == NULL) { - _hostname = malloc(256 * sizeof(char)); - if (gethostname(_hostname, 255) == -1) { - TRACE(4, "get_hostname(): gethostname returned -1"); - free(_hostname); - _hostname = NULL; - } - } - // TODO: try to get full qualified hostname - return _hostname; -} diff --git a/providers/power/src/globals.h b/providers/power/src/globals.h deleted file mode 100644 index adec07e..0000000 --- a/providers/power/src/globals.h +++ /dev/null @@ -1,7 +0,0 @@ - -#ifndef GLOBALS_H -#define GLOBALS_H - -const char *get_system_name(); - -#endif \ No newline at end of file diff --git a/providers/power/src/power.c b/providers/power/src/power.c deleted file mode 100644 index 751ab22..0000000 --- a/providers/power/src/power.c +++ /dev/null @@ -1,517 +0,0 @@ -#include "power.h" - -#include -#include - -#include - -#include "Linux_AssociatedPowerManagementService.h" -#include "Linux_ConcreteJob.h" - -#ifdef HAS_UPOWER -#include -#endif - -struct _Power { - unsigned int instances; - unsigned short requestedPowerState; - unsigned short transitioningToPowerState; - const CMPIBroker *broker; - CMPI_MUTEX_TYPE mutex; - GList *jobs; // list of PowerStateChangeJob -#ifdef HAS_UPOWER - UpClient *up; -#endif -}; - -#define MUTEX_LOCK(power) power->broker->xft->lockMutex(power->mutex) -#define MUTEX_UNLOCK(power) power->broker->xft->unlockMutex(power->mutex) - -struct _PowerStateChangeJob { - const CMPIBroker *broker; - Power *power; - unsigned short requestedPowerState; - unsigned short jobState; - int timeOfLastChange; - int timeBeforeRemoval; - int cancelled; - int superseded; // There is another job that overrides this job - char *error; - CMPI_THREAD_TYPE thread; - CMPI_MUTEX_TYPE mutex; -}; - -Power *_power = NULL; - - -// This is just for debugging purposes, remove later -#include -#include -void print_backtrace(int signal) -{ - fprintf(stderr, "BackTrace\n"); - void *buffer[32]; - int count = backtrace(buffer, 32); - fprintf(stderr, "Size: %d\n", count); - backtrace_symbols_fd(buffer, count, stderr->_fileno); - fprintf(stderr, "Segfault detected, process id: %d. Entering infinite loop.\n", getpid()); - volatile int end = 0; - while (!end) { - sleep(1); - } -} - -Power *power_new(const CMPIBroker *_cb) -{ - signal(SIGSEGV, print_backtrace); - fprintf(stderr, "BackTrace handler registered\n"); - - Power *power = malloc(sizeof(Power)); - power->broker = _cb; - power->instances = 0; - power->requestedPowerState = Linux_AssociatedPowerManagementService_RequestedPowerState_Unknown; - power->transitioningToPowerState = Linux_AssociatedPowerManagementService_TransitioningToPowerState_No_Change; - power->mutex = _cb->xft->newMutex(0); - power->jobs = NULL; -#ifdef HAS_UPOWER - g_type_init(); - power->up = up_client_new(); -#endif - return power; -} - -void power_destroy(Power *power) -{ -#ifdef HAS_UPOWER - free(power->up); -#endif -} - -Power *power_ref(const CMPIBroker *_cb) -{ - if (_power == NULL) { - _power = power_new(_cb); - } - MUTEX_LOCK(_power); - _power->instances++; - MUTEX_UNLOCK(_power); - return _power; -} - -void power_unref(Power *power) -{ - MUTEX_LOCK(power); - power->instances--; - MUTEX_UNLOCK(power); - if (power->instances == 0) { - power_destroy(power); - power = NULL; - _power = NULL; - } -} - -unsigned short power_requested_power_state(Power *power) -{ - return power->requestedPowerState; -} - -unsigned short power_transitioning_to_power_state(Power *power) -{ - return power->transitioningToPowerState; -} - -void *state_change_thread(void *data) -{ - PowerStateChangeJob *powerStateChangeJob = data; - MUTEX_LOCK(powerStateChangeJob); - powerStateChangeJob->jobState = Linux_ConcreteJob_JobState_Running; - powerStateChangeJob->timeOfLastChange = time(NULL); - MUTEX_UNLOCK(powerStateChangeJob); - - - // Check if the job was cancelled - if (powerStateChangeJob->cancelled) { - MUTEX_LOCK(powerStateChangeJob); - powerStateChangeJob->jobState = Linux_ConcreteJob_JobState_Terminated; - powerStateChangeJob->timeOfLastChange = time(NULL); - MUTEX_UNLOCK(powerStateChangeJob); - - if (!powerStateChangeJob->superseded) { - // There is no job that replaced this job - MUTEX_LOCK(powerStateChangeJob->power); - powerStateChangeJob->power->transitioningToPowerState = Linux_AssociatedPowerManagementService_TransitioningToPowerState_No_Change; - MUTEX_UNLOCK(powerStateChangeJob->power); - } - - fprintf(stderr, "state_change_thread cancelled\n"); - return NULL; - } - - // Execute the job -#ifdef HAS_UPOWER - GError *error = NULL; -#endif - - int succeeded = 0; - switch (powerStateChangeJob->requestedPowerState) { - case Linux_AssociatedPowerManagementService_PowerState_Sleep__Deep: - // Sleep -#ifdef HAS_UPOWER - succeeded = up_client_suspend_sync(powerStateChangeJob->power->up, NULL, &error); -#else - succeeded = system("pm-suspend") == 0; -#endif - break; - case Linux_AssociatedPowerManagementService_PowerState_Power_Cycle_Off___Soft: - // Reboot (without shutting down programs) -#ifdef HAS_SYSTEMCTL - succeeded = system("systemctl --force reboot &") == 0; -#else - succeeded = system("reboot --force &") == 0; -#endif - break; - case Linux_AssociatedPowerManagementService_PowerState_Hibernate_Off___Soft: - // Hibernate -#ifdef HAS_UPOWER - succeeded = up_client_hibernate_sync(powerStateChangeJob->power->up, NULL, &error); -#else - succeeded = system("pm-hibernate") == 0; -#endif - break; - case Linux_AssociatedPowerManagementService_PowerState_Off___Soft: - // Poweroff (without shutting down programs) -#ifdef HAS_SYSTEMCTL - succeeded = system("systemctl --force poweroff &") == 0; -#else - succeeded = system("shutdown --halt now &") == 0; -#endif - break; - case Linux_AssociatedPowerManagementService_PowerState_Off___Soft_Graceful: - // Poweroff (shut down programs first) -#ifdef HAS_SYSTEMCTL - succeeded = system("systemctl poweroff &") == 0; -#else - succeeded = system("shutdown --poweroff now &") == 0; -#endif - break; - case Linux_AssociatedPowerManagementService_PowerState_Power_Cycle_Off___Soft_Graceful: - // Reboot (shut down programs first) -#ifdef HAS_SYSTEMCTL - succeeded = system("systemctl reboot &") == 0; -#else - succeeded = system("shutdown --reboot now &") == 0; -#endif - break; - } - - MUTEX_LOCK(powerStateChangeJob->power); - powerStateChangeJob->power->transitioningToPowerState = Linux_AssociatedPowerManagementService_TransitioningToPowerState_No_Change; - MUTEX_UNLOCK(powerStateChangeJob->power); - - MUTEX_LOCK(powerStateChangeJob); - if (succeeded) { - powerStateChangeJob->jobState = Linux_ConcreteJob_JobState_Completed; - } else { - powerStateChangeJob->jobState = Linux_ConcreteJob_JobState_Exception; -#ifdef HAS_UPOWER - if (error != NULL) { - powerStateChangeJob->error = error->message; - } -#endif - } - powerStateChangeJob->timeOfLastChange = time(NULL); - MUTEX_UNLOCK(powerStateChangeJob); - - fprintf(stderr, "state_change_thread finished\n"); - return NULL; -} - -int power_request_power_state(Power *power, unsigned short state) -{ - int rc = CMPI_RC_OK; - - int count, found = 0; - unsigned short *states = power_available_requested_power_states(power, &count); - for (int i = 0; i < count; ++i) { - if (states[i] == state) { - found = 1; - break; - } - } - free(states); - if (!found) { - fprintf(stderr, "Invalid state: %d\n", state); - return CMPI_RC_ERR_INVALID_PARAMETER; - } - - PowerStateChangeJob *powerStateChangeJob = malloc(sizeof(PowerStateChangeJob)); - powerStateChangeJob->broker = power->broker; - powerStateChangeJob->power = power; - powerStateChangeJob->mutex = power->broker->xft->newMutex(0); - powerStateChangeJob->requestedPowerState = state; - powerStateChangeJob->jobState = Linux_ConcreteJob_JobState_New; - powerStateChangeJob->cancelled = 0; - powerStateChangeJob->superseded = 0; - powerStateChangeJob->timeOfLastChange = time(NULL); - powerStateChangeJob->timeBeforeRemoval = 300; - powerStateChangeJob->error = NULL; - - MUTEX_LOCK(power); - power->requestedPowerState = state; - power->transitioningToPowerState = state; - - PowerStateChangeJob *job; - GList *plist = power->jobs; - while (plist) { - job = plist->data; - MUTEX_LOCK(job); - if (job->jobState != Linux_ConcreteJob_JobState_Suspended && - job->jobState != Linux_ConcreteJob_JobState_Killed && - job->jobState != Linux_ConcreteJob_JobState_Terminated) { - - job->cancelled = 1; - job->superseded = 1; - job->jobState = Linux_ConcreteJob_JobState_Shutting_Down; - job->timeOfLastChange = time(NULL); - } - MUTEX_UNLOCK(job); - plist = g_list_next(plist); - } - powerStateChangeJob->thread = power->broker->xft->newThread(state_change_thread, powerStateChangeJob, 1); - power->jobs = g_list_append(power->jobs, powerStateChangeJob); - MUTEX_UNLOCK(power); - fprintf(stderr, "State change thread started\n"); - - return rc; -} - -unsigned short *power_available_requested_power_states(Power *power, int *count) -{ - unsigned short *list = malloc(17 * sizeof(unsigned short)); - int i = 0; - - /* 1 Other - * Linux_AssociatedPowerManagementService_PowerState_Other - */ - - /* 2 On - * corresponding to ACPI state G0 or S0 or D0. - * - * Bring system to full On from any state (Sleep, Hibernate, Off) - * - * Linux_AssociatedPowerManagementService_PowerState_On - */ - // not supported - - /* 3 Sleep - Light - * corresponding to ACPI state G1, S1/S2, or D1. - * - * Standby - * - * Linux_AssociatedPowerManagementService_PowerState_Sleep___Light - */ - // not supported - - /* 4 Sleep - Deep - * corresponding to ACPI state G1, S3, or D2. - * - * Suspend - * - * Linux_AssociatedPowerManagementService_PowerState_Sleep__Deep - */ - // Sleep -#ifdef HAS_UPOWER - if (up_client_get_can_suspend(power->up)) { - list[i++] = Linux_AssociatedPowerManagementService_PowerState_Sleep__Deep; - } -#else - if (system("pm-is-supported --suspend") == 0) { - list[i++] = Linux_AssociatedPowerManagementService_PowerState_Sleep__Deep; - } -#endif - - /* 5 Power Cycle (Off - Soft) - * corresponding to ACPI state G2, S5, or D3, but where the managed - * element is set to return to power state "On" at a pre-determined time. - * - * Reset system without removing power - * - * Linux_AssociatedPowerManagementService_PowerState_Power_Cycle_Off___Soft - */ - // Reboot (without shutting down programs) - list[i++] = Linux_AssociatedPowerManagementService_PowerState_Power_Cycle_Off___Soft; - - /* 6 Off - Hard - * corresponding to ACPI state G3, S5, or D3. - * - * Power Off performed through mechanical means like unplugging - * power cable or UPS On - * - * Linux_AssociatedPowerManagementService_PowerState_Off___Hard - */ - - /* 7 Hibernate (Off - Soft) - * corresponding to ACPI state S4, where the state of the managed element - * is preserved and will be recovered upon powering on. - * - * System context and OS image written to non-volatile storage; - * system and devices powered off - * - * Linux_AssociatedPowerManagementService_PowerState_Hibernate_Off___Soft - */ - // Hibernate -#ifdef HAS_UPOWER - if (up_client_get_can_hibernate(power->up)) { - list[i++] = Linux_AssociatedPowerManagementService_PowerState_Hibernate_Off___Soft; - } -#else - if (system("pm-is-supported --hibernate") == 0) { - list[i++] = Linux_AssociatedPowerManagementService_PowerState_Hibernate_Off___Soft; - } -#endif - - /* 8 Off - Soft - * corresponding to ACPI state G2, S5, or D3. - * - * System power off but auxiliary or flea power may be available - * - * Linux_AssociatedPowerManagementService_PowerState_Off___Soft - */ - // Poweroff (without shutting down programs) - list[i++] = Linux_AssociatedPowerManagementService_PowerState_Off___Soft; - - /* 9 Power Cycle (Off-Hard) - * corresponds to the managed element reaching the ACPI state G3 - * followed by ACPI state S0. - * - * Equivalent to Off–Hard followed by On - * - * Linux_AssociatedPowerManagementService_PowerState_Power_Cycle_Off_Hard - */ - // not implemented - - /* 10 Master Bus Reset - * corresponds to the system reaching ACPI state S5 followed by ACPI - * state S0. This is used to represent system master bus reset. - * - * Hardware reset - * - * Linux_AssociatedPowerManagementService_PowerState_Master_Bus_Reset - */ - // not implemented - - /* 11 Diagnostic Interrupt (NMI) - * corresponding to the system reaching ACPI state S5 followed by ACPI - * state S0. This is used to represent system non-maskable interrupt. - * - * Hardware reset - * - * Linux_AssociatedPowerManagementService_PowerState_Diagnostic_Interrupt_NMI - */ - // not implemented - - /* 12 Off - Soft Graceful - * equivalent to Off Soft but preceded by a request to the managed element - * to perform an orderly shutdown. - * - * System power off but auxiliary or flea power may be available but preceded - * by a request to the managed element to perform an orderly shutdown. - * - * Linux_AssociatedPowerManagementService_PowerState_Off___Soft_Graceful - */ - // Poweroff (shut down programs first) - list[i++] = Linux_AssociatedPowerManagementService_PowerState_Off___Soft_Graceful; - - /* 13 Off - Hard Graceful - * equivalent to Off Hard but preceded by a request to the managed element - * to perform an orderly shutdown. - * - * Power Off performed through mechanical means like unplugging power cable - * or UPS On but preceded by a request to the managed element to perform - * an orderly shutdown. - * - * Linux_AssociatedPowerManagementService_PowerState_Off___Hard_Graceful - */ - // not implemented - - /* 14 Master Bus Rest Graceful - * equivalent to Master Bus Reset but preceded by a request to the managed - * element to perform an orderly shutdown. - * - * Hardware reset but preceded by a request to the managed element - * to perform an orderly shutdown. - * - * Linux_AssociatedPowerManagementService_PowerState_Master_Bus_Reset_Graceful - */ - // not implemented - - /* 15 Power Cycle (Off - Soft Graceful) - * equivalent to Power Cycle (Off - Soft) but preceded by a request - * to the managed element to perform an orderly shutdown. - * - * Reset system without removing power but preceded by a request - * to the managed element to perform an orderly shutdown. - * - * Linux_AssociatedPowerManagementService_PowerState_Power_Cycle_Off___Soft_Graceful - */ - // Reboot (shut down programs first) - list[i++] = Linux_AssociatedPowerManagementService_PowerState_Power_Cycle_Off___Soft_Graceful; - - /* 16 Power Cycle (Off - Hard Graceful) - * equivalent to Power Cycle (Off - Hard) but preceded by a request - * to the managed element to perform an orderly shutdown. - * - * Equivalent to Off–Hard followed by On but preceded by a request - * to the managed element to perform an orderly shutdown. - * - * Linux_AssociatedPowerManagementService_PowerState_Power_Cycle_Off___Hard_Graceful - */ - // not implemented - - *count = i; - return list; -} - -void job_free(PowerStateChangeJob *job) -{ - job->broker->xft->destroyMutex(job->mutex); -} - -GList *power_get_jobs(Power *power) -{ - PowerStateChangeJob *powerStateChangeJob; - GList *plist = power->jobs; - while (plist) { - powerStateChangeJob = plist->data; - MUTEX_LOCK(powerStateChangeJob); - if ((powerStateChangeJob->jobState == Linux_ConcreteJob_JobState_Completed || - powerStateChangeJob->jobState == Linux_ConcreteJob_JobState_Killed || - powerStateChangeJob->jobState == Linux_ConcreteJob_JobState_Terminated) && - time(NULL) - powerStateChangeJob->timeOfLastChange > powerStateChangeJob->timeBeforeRemoval) { - - MUTEX_LOCK(power); - power->jobs = g_list_remove_link(power->jobs, plist); - MUTEX_UNLOCK(power); - job_free(powerStateChangeJob); - } - MUTEX_UNLOCK(powerStateChangeJob); - plist = g_list_next(plist); - } - return power->jobs; -} - -unsigned short job_state(PowerStateChangeJob *state) -{ - return state->jobState; -} - -int job_timeOfLastChange(PowerStateChangeJob *state) -{ - return state->timeOfLastChange; -} - -int job_timeBeforeRemoval(PowerStateChangeJob *state) -{ - return state->timeBeforeRemoval; -} - diff --git a/providers/power/src/power.h b/providers/power/src/power.h deleted file mode 100644 index 8f1f0bc..0000000 --- a/providers/power/src/power.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef POWER_H -#define POWER_H - -#include - -typedef struct _Power Power; -typedef struct _CMPIBroker CMPIBroker; -typedef struct _PowerStateChangeJob PowerStateChangeJob; - -/** - * Get reference to global power object - * \note Don't forget to call power_unref - */ -Power *power_ref(const CMPIBroker *_cb); - -/** - * Decrement reference counter for power struct - */ -void power_unref(Power *power); - -/** - * Get list of available requested power states - * - * \param power Pointer to power struct, obtained by power_ref - * \param count Number of states returned - * \return list of power states - */ -unsigned short *power_available_requested_power_states(Power *power, int *count); - -/** - * Get requested power state - * - * \param power Pointer to power struct, obtained by power_ref - * \return current requested power state - */ -unsigned short power_requested_power_state(Power *power); - -/** - * Request change power state to \p state - * - * \param power Pointer to power struct, obtained by power_ref - * \param state Requested power state - * \return CMPI return code - */ -int power_request_power_state(Power *power, unsigned short state); - -GList *power_get_jobs(Power *power); - -unsigned short power_transitioning_to_power_state(Power *power); - - -unsigned short job_state(PowerStateChangeJob *state); -int job_timeOfLastChange(PowerStateChangeJob *state); -int job_timeBeforeRemoval(PowerStateChangeJob *state); - -#endif // POWER_H diff --git a/providers/power/src/trace.c b/providers/power/src/trace.c deleted file mode 100644 index 1f23a6a..0000000 --- a/providers/power/src/trace.c +++ /dev/null @@ -1,29 +0,0 @@ - -#include -#include -#include - -static FILE *_trace_file = NULL; - -void _trace(int level, const char *file, int line, const char *format, ...) -{ - // TODO; level - if (_trace_file == NULL) { - char *filename = getenv("SBLIM_TRACE_FILE"); - if (filename != NULL) { - _trace_file = fopen(filename, "a"); - if (_trace_file == NULL) { - _trace_file = stderr; - } - } else { - _trace_file = stderr; - } - } - - va_list args; - va_start(args, format); - fprintf(_trace_file, "%s:%d\t", file, line); - vfprintf(_trace_file, format, args); - fprintf(_trace_file, "\n"); - va_end(args); -} diff --git a/providers/power/src/trace.h b/providers/power/src/trace.h deleted file mode 100644 index 65118d4..0000000 --- a/providers/power/src/trace.h +++ /dev/null @@ -1,4 +0,0 @@ - -#define TRACE(level, ...) _trace(level, __FILE__, __LINE__, __VA_ARGS__) - -void _trace(int level, const char *file, int line, const char *format, ...); diff --git a/src/fan/.gitignore b/src/fan/.gitignore new file mode 100644 index 0000000..57828b5 --- /dev/null +++ b/src/fan/.gitignore @@ -0,0 +1,3 @@ +*.o +*.so + diff --git a/src/fan/LICENSE b/src/fan/LICENSE new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/src/fan/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. 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 +them 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 prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. 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. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey 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; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If 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 convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + 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. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +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. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 3 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, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program 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, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU 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 Lesser General +Public License instead of this License. But first, please read +. diff --git a/src/fan/Linux_Fan.c b/src/fan/Linux_Fan.c new file mode 100644 index 0000000..738920b --- /dev/null +++ b/src/fan/Linux_Fan.c @@ -0,0 +1,536 @@ +/* This file is part of cmpiLinux_FanProvider. + * + * cmpiLinux_FanProvider 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 3 of the License, or + * (at your option) any later version. + * + * cmpiLinux_FanProvider 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 cmpiLinux_FanProvider. If not, see + * . + */ +#ifndef _XOPEN_SOURCE + //this is for strdup + #define _XOPEN_SOURCE 500 +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Linux_Fan.h" + +#define MAX_CHIP_NAME_LENGTH 200 + +//* constants ***************************************************************** +static bool MODULE_INITIALIZED = false; + +static char const * const _fan_errors[] = { + "success", + "failed to get fan by identification supplied", + "given identification data is not enough to identify uniquely", + "no chip with given system path found", + "no fan with given name and chip found", + "unknown property", + "this property is not supported for setting", + "property is not writable", + "input/output error", + "initialization failed", + "unknown error occured" +}; + +//* static functions ********************************************************** +static cim_fan_error_t prop_type2sf_num( + cim_fan_prop_type_t pt, + int *sf_num) +{ + switch (pt) { + case CIM_FAN_MIN_SPEED: *sf_num = SENSORS_SUBFEATURE_FAN_MIN; break; + case CIM_FAN_MAX_SPEED: +#ifdef SENSORS_SUBFEATURE_FAN_MAX + *sf_num = SENSORS_SUBFEATURE_FAN_MAX; break; +#else + return CIM_FAN_NOT_SUPPORTED_PROP; +#endif + case CIM_FAN_DIV: *sf_num = SENSORS_SUBFEATURE_FAN_DIV; break; + case CIM_FAN_PULSES: *sf_num = SENSORS_SUBFEATURE_FAN_PULSES; break; + case CIM_FAN_BEEP: *sf_num = SENSORS_SUBFEATURE_FAN_BEEP; break; + default: return CIM_FAN_UNKNOWN_PROP; break; + } + return CIM_FAN_SUCCESS; +} + +static double prop_val2double( + cim_fan_prop_type_t pt, + cim_fan_prop_value_t const *val) { + switch (pt) { + case CIM_FAN_MIN_SPEED: return val->min_speed; + case CIM_FAN_MAX_SPEED: return val->max_speed; + case CIM_FAN_DIV: return val->divisor; + case CIM_FAN_PULSES: return val->pulses; + case CIM_FAN_BEEP: return val->beep; + } + return 0; +} + +static cim_fan_error_t libsensors2cim_fan_error(int err) { + if (!err) return CIM_FAN_SUCCESS; + if (err < 0) err = -err; + if (err < SENSORS_ERR_WILDCARDS || err > SENSORS_ERR_RECURSION) { + return CIM_FAN_OTHER_ERROR; + } + return (cim_fan_error_t) (0x100 + err); +} + +static const char * sprintf_chip_name(sensors_chip_name const *name) { + /** @return NULL on error, cstring otherwise */ + static char buf[MAX_CHIP_NAME_LENGTH]; + if (sensors_snprintf_chip_name(buf, MAX_CHIP_NAME_LENGTH, name) < 0) + return NULL; + return buf; +} + +static cim_fan_error_t reload_config_file(char const * fp) { + /** + * @param fp if NULL -> default configuration file will be loaded + * @return 0 on success */ + FILE *config_file = NULL; + int err; + + if (fp) { + if (!(config_file = fopen(fp, "r"))) { + fprintf(stderr, "Cound not open config file \"%s\": %s\n", + fp, strerror(errno)); + } + } + err = sensors_init(config_file); + if (err) { + fprintf(stderr, "sensors_init: %s\n", sensors_strerror(err)); + if (config_file) fclose(config_file); + }else { + if (config_file) fclose(config_file); + } + return libsensors2cim_fan_error(err); +} + +static double _get_value( sensors_chip_name const *chip + , sensors_subfeature const *sf) +{ + double val; + if (sensors_get_value(chip, sf->number, &val)) return 0.; + return val; +} + +static int _assign_sf_value( + sensors_chip_name const *chip, + sensors_feature const *feature, + int subfeature_type, + struct cim_fan *fdest) +{ + sensors_subfeature const *sf; + double val; + + sf = sensors_get_subfeature(chip, feature, subfeature_type); + val = sf ? _get_value(chip, sf):0.; + switch (subfeature_type) { + case SENSORS_SUBFEATURE_FAN_INPUT: fdest->speed = val; break; + case SENSORS_SUBFEATURE_FAN_MIN: fdest->min_speed = val; break; +#ifdef SENSORS_SUBFEATURE_FAN_MAX + case SENSORS_SUBFEATURE_FAN_MAX: fdest->max_speed = val; break; +#endif + case SENSORS_SUBFEATURE_FAN_DIV: fdest->divisor = val; break; + case SENSORS_SUBFEATURE_FAN_PULSES: fdest->pulses = val; break; + case SENSORS_SUBFEATURE_FAN_FAULT: fdest->fault = val != 0; break; + case SENSORS_SUBFEATURE_FAN_BEEP: fdest->beep = val != 0; break; + case SENSORS_SUBFEATURE_FAN_ALARM: fdest->alarm = val != 0; break; +#ifdef SENSORS_SUBFEATURE_ALARM_MIN + case SENSORS_SUBFEATURE_FAN_ALARM_MIN: + fdest->alarm_min = val != 0; + break; +#endif +#ifdef SENSORS_SUBFEATURE_FAN_ALARM_MAX + case SENSORS_SUBFEATURE_FAN_ALARM_MAX: + fdest->alarm_max = val != 0; + break; +#endif + default: return 1; + } + return !sf; +} + +static unsigned int _load_accessible_features( + sensors_chip_name const *chip, + sensors_feature const *feature) +{ + sensors_subfeature const *sf; + unsigned int res = 0; + unsigned int i = 1; + int sf_type; + + while(i <= CIM_FAN_AF_FEATURE_MAX) { + switch (i) { + case CIM_FAN_AF_MIN_SPEED: + sf_type = SENSORS_SUBFEATURE_FAN_MIN; break; +#ifdef SENSORS_SUBFEATURE_FAN_MAX + case CIM_FAN_AF_MAX_SPEED: + sf_type = SENSORS_SUBFEATURE_FAN_MAX; break; +#endif + case CIM_FAN_AF_DIV: + sf_type = SENSORS_SUBFEATURE_FAN_DIV; break; + case CIM_FAN_AF_PULSES: + sf_type = SENSORS_SUBFEATURE_FAN_PULSES; break; + case CIM_FAN_AF_FAULT: + sf_type = SENSORS_SUBFEATURE_FAN_FAULT; break; + case CIM_FAN_AF_BEEP: + sf_type = SENSORS_SUBFEATURE_FAN_BEEP; break; + case CIM_FAN_AF_ALARM: + sf_type = SENSORS_SUBFEATURE_FAN_ALARM; break; +#ifdef SENSORS_SUBFEATURE_FAN_ALARM_MIN + case CIM_FAN_AF_ALARM_MIN: + sf_type = SENSORS_SUBFEATURE_ALARM_MIN: break; +#endif +#ifdef SENSORS_SUBFEATURE_ALARM_MAX + case CIM_FAN_AF_ALARM_MAX: + sf_type = SENSORS_SUBFEATURE_ALARM_MAX; break; +#endif + default: + sf_type = -1; break; + } + if (sf_type != -1) { + sf = sensors_get_subfeature(chip, feature, sf_type); + res |= sf ? i : 0; + } + i = i << 1; + } + return res; +} + + +static struct cim_fan * _load_fan_data( sensors_chip_name const *chip + , sensors_feature const *feature) +{ + struct cim_fan *f; + char const *chip_name; + char * tmp; + int length; + int const sfs[] = { + SENSORS_SUBFEATURE_FAN_INPUT, + SENSORS_SUBFEATURE_FAN_MIN, +#ifdef SENSORS_SUBFEATURE_FAN_MAX + SENSORS_SUBFEATURE_FAN_MAX, +#endif + SENSORS_SUBFEATURE_FAN_DIV, + SENSORS_SUBFEATURE_FAN_PULSES, + SENSORS_SUBFEATURE_FAN_FAULT, + SENSORS_SUBFEATURE_FAN_BEEP, + SENSORS_SUBFEATURE_FAN_ALARM, +#ifdef SENSORS_SUBFEATURE_FAN_MIN_ALARM + SENSORS_SUBFEATURE_FAN_MIN_ALARM, +#endif +#ifdef SENSORS_SUBFEATURE_FAN_MAX_ALARM + SENSORS_SUBFEATURE_FAN_MAX_ALARM, +#endif + -1, // terminator + }; + + + if ((f = calloc(1, sizeof(struct cim_fan)))) { + if (!(chip_name = sprintf_chip_name(chip))) { + fprintf(stderr, "could not get chip name\n"); + goto lab_err_free_fan; + } + if (!(f->chip_name = strdup(chip_name))) { + perror("strdup"); + goto lab_err_free_fan; + } + f->sys_path = chip->path; + if (!(f->name = sensors_get_label(chip, feature))) { + fprintf(stderr, "could not get fan name for chip: %s\n", + f->chip_name); + goto lab_err_chip_name; + } + length = strlen(f->sys_path); + if (!(f->device_id = malloc((length + strlen(f->name) + 2) + * sizeof(char)))) { + perror("malloc"); + goto lab_err_fan_name; + } + tmp = strcpy((char*) f->device_id, f->sys_path); + tmp += length * sizeof(char); + if (f->sys_path[length - 1] != '/') { + //this will be almost certainly true + *(tmp++) = '/'; + } + strcpy(tmp, f->name); + + for (int const *sf_ptr=sfs; *sf_ptr != -1; ++sf_ptr) { + _assign_sf_value(chip, feature, *sf_ptr, f); + } + f->accessible_features = _load_accessible_features(chip, feature); + return f; + } +//lab_err_device_id: +// free((char*) f->device_id); +lab_err_fan_name: + free((char*) f->name); +lab_err_chip_name: + free((char*) f->chip_name); +lab_err_free_fan: + free(f); + return NULL; +} + +static cim_fan_error_t _find_fan( + char const *sys_path, + char const *fan_name, + sensors_chip_name const **chip, + sensors_feature const **feature) +{ + int chip_nr = 0, feature_nr = 0; + char * sp = (char*) sys_path; + char const *label; + int length; + cim_fan_error_t ret = CIM_FAN_OTHER_ERROR; + + if (!sys_path || !fan_name) goto lab_err_fan_data; + + length = strlen(sys_path); + if (length && sys_path[length - 1] == '/') { + if (!(sp = strdup(sys_path))) { + perror("strdup"); + goto lab_err_fan_data; + } + sp[length - 1] = '\0'; + } + + while ((*chip = sensors_get_detected_chips(NULL, &chip_nr))) { + if ((*chip)->path && !strcmp((*chip)->path, sys_path)) break; + } + if (!(*chip)) { + ret = CIM_FAN_NO_SUCH_CHIP; + goto lab_err_sys_path; + } + while ((*feature = sensors_get_features(*chip, &feature_nr))) { + if ((*feature)->type != SENSORS_FEATURE_FAN) continue; + if (!(label = sensors_get_label(*chip, *feature))) { + continue; + } + if (!strcmp(label, fan_name)) { + free((char*) label); + break; + } + free((char*) label); + } + if (!(*feature)) { + ret = CIM_FAN_NO_SUCH_FAN_NAME; + goto lab_err_sys_path; + } + return CIM_FAN_SUCCESS; + +lab_err_sys_path: + if (sp != sys_path) free(sp); +lab_err_fan_data: + return ret; +} + +static cim_fan_error_t _find_fan_by_id( + char const *device_id, + sensors_chip_name const **chip, + sensors_feature const **feature) +{ + char *sys_path; + char *fan_name; + char *tmp1, *tmp2; + cim_fan_error_t ret; + + if (!(tmp1 = strdup(device_id))) { + perror("strdup"); + return CIM_FAN_OTHER_ERROR; + } + if (!(tmp2 = strdup(device_id))) { + perror("strdup"); + free(tmp1); + return CIM_FAN_OTHER_ERROR; + } + sys_path = dirname(tmp1); + fan_name = basename(tmp2); + ret = _find_fan(sys_path, fan_name, chip, feature); + free(tmp1); + free(tmp2); + + return ret; +} + +static cim_fan_error_t _set_fan_prop( + sensors_chip_name const *chip, + cim_fan_prop_type_t prop_type, + cim_fan_prop_value_t const *prop) +{ + int sf_num; + cim_fan_error_t err; + double val; + + if (!(err = prop_type2sf_num(prop_type, &sf_num))) { + val = prop_val2double(prop_type, prop); + err = libsensors2cim_fan_error( + sensors_set_value(chip, sf_num, val)); + } + return err; +} + +//* module interface ********************************************************** +char const * cim_fan_strerror(cim_fan_error_t error) { + if ( ((int) error) > 0x100 + && ((int) error) <= 0x100 + SENSORS_ERR_RECURSION) { + return sensors_strerror(((int) error) - 0x100); + } + if ( ((int) error) < CIM_FAN_SUCCESS + || ((int) error) > CIM_FAN_OTHER_ERROR) { + return "unknown error code"; + } + return _fan_errors[(int) error]; +} + +cim_fan_error_t enum_all_fans(struct fanlist **lptr) { + struct fanlist * lptrhelp = NULL; + sensors_chip_name const *chip; + sensors_feature const *feature; + int chip_nr = 0, feature_nr; + + if (!(lptrhelp = calloc(1, sizeof(struct fanlist)))) { + perror("calloc"); + return CIM_FAN_OTHER_ERROR; + } + *lptr = lptrhelp; + while ((chip = sensors_get_detected_chips(NULL, &chip_nr))) { + feature_nr = 0; + while ((feature = sensors_get_features(chip, &feature_nr))) { + if (feature->type != SENSORS_FEATURE_FAN) continue; + if (lptrhelp->f) { + if (!(lptrhelp->next = calloc(1, sizeof(struct fanlist)))) { + free_fanlist(*lptr); + perror("calloc"); + return CIM_FAN_OTHER_ERROR; + } + lptrhelp = lptrhelp->next; + } + if (!(lptrhelp->f = _load_fan_data(chip, feature))) { + free_fanlist(*lptr); + return CIM_FAN_OTHER_ERROR; + } + } + } + if (!(*lptr)->f) { + free_fanlist(*lptr); + *lptr = NULL; + } + return CIM_FAN_SUCCESS; +} + +cim_fan_error_t get_fan_data_by_id( + char const *device_id, + struct cim_fan **sptr) +{ + sensors_chip_name const *chip; + sensors_feature const *feature; + cim_fan_error_t ret; + + if ((ret = _find_fan_by_id(device_id, &chip, &feature)) + == CIM_FAN_SUCCESS) { + if (!(*sptr = _load_fan_data(chip, feature))) { + ret = CIM_FAN_OTHER_ERROR; + } + } + return ret; +} + +cim_fan_error_t get_fan_data( + char const *sys_path, + char const *fan_name, + struct cim_fan **sptr) +{ + sensors_chip_name const *chip; + sensors_feature const *feature; + cim_fan_error_t ret; + + if ((ret = _find_fan(sys_path, fan_name, &chip, &feature)) + == CIM_FAN_SUCCESS) { + if (!(*sptr = _load_fan_data(chip, feature))) { + ret = CIM_FAN_OTHER_ERROR; + } + } + return ret; +} + +cim_fan_error_t set_fan_prop_by_id( + char const *device_id, + cim_fan_prop_type_t prop_type, + cim_fan_prop_value_t const *prop) +{ + sensors_chip_name const *chip; + sensors_feature const *feature; + cim_fan_error_t err; + + if (!(err = _find_fan_by_id(device_id, &chip, &feature))) + err = _set_fan_prop(chip, prop_type, prop); + return err; +} + +cim_fan_error_t set_fan_prop( + char const *sys_path, + char const *fan_name, + cim_fan_prop_type_t prop_type, + cim_fan_prop_value_t const *prop) +{ + sensors_chip_name const *chip; + sensors_feature const *feature; + cim_fan_error_t err; + + if (!(err = _find_fan(sys_path, fan_name, &chip, &feature))) + err = _set_fan_prop(chip, prop_type, prop); + return err; +} + +void free_fanlist(struct fanlist *lptr) { + struct fanlist *tmp; + while (lptr) { + tmp = lptr->next; + if (lptr->f) free_fan(lptr->f); + free(lptr); + lptr = tmp; + } +} + +void free_fan(struct cim_fan *fan) { + if (fan) { + if (fan->name) free((char*) fan->name); + if (fan->chip_name) free((char*) fan->chip_name); + if (fan->device_id) free((char*) fan->device_id); + free(fan); + } +} + +cim_fan_error_t init_linux_fan_module() { + if (!MODULE_INITIALIZED) { + if (reload_config_file(NULL)) return CIM_FAN_INIT_FAILED; + MODULE_INITIALIZED = true; + } + return CIM_FAN_SUCCESS; +} + +void cleanup_linux_fan_module() { + if (MODULE_INITIALIZED) { + sensors_cleanup(); + MODULE_INITIALIZED = false; + } +} + diff --git a/src/fan/Linux_Fan.h b/src/fan/Linux_Fan.h new file mode 100644 index 0000000..6eacd49 --- /dev/null +++ b/src/fan/Linux_Fan.h @@ -0,0 +1,198 @@ +/* This file is part of cmpiLinux_FanProvider. + * + * cmpiLinux_FanProvider 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 3 of the License, or + * (at your option) any later version. + * + * cmpiLinux_FanProvider 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 cmpiLinux_FanProvider. If not, see + * . + */ +#ifndef LINUX_FAN_H_ +#define LINUX_FAN_H_ + +#include + +/** accessible features of fan + * each value represents a bit position in accessible_features vector in + * cim_fan struct + */ +#define CIM_FAN_AF_MIN_SPEED (1 << 0) +#define CIM_FAN_AF_MAX_SPEED (1 << 1) +#define CIM_FAN_AF_DIV (1 << 2) +#define CIM_FAN_AF_PULSES (1 << 3) +#define CIM_FAN_AF_FAULT (1 << 4) +#define CIM_FAN_AF_BEEP (1 << 5) +#define CIM_FAN_AF_ALARM (1 << 6) +#define CIM_FAN_AF_ALARM_MIN (1 << 7) +#define CIM_FAN_AF_ALARM_MAX (1 << 8) +#define CIM_FAN_AF_FEATURE_MAX (1 << 8) + +/** + * Descriptions of attributes are taken from: + * sysfs-interface documentation of hwmon + */ +struct cim_fan{ + char const * chip_name; + char const * sys_path; + char const * name; + /* is a composition of sys_path and name + * uniquely identifies fan + */ + char const * device_id; + + /* This is a bit vector with bit on position i meaning: + * CIM_FAN_AF_[i] = 1 <==> feature is available in fan's kernel interface + * (a file/channel is available under sys_path) + */ + unsigned int accessible_features; + + /* [RO] Fan input value. + * Unit: revolution/min (RPM) + */ + unsigned int speed; + + /* [RW] Fan minimum value + * Unit: revolution/min (RPM) + */ + unsigned int min_speed; + + /* [RW] Fan maximum value + * Unit: revolution/min (RPM) + * Only rarely supported by the hardware. + */ + unsigned int max_speed; + + /* [RW] Fan divisor. + * Integer value in powers of two (1, 2, 4, 8, 16, 32, 64, 128). + * Some chips only support values 1, 2, 4 and 8. + * Note that this is actually an internal clock divisor, which + * affects the measurable speed range, not the read value. + */ + unsigned int divisor; + + /* [RW] Number of tachometer pulses per fan revolution. + * Integer value, typically between 1 and 4. + * This value is a characteristic of the fan connected to the + * device's input, so it has to be set in accordance with the fan + * model. + * Should only be created if the chip has a register to configure + * the number of pulses. In the absence of such a register (and + * thus attribute) the value assumed by all devices is 2 pulses + * per fan revolution. + */ + unsigned int pulses; + + /* [RO] Each input channel may have an associated fault file. This can be + * used to notify open diodes, unconnected fans etc. where the hardware + * supports it. When this boolean has value 1, the measurement for that + * channel should not be trusted. + */ + bool fault; + + /* [RW] Channel beep + * false : disable + * true : enable + * Some chips also offer the possibility to get beeped when an alarm + * occurs. + */ + bool beep; + + /* [RO] Channel alarm + * false : no alarm + * true : alarm + * Each channel or limit may have an associated alarm file, containing a + * boolean value. 1 means that an alarm condition exists, 0 means no alarm. + * + * Usually a given chip will either use channel-related alarms, or + * limit-related alarms, not both. The driver should just reflect the + * hardware implementation. + */ + bool alarm; + bool alarm_min; + bool alarm_max; +}; + +struct fanlist{ + struct cim_fan * f; + struct fanlist * next; +}; + +typedef enum cim_fan_prop_type{ + CIM_FAN_MIN_SPEED = 1 << 0, + CIM_FAN_MAX_SPEED = 1 << 1, + CIM_FAN_DIV = 1 << 2, + CIM_FAN_PULSES = 1 << 3, + CIM_FAN_BEEP = 1 << 4, +}cim_fan_prop_type_t; + +typedef union cim_fan_prop_value{ + unsigned int min_speed; + unsigned int max_speed; + unsigned int divisor; + unsigned int pulses; + bool beep; +}cim_fan_prop_value_t; + +/** errors *******************************************************************/ +typedef enum cim_fan_error{ + CIM_FAN_SUCCESS = 0, + CIM_FAN_FAILED_TO_GET_FAN = 1, + CIM_FAN_MISSING_IDENTIFICATION = 2, + CIM_FAN_NO_SUCH_CHIP = 3, + CIM_FAN_NO_SUCH_FAN_NAME = 4, + CIM_FAN_UNKNOWN_PROP = 5, + CIM_FAN_NOT_SUPPORTED_PROP = 6, + CIM_FAN_NOT_WRITABLE_PROP = 7, + CIM_FAN_INIT_FAILED = 9, + CIM_FAN_OTHER_ERROR = 10, + + CIM_FAN_SEN_WILDCARDS = 0x101, + CIM_FAN_SEN_NO_ENTRY = 0x102, + CIM_FAN_SEN_ACCESS_R = 0x103, + CIM_FAN_SEN_KERNEL = 0x104, + CIM_FAN_SEN_DIV_ZERO = 0x105, + CIM_FAN_SEN_CHIP_NAME = 0x106, + CIM_FAN_SEN_BUS_NAME = 0x107, + CIM_FAN_SEN_PARSE = 0x108, + CIM_FAN_SEN_ACCESS_W = 0x109, + CIM_FAN_SEN_IO = 0x110, + CIM_FAN_SEN_RECURSION = 0x111, +}cim_fan_error_t; + +char const * cim_fan_strerror(cim_fan_error_t error); + +cim_fan_error_t enum_all_fans(struct fanlist ** lptr); + +cim_fan_error_t get_fan_data_by_id( + char const *device_id, + struct cim_fan **sptr); +cim_fan_error_t get_fan_data( + char const *sys_path, + char const *fan_name, + struct cim_fan **sptr); + +cim_fan_error_t set_fan_prop_by_id( + char const *device_id, + cim_fan_prop_type_t prop_type, + cim_fan_prop_value_t const *prop); +cim_fan_error_t set_fan_prop( + char const *sys_path, + char const *fan_name, + cim_fan_prop_type_t prop_type, + cim_fan_prop_value_t const *prop); + +void free_fanlist(struct fanlist *lptr); +void free_fan(struct cim_fan *sptr); + +cim_fan_error_t init_linux_fan_module(); +void cleanup_linux_fan_module(); + +#endif /* ----- LINUX_FAN_H_ ----- */ + diff --git a/src/fan/Makefile b/src/fan/Makefile new file mode 100644 index 0000000..35a91c7 --- /dev/null +++ b/src/fan/Makefile @@ -0,0 +1,35 @@ +CC=gcc +CFLAGS=-Wall -Wextra -std=c99 -g +LIBS=Linux_Fan Linux_FanSensor Linux_FanAssociatedSensor +LIBRARIES=$(foreach l,$(LIBS),cmpi$(l)Provider) +LIBRNS=$(foreach l,$(LIBRARIES),lib$(l).so) +DESTLIBDIR=$(shell [ `uname -m` = "x86_64" ] && echo /usr/lib64/cmpi || echo /usr/lib/cmpi) +LINKS=$(foreach l,$(LIBRNS),$(DESTLIBDIR)/$(l)) + +providers: $(LIBRNS) + +libcmpiLinux_FanAssociatedSensorProvider.so: \ + cmpiLinux_FanAssociatedSensorProvider.o + $(CC) -shared -Wl -o $@ $^ -lcmpiOSBase_Common + +libcmpi%Provider.so: cmpi%Provider.o cmpi%.o \ + cmpiLinux_FanCommon.o Linux_Fan.o + $(CC) -shared -Wl -o $@ $^ -lcmpiOSBase_Common -lsensors + +%.o: %.c + $(CC) $(CFLAGS) -I/usr/include/cmpi -c -fPIC -o $@ $^ + +clean: + -rm *.o *.so + +sfcb: $(LINKS) + sfcbstage -r mof/Linux_Fan.reg mof/Linux_Fan.mof + sfcbrepos -f + +$(DESTLIBDIR)/%.so: %.so + ln -sf `pwd`/$? $(DESTLIBDIR) + +install: $(LIBRNS) + cp $^ $(DESTLIBDIR) + sfcbstage -r mof/Linux_Fan.reg mof/Linux_Fan.mof + sfcbrepos -f diff --git a/src/fan/README b/src/fan/README new file mode 100644 index 0000000..bf226a5 --- /dev/null +++ b/src/fan/README @@ -0,0 +1,42 @@ +******************************************************************************* + * Description +******************************************************************************* +CIM Linux_Fan providers for sfcb. Specific for linux, because of usage of +lm_sensors library for hadware monitoring of fans. It uses CMPI, so +it should be usable under any broker supporting this interface. + +There are three providers provided according to CIM model: + * Linux_Fan + - Provides instance for every fan founded by lm_sensors with basic + information. + * Linux_FanSensor + - Associated sensor for each instance of Linux_Fan. + - Value of fan speed can be obtained from property CurrentReading. + * Linux_FanAssociatedSensor + - Provides association of instances of above 2 providers. + +******************************************************************************* + * Build Dependencies +******************************************************************************* + * lm_sensors - installed and configured + * lm_sensors-libs + * lm_sensors-devel + * sblim-cmpi-devel + * sblim-cmpi-base + * sblim-cmpi-base-devel (for library cmpiOSBase_Common) + +******************************************************************************* + * Build and installation (for sfcb) +******************************************************************************* +steps: + * make + * make install + +alternatively: + * make + * install *.so libraries to your cmpi libdir + * sfcbstage -r mof/Linux_Fan.reg mof/Linux_Fan.mof + * sfcbrepos -f + +and restart broker: + systemctl restart sfcb.service diff --git a/src/fan/cmpiLinux_Fan.c b/src/fan/cmpiLinux_Fan.c new file mode 100644 index 0000000..8088a70 --- /dev/null +++ b/src/fan/cmpiLinux_Fan.c @@ -0,0 +1,128 @@ +/* This file is part of cmpiLinux_FanProvider. + * + * cmpiLinux_FanProvider 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 3 of the License, or + * (at your option) any later version. + * + * cmpiLinux_FanProvider 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 cmpiLinux_FanProvider. If not, see + * . + */ +#ifndef _XOPEN_SOURCE + //this is for strdup + #define _XOPEN_SOURCE 500 +#endif +#include +#include +#include +#include +#include +#include +#include + +#include "cmpiLinux_Fan.h" + +static CMPIArray * _get_AccessibleFeatures( + CMPIBroker const *_broker, + CMPIStatus *rc, + struct cim_fan const *sptr) +{ + int index = 0; + uint16_t value = 1; + unsigned int i = 1; + + CMPIArray *res = CMNewArray(_broker, 8, CMPI_uint16, rc); + if (!res) { + CMSetStatusWithChars(_broker, rc, CMPI_RC_ERR_FAILED, + "CMNewArray(_broker, 8, CMPI_uint16, rc)"); + _OSBASE_TRACE(2, ("--- _get_AccessibleFeatures failed: %s", + CMGetCharPtr(rc->msg))); + }else { + while (i <= CIM_FAN_AF_FEATURE_MAX) { + if (i & sptr->accessible_features) { + CMSetArrayElementAt(res, index++, (CMPIValue*)(&value), + CMPI_uint16); + } + ++value; + i = i << 1; + } + } + return res; +} + +CMPIObjectPath * _makePath_Fan( + CMPIBroker const *_broker, + CMPIContext const *ctx, + CMPIObjectPath const *cop, + struct cim_fan *sptr, + CMPIStatus *rc) +{ + return _makePath_FanCommon(_ClassName, _broker, ctx, cop, sptr, rc); +} + +CMPIInstance * _makeInst_Fan( + CMPIBroker const *_broker, + CMPIContext const *ctx, + CMPIObjectPath const *cop, + char const **properties, + struct cim_fan *sptr, + CMPIStatus *rc) +{ + CMPIObjectPath *op; + CMPIInstance *ci; + CMPIValue val; + + _OSBASE_TRACE(2, ("--- _makeInst_Fan() called")); + if (!(ci = _makeInst_FanCommon(_ClassName, _broker, ctx, cop, properties, + sptr, rc, &op))) { + return NULL; + } + + // CoolingDevice + val.boolean = true; + CMSetProperty(ci, "ActiveCooling", &val, CMPI_boolean); + + // CIM_Fan + // Linux_Fan + val.array = _get_AccessibleFeatures(_broker, rc, sptr); + if (!rc->rc) { + CMSetProperty(ci, "AccessibleFeatures", &val, CMPI_uint16A); + } + if (!rc->rc && sptr->accessible_features & CIM_FAN_AF_MIN_SPEED) { + val.uint64 = (uint64_t) sptr->min_speed; + CMSetProperty(ci, "MinSpeed", &val, CMPI_uint64); + } + if (!rc->rc && sptr->accessible_features & CIM_FAN_AF_MAX_SPEED) { + val.uint64 = (uint64_t) sptr->max_speed; + CMSetProperty(ci, "MaxSpeed", &val, CMPI_uint64); + } + if (!rc->rc && sptr->accessible_features & CIM_FAN_AF_DIV) { + CMSetProperty(ci, "Divisor", &sptr->divisor, CMPI_uint32); + } + if (!rc->rc && sptr->accessible_features & CIM_FAN_AF_PULSES) { + CMSetProperty(ci, "Pulses", &sptr->pulses, CMPI_uint32); + } + if (!rc->rc && sptr->accessible_features & CIM_FAN_AF_BEEP) { + val.boolean = sptr->beep; + CMSetProperty(ci, "Beep", &val, CMPI_boolean); + } + if (!rc->rc && sptr->accessible_features & CIM_FAN_AF_ALARM) { + CMSetProperty(ci, "Alarm", &sptr->alarm, CMPI_boolean); + } + if (!rc->rc && sptr->accessible_features & CIM_FAN_AF_ALARM_MIN) { + CMSetProperty(ci, "MinAlarm", &sptr->alarm_min, CMPI_boolean); + } + if (!rc->rc && sptr->accessible_features & CIM_FAN_AF_ALARM_MAX) { + CMSetProperty(ci, "MaxAlarm", &sptr->alarm_max, CMPI_boolean); + } + + _OSBASE_TRACE(2, ("--- _makeInst_Fan() exited")); + return ci; +} + diff --git a/src/fan/cmpiLinux_Fan.h b/src/fan/cmpiLinux_Fan.h new file mode 100644 index 0000000..5fc7227 --- /dev/null +++ b/src/fan/cmpiLinux_Fan.h @@ -0,0 +1,40 @@ +/* This file is part of cmpiLinux_FanProvider. + * + * cmpiLinux_FanProvider 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 3 of the License, or + * (at your option) any later version. + * + * cmpiLinux_FanProvider 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 cmpiLinux_FanProvider. If not, see + * . + */ +#ifndef CMPILINUX_FAN_H_ +#define CMPILINUX_FAN_H_ + +#include "cmpiLinux_FanCommon.h" + +static char const *_ClassName = "Linux_Fan"; + +CMPIObjectPath * _makePath_Fan( + CMPIBroker const *_broker, + CMPIContext const *ctx, + CMPIObjectPath const *cop, + struct cim_fan *sptr, + CMPIStatus *rc); + +CMPIInstance * _makeInst_Fan( + CMPIBroker const *_broker, + CMPIContext const *ctx, + CMPIObjectPath const *cop, + char const **properties, + struct cim_fan *sptr, + CMPIStatus *rc); + +#endif /* ----- CMPILINUX_FAN_H_ ----- */ + diff --git a/src/fan/cmpiLinux_FanAssociatedSensorProvider.c b/src/fan/cmpiLinux_FanAssociatedSensorProvider.c new file mode 100644 index 0000000..61e7dfb --- /dev/null +++ b/src/fan/cmpiLinux_FanAssociatedSensorProvider.c @@ -0,0 +1,561 @@ +/* This file is part of cmpiLinux_FanProvider. + * + * cmpiLinux_FanProvider 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 3 of the License, or + * (at your option) any later version. + * + * cmpiLinux_FanProvider 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 cmpiLinux_FanProvider. If not, see + * . + */ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +static char const * _ClassName = "Linux_FanAssociatedSensor"; +static char const * _RefLeft = "Antecedent"; +static char const * _RefRight = "Dependent"; +static char const * _RefLeftClass = "Linux_FanSensor"; +static char const * _RefRightClass = "Linux_Fan"; + +#define UNUSED(x) ((void) (x)) +static const CMPIBroker * _broker; +#ifdef CMPI_VER_100 + #define Linux_FanAssociatedSensorProviderSetInstance \ + Linux_FanAssociatedSensorProviderModifyInstance +#endif + +/* ---------------------------------------------------------------------------*/ +/* Instance Provider Interface */ +/* ---------------------------------------------------------------------------*/ + +CMPIStatus Linux_FanAssociatedSensorProviderCleanup( + CMPIInstanceMI * mi, + const CMPIContext * ctx, + CMPIBoolean terminate) +{ + UNUSED(mi); UNUSED(ctx); UNUSED(terminate); + _OSBASE_TRACE(1,("--- %s CMPI Cleanup() called",_ClassName)); + _OSBASE_TRACE(1,("--- %s CMPI Cleanup() exited",_ClassName)); + CMReturn(CMPI_RC_OK); +} + +CMPIStatus Linux_FanAssociatedSensorProviderEnumInstanceNames( + CMPIInstanceMI * mi, + const CMPIContext * ctx, + const CMPIResult * rslt, + const CMPIObjectPath * ref) +{ + UNUSED(mi); + CMPIStatus rc = {CMPI_RC_OK, NULL}; + int refrc = 0; + + _OSBASE_TRACE(1,("--- %s CMPI EnumInstanceNames() called",_ClassName)); + + refrc = _assoc_create_inst_1toN( _broker,ctx,rslt,ref, + _ClassName,_RefLeftClass,_RefRightClass, + _RefLeft,_RefRight, + 1,0,&rc); + if( refrc != 0 ) { + if( rc.msg != NULL ) { + _OSBASE_TRACE(1, ("--- %s CMPI EnumInstanceNames() failed : %s", + _ClassName,CMGetCharPtr(rc.msg))); + } + else { + _OSBASE_TRACE(1,("--- %s CMPI EnumInstanceNames() failed",_ClassName)); + } + return rc; + } + + CMReturnDone( rslt ); + _OSBASE_TRACE(1,("--- %s CMPI EnumInstanceNames() exited",_ClassName)); + return rc; +} + +CMPIStatus Linux_FanAssociatedSensorProviderEnumInstances( + CMPIInstanceMI * mi, + const CMPIContext * ctx, + const CMPIResult * rslt, + const CMPIObjectPath * ref, + const char ** properties) +{ + UNUSED(mi); UNUSED(properties); + CMPIStatus rc = {CMPI_RC_OK, NULL}; + int refrc = 0; + + _OSBASE_TRACE(1,("--- %s CMPI EnumInstances() called",_ClassName)); + + refrc = _assoc_create_inst_1toN( _broker,ctx,rslt,ref, + _ClassName,_RefLeftClass,_RefRightClass, + _RefLeft,_RefRight, + 1,1,&rc); + if( refrc != 0 ) { + if( rc.msg != NULL ) { + _OSBASE_TRACE(1, ("--- %s CMPI EnumInstances() failed : %s", + _ClassName,CMGetCharPtr(rc.msg))); + } + else { + _OSBASE_TRACE(1,("--- %s CMPI EnumInstances() failed",_ClassName)); + } + return rc; + } + + CMReturnDone( rslt ); + _OSBASE_TRACE(1,("--- %s CMPI EnumInstances() exited",_ClassName)); + return rc; +} + +CMPIStatus Linux_FanAssociatedSensorProviderGetInstance( + CMPIInstanceMI * mi, + const CMPIContext * ctx, + const CMPIResult * rslt, + const CMPIObjectPath * cop, + const char ** properties) +{ + UNUSED(mi); UNUSED(properties); + const CMPIInstance * ci = NULL; + CMPIStatus rc = {CMPI_RC_OK, NULL}; + + _OSBASE_TRACE(1,("--- %s CMPI GetInstance() called",_ClassName)); + + ci = _assoc_get_inst( _broker,ctx,cop,_ClassName,_RefLeft,_RefRight,&rc); + + if( ci == NULL ) { + if( rc.msg != NULL ) { + _OSBASE_TRACE(1, ("--- %s CMPI GetInstance() failed : %s", + _ClassName,CMGetCharPtr(rc.msg))); + } + else { + _OSBASE_TRACE(1,("--- %s CMPI GetInstance() failed",_ClassName)); + } + return rc; + } + + CMReturnInstance( rslt, ci ); + CMReturnDone(rslt); + _OSBASE_TRACE(1,("--- %s CMPI GetInstance() exited",_ClassName)); + return rc; +} + +CMPIStatus Linux_FanAssociatedSensorProviderCreateInstance( + CMPIInstanceMI * mi, + const CMPIContext * ctx, + const CMPIResult * rslt, + const CMPIObjectPath * cop, + const CMPIInstance * ci) +{ + UNUSED(mi); UNUSED(ctx); UNUSED(rslt); UNUSED(cop); UNUSED(ci); + CMPIStatus rc = {CMPI_RC_OK, NULL}; + + _OSBASE_TRACE(1,("--- %s CMPI CreateInstance() called",_ClassName)); + + CMSetStatusWithChars( _broker, &rc, + CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED" ); + + _OSBASE_TRACE(1,("--- %s CMPI CreateInstance() exited",_ClassName)); + return rc; +} + +CMPIStatus Linux_FanAssociatedSensorProviderSetInstance( + CMPIInstanceMI * mi, + const CMPIContext * ctx, + const CMPIResult * rslt, + const CMPIObjectPath * cop, + const CMPIInstance * ci, + const char ** properties) +{ + UNUSED(mi); UNUSED(ctx); UNUSED(rslt); UNUSED(cop); UNUSED(ci); + UNUSED(properties); + CMPIStatus rc = {CMPI_RC_OK, NULL}; + + _OSBASE_TRACE(1,("--- %s CMPI SetInstance() called",_ClassName)); + + CMSetStatusWithChars( _broker, &rc, + CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED" ); + + _OSBASE_TRACE(1,("--- %s CMPI SetInstance() exited",_ClassName)); + return rc; +} + +CMPIStatus Linux_FanAssociatedSensorProviderDeleteInstance( + CMPIInstanceMI * mi, + const CMPIContext * ctx, + const CMPIResult * rslt, + const CMPIObjectPath * cop) +{ + UNUSED(mi); UNUSED(ctx); UNUSED(rslt); UNUSED(cop); + CMPIStatus rc = {CMPI_RC_OK, NULL}; + + _OSBASE_TRACE(1,("--- %s CMPI DeleteInstance() called",_ClassName)); + + CMSetStatusWithChars( _broker, &rc, + CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED" ); + + _OSBASE_TRACE(1,("--- %s CMPI DeleteInstance() exited",_ClassName)); + return rc; +} + +CMPIStatus Linux_FanAssociatedSensorProviderExecQuery( + CMPIInstanceMI * mi, + const CMPIContext * ctx, + const CMPIResult * rslt, + const CMPIObjectPath * ref, + const char * lang, + const char * query) +{ + UNUSED(mi); UNUSED(ctx); UNUSED(rslt); UNUSED(ref); UNUSED(lang); + UNUSED(query); + CMPIStatus rc = {CMPI_RC_OK, NULL}; + + _OSBASE_TRACE(1,("--- %s CMPI ExecQuery() called",_ClassName)); + + CMSetStatusWithChars( _broker, &rc, + CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED" ); + + _OSBASE_TRACE(1,("--- %s CMPI ExecQuery() exited",_ClassName)); + return rc; +} + + +/* ---------------------------------------------------------------------------*/ +/* Associator Provider Interface */ +/* ---------------------------------------------------------------------------*/ + + +CMPIStatus Linux_FanAssociatedSensorProviderAssociationCleanup( + CMPIAssociationMI * mi, + const CMPIContext * ctx, + CMPIBoolean terminate) +{ + UNUSED(mi); UNUSED(ctx); UNUSED(terminate); + _OSBASE_TRACE(1,("--- %s CMPI AssociationCleanup() called",_ClassName)); + _OSBASE_TRACE(1,("--- %s CMPI AssociationCleanup() exited",_ClassName)); + CMReturn(CMPI_RC_OK); +} + +/* + * The intention of associations is to show the relations between different + * classes and their instances. Therefore an association has two properties. + * Each one representing a reference to a certain instance of the specified + * class. We can say, that an association has a left and the right "end". + * + * Linux_RunningOS : + * < role > -> < class > + * Antecedent -> Linux_Fan + * Dependent -> Linux_FanSensor + * + */ + +/* + * general API information + * + * cop : + * Specifies the CMPIObjectPath to the CMPIInstance of the known end of + * the association. Its absolutelly necessary to define this anchor point, + * from where the evaluation of the association starts. + * assocPath : + * If not NULL, it contains the name of the association the caller is + * looking for. The provider should only return values, when the assocPath + * contains the name(s) of the association(s) he is responsible for ! + * role : + * The caller can specify that the source instance ( cop ) has to play + * a certain in the association. The is specified by the + * association definition (see above). That means, role has to contain + * the same value as the the source instance plays in this assoc. + * If this requirement is not true, the provider returns nothing. + */ + +/* + * specification of associators() and associatorNames() + * + * These methods return CMPIInstance ( in the case of associators() ) or + * CMPIObjectPath ( in the case of associatorNames() ) object(s) of the + * opposite end of the association. + * + * resultRole : + * The caller can specify that the target instance(s) has/have to play + * a certain in the association. The is specified by the + * association definition (see above). That means, resultRole has to + * contain the same value as the the target instance(s) plays + * in this assoc. If this requirement is not true, the provider returns + * nothing. + * resultClass : + * The caller can specify that the target instance(s) has/have to be + * instances of a certain . The is specified by the + * association definition (see above). That means, resultClass has to + * contain the same value as the of the target instance(s). + * If this requirement is not true, the provider returns nothing. + */ + +CMPIStatus Linux_FanAssociatedSensorProviderAssociators( + CMPIAssociationMI * mi, + const CMPIContext * ctx, + const CMPIResult * rslt, + const CMPIObjectPath * cop, + const char * assocClass, + const char * resultClass, + const char * role, + const char * resultRole, + const char ** propertyList) +{ + UNUSED(mi); UNUSED(propertyList); + CMPIStatus rc = {CMPI_RC_OK, NULL}; + CMPIObjectPath * op = NULL; + int refrc = 0; + + _OSBASE_TRACE(1,("--- %s CMPI Associators() called",_ClassName)); + + if( assocClass ) { + op = CMNewObjectPath( _broker, CMGetCharPtr(CMGetNameSpace(cop,&rc)), + _ClassName, &rc ); + if( op==NULL ) { + CMSetStatusWithChars( _broker, &rc, + CMPI_RC_ERR_FAILED, "Create CMPIObjectPath failed." ); + _OSBASE_TRACE(2, + ("--- %s CMPI Associators() failed : %s",CMGetCharPtr(rc.msg))); + return rc; + } + } + + if ( (assocClass == NULL) + || (CMClassPathIsA(_broker,op,assocClass,&rc) == 1)) + { + + if( _assoc_check_parameter_const( _broker,cop,_RefLeft,_RefRight, + _RefLeftClass,_RefRightClass, + resultClass,role,resultRole, + &rc ) == 0 ) { goto exit; } + + refrc = _assoc_create_refs_1toN(_broker, ctx, rslt, cop, + _ClassName,_RefLeftClass,_RefRightClass, + _RefLeft,_RefRight, + 1, 1, &rc); + if( refrc != 0 ) { + if( rc.msg != NULL ) { + _OSBASE_TRACE(1, ("--- %s CMPI Associators() failed : %s", + _ClassName,CMGetCharPtr(rc.msg))); + } + else { + _OSBASE_TRACE(1,("--- %s CMPI Associators() failed",_ClassName)); + } + return rc; + } + } + + exit: + CMReturnDone( rslt ); + _OSBASE_TRACE(1,("--- %s CMPI Associators() exited",_ClassName)); + CMReturn(CMPI_RC_OK); +} + +CMPIStatus Linux_FanAssociatedSensorProviderAssociatorNames( + CMPIAssociationMI * mi, + const CMPIContext * ctx, + const CMPIResult * rslt, + const CMPIObjectPath * cop, + const char * assocClass, + const char * resultClass, + const char * role, + const char * resultRole) +{ + UNUSED(mi); + CMPIStatus rc = {CMPI_RC_OK, NULL}; + CMPIObjectPath * op = NULL; + int refrc = 0; + + _OSBASE_TRACE(1,("--- %s CMPI AssociatorNames() called",_ClassName)); + + if( assocClass ) { + op = CMNewObjectPath( _broker, CMGetCharPtr(CMGetNameSpace(cop,&rc)), + _ClassName, &rc ); + if( op==NULL ) { + CMSetStatusWithChars( _broker, &rc, + CMPI_RC_ERR_FAILED, "Create CMPIObjectPath failed." ); + _OSBASE_TRACE(2, ("--- %s CMPI AssociatorNames() failed : %s", + CMGetCharPtr(rc.msg))); + return rc; + } + } + + if( ( assocClass==NULL ) || ( CMClassPathIsA(_broker,op,assocClass,&rc) == 1 ) ) { + + if( _assoc_check_parameter_const( _broker,cop,_RefLeft,_RefRight, + _RefLeftClass,_RefRightClass, + resultClass,role,resultRole, + &rc ) == 0 ) { goto exit; } + + refrc = _assoc_create_refs_1toN(_broker, ctx, rslt, cop, + _ClassName,_RefLeftClass,_RefRightClass, + _RefLeft,_RefRight, + 0, 1, &rc); + if( refrc != 0 ) { + if( rc.msg != NULL ) { + _OSBASE_TRACE(1, ("--- %s CMPI AssociatorNames() failed : %s", + _ClassName,CMGetCharPtr(rc.msg))); + } + else { + _OSBASE_TRACE(1,("--- %s CMPI AssociatorNames() failed",_ClassName)); + } + return rc; + } + } + + exit: + CMReturnDone( rslt ); + _OSBASE_TRACE(1,("--- %s CMPI AssociatorNames() exited",_ClassName)); + CMReturn(CMPI_RC_OK); +} + + +/* + * specification of references() and referenceNames() + * + * These methods return CMPIInstance ( in the case of references() ) or + * CMPIObjectPath ( in the case of referenceNames() ) object(s) of th + * association itself. + */ + +CMPIStatus Linux_FanAssociatedSensorProviderReferences( + CMPIAssociationMI * mi, + const CMPIContext * ctx, + const CMPIResult * rslt, + const CMPIObjectPath * cop, + const char * assocClass, + const char * role, + const char ** propertyList) +{ + UNUSED(mi); UNUSED(propertyList); + CMPIStatus rc = {CMPI_RC_OK, NULL}; + CMPIObjectPath * op = NULL; + int refrc = 0; + + _OSBASE_TRACE(1,("--- %s CMPI References() called",_ClassName)); + + if( assocClass ) { + op = CMNewObjectPath( _broker, CMGetCharPtr(CMGetNameSpace(cop,&rc)), + _ClassName, &rc ); + if( op==NULL ) { + CMSetStatusWithChars( _broker, &rc, + CMPI_RC_ERR_FAILED, "Create CMPIObjectPath failed." ); + _OSBASE_TRACE(2,("--- %s CMPI References() failed : %s",CMGetCharPtr(rc.msg))); + return rc; + } + } + + if( ( assocClass==NULL ) || ( CMClassPathIsA(_broker,op,assocClass,&rc) == 1 ) ) { + + if( _assoc_check_parameter_const( _broker,cop,_RefLeft,_RefRight, + _RefLeftClass,_RefRightClass, + NULL,role,NULL, + &rc ) == 0 ) { goto exit; } + + refrc = _assoc_create_refs_1toN(_broker, ctx, rslt, cop, + _ClassName,_RefLeftClass,_RefRightClass, + _RefLeft,_RefRight, + 1, 0, &rc); + if( refrc != 0 ) { + if( rc.msg != NULL ) { + _OSBASE_TRACE(1, ("--- %s CMPI References() failed : %s", + _ClassName,CMGetCharPtr(rc.msg))); + } + else { + _OSBASE_TRACE(1,("--- %s CMPI References() failed",_ClassName)); + } + return rc; + } + } + + exit: + CMReturnDone( rslt ); + _OSBASE_TRACE(1,("--- %s CMPI References() exited",_ClassName)); + CMReturn(CMPI_RC_OK); +} + +CMPIStatus Linux_FanAssociatedSensorProviderReferenceNames( + CMPIAssociationMI * mi, + const CMPIContext * ctx, + const CMPIResult * rslt, + const CMPIObjectPath * cop, + const char * assocClass, + const char * role) +{ + UNUSED(mi); + CMPIStatus rc = {CMPI_RC_OK, NULL}; + CMPIObjectPath * op = NULL; + int refrc = 0; + + _OSBASE_TRACE(1,("--- %s CMPI ReferenceNames() called",_ClassName)); + + if( assocClass ) { + op = CMNewObjectPath( _broker, CMGetCharPtr(CMGetNameSpace(cop,&rc)), + _ClassName, &rc ); + if( op==NULL ) { + CMSetStatusWithChars( _broker, &rc, + CMPI_RC_ERR_FAILED, "Create CMPIObjectPath failed." ); + _OSBASE_TRACE(2,("--- %s CMPI ReferenceNames() failed : %s",CMGetCharPtr(rc.msg))); + return rc; + } + } + + if( ( assocClass==NULL ) || ( CMClassPathIsA(_broker,op,assocClass,&rc) == 1 ) ) { + + if( _assoc_check_parameter_const( _broker,cop,_RefLeft,_RefRight, + _RefLeftClass,_RefRightClass, + NULL,role,NULL, + &rc ) == 0 ) { goto exit; } + + refrc = _assoc_create_refs_1toN(_broker, ctx, rslt, cop, + _ClassName,_RefLeftClass,_RefRightClass, + _RefLeft,_RefRight, + 0, 0, &rc); + if( refrc != 0 ) { + if( rc.msg != NULL ) { + _OSBASE_TRACE(1,("--- %s CMPI ReferenceNames() failed : %s",_ClassName,CMGetCharPtr(rc.msg))); + } + else { + _OSBASE_TRACE(1,("--- %s CMPI ReferenceNames() failed",_ClassName)); + } + return rc; + } + } + + exit: + CMReturnDone( rslt ); + _OSBASE_TRACE(1,("--- %s CMPI ReferenceNames() exited",_ClassName)); + CMReturn(CMPI_RC_OK); +} + +/* ---------------------------------------------------------------------------*/ +/* Provider Factory */ +/* ---------------------------------------------------------------------------*/ +CMInstanceMIStub( Linux_FanAssociatedSensorProvider, + Linux_FanAssociatedSensorProvider, + _broker, + CMNoHook); + +CMAssociationMIStub( Linux_FanAssociatedSensorProvider, + Linux_FanAssociatedSensorProvider, + _broker, + CMNoHook); + +/* ---------------------------------------------------------------------------*/ +/* end of cmpiLinux_FanAssociatedSensorProvider */ +/* ---------------------------------------------------------------------------*/ + diff --git a/src/fan/cmpiLinux_FanCommon.c b/src/fan/cmpiLinux_FanCommon.c new file mode 100644 index 0000000..68aca46 --- /dev/null +++ b/src/fan/cmpiLinux_FanCommon.c @@ -0,0 +1,252 @@ +/* This file is part of cmpiLinux_FanProvider. + * + * cmpiLinux_FanProvider 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 3 of the License, or + * (at your option) any later version. + * + * cmpiLinux_FanProvider 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 cmpiLinux_FanProvider. If not, see + * . + */ +#include +#include +#include +#include +#include +#include +#include + +#include "cmpiLinux_FanCommon.h" + +#define UNUSED(x) ((void) (x)) + +static CMPIArray * _get_OperationalStatus( + CMPIBroker const *_broker, + CMPIStatus *rc, + struct cim_fan const *sptr) +{ + CMPIArray *res = CMNewArray(_broker, 2, CMPI_uint16, rc); + unsigned short val; + if (!res) { + CMSetStatusWithChars(_broker, rc, CMPI_RC_ERR_FAILED, + "CMNewArray(_broker, 2, CMPI_uint16, rc)"); + _OSBASE_TRACE(2, ("--- _get_OperationalStatus failed: %s", + CMGetCharPtr(rc->msg))); + }else { + val = sptr->fault ? 3:1; // Error : OK + *rc = CMSetArrayElementAt(res, 0, (CMPIValue*)(&val), CMPI_uint16); + if (sptr->alarm || sptr->alarm_min || sptr->alarm_max) { + val = 4; // Stressed + *rc = CMSetArrayElementAt(res, 1, (CMPIValue*)(&val), CMPI_uint16); + } + } + return res; +} + +static CMPIArray * _get_StatusDescriptions( + CMPIBroker const *_broker, + CMPIStatus *rc, + struct cim_fan const *sptr) +{ + CMPIArray *res = CMNewArray(_broker, 2, CMPI_string, rc); + if (!res) { + CMSetStatusWithChars(_broker, rc, CMPI_RC_ERR_FAILED, + "CMNewArray(_broker, 2, CMPI_string, rc)"); + _OSBASE_TRACE(2, ("--- _get_StatusDescriptions failed: %s", + CMGetCharPtr(rc->msg))); + }else { + *rc = CMSetArrayElementAt(res, 0, sptr->fault ? + "Chip indicates, that fan is in fault state." + " Possible causes are open diodes, unconnected fan etc." + " Thus the measurement for this channel should not be trusted." + : "Fan seems to be functioning correctly.", CMPI_chars); + if (!rc->rc && (sptr->alarm || sptr->alarm_min || sptr->alarm_max)) { + char buf[100]; + snprintf(buf, 100, "These alarm flags are set by the fan's chip:" + " alarm=%s, min_alarm=%s, max_alarm=%s", + sptr->alarm ? "1":"0", + sptr->alarm_min ? "1":"0", + sptr->alarm_max ? "1":"0"); + CMSetArrayElementAt(res, 1, buf, CMPI_chars); + } + } + return res; +} + +static CMPIArray * _get_OtherIdentifyingInfo( + CMPIBroker const *_broker, + CMPIStatus *rc, + struct cim_fan const *sptr) +{ + CMPIArray *res = CMNewArray(_broker, 2, CMPI_string, rc); + if (!res) { + CMSetStatusWithChars(_broker, rc, CMPI_RC_ERR_FAILED, + "CMNewArray(_broker, 2, CMPI_string, rc)"); + _OSBASE_TRACE(2, ("--- _get_OtherIdentifyingInfo failed: %s", + CMGetCharPtr(rc->msg))); + }else { + CMSetArrayElementAt(res, 0, sptr->chip_name, CMPI_chars); + CMSetArrayElementAt(res, 1, sptr->sys_path, CMPI_chars); + } + return res; +} + +static CMPIArray * _get_IdentifyingDescriptions( + CMPIBroker const *_broker, + CMPIStatus *rc) +{ + CMPIArray *res = CMNewArray(_broker, 2, CMPI_string, rc); + if (!res) { + CMSetStatusWithChars(_broker, rc, CMPI_RC_ERR_FAILED, + "CMNewArray(_broker, 2, CMPI_string, rc)"); + _OSBASE_TRACE(2, ("--- _get_IdentifyingDescriptions failed: %s", + CMGetCharPtr(rc->msg))); + }else { + CMSetArrayElementAt(res, 0, + "ChipName - name of fan's chip.", CMPI_chars); + CMSetArrayElementAt(res, 1, + "SysPath - system path of fan's chip.", CMPI_chars); + } + return res; +} + +CMPIObjectPath * _makePath_FanCommon( + char const *class_name, + CMPIBroker const *_broker, + CMPIContext const *ctx, + CMPIObjectPath const *cop, + struct cim_fan *sptr, + CMPIStatus *rc) +{ + UNUSED(ctx); + + CMPIObjectPath * op = NULL; + + _OSBASE_TRACE(2,("--- _makePath_FanCommon() called")); + + op = CMNewObjectPath(_broker, CMGetCharPtr(CMGetNameSpace(cop, rc)), + class_name, rc); + if (CMIsNullObject(op)) { + CMSetStatusWithChars(_broker, rc, CMPI_RC_ERR_FAILED, + "Create CMPIObjectPath failed"); + _OSBASE_TRACE(2, ("--- _makePath_FanCommon() failed : %s", + CMGetCharPtr(rc->msg))); + }else { + CMAddKey(op, "CreationClassName", class_name, CMPI_chars); + CMAddKey(op, "SystemCreationClassName", CSCreationClassName, + CMPI_chars); + CMAddKey(op, "SystemName", get_system_name(), CMPI_chars); + CMAddKey(op, "DeviceID", sptr->device_id, CMPI_chars); + } + _OSBASE_TRACE(2, ("--- _makePath_FanCommon() exited")); + return op; +} + +CMPIInstance * _makeInst_FanCommon( + char const *class_name, + CMPIBroker const *_broker, + CMPIContext const *ctx, + CMPIObjectPath const *cop, + char const **properties, + struct cim_fan *sptr, + CMPIStatus *rc, + CMPIObjectPath **op) +{ + UNUSED(ctx); + + CMPIInstance *ci = NULL; + CMPIValue val; + uint16_t uint16; + char const *keys[] = { + "CreationClassName", + "SystemCreationClassName", + "SystemName", + "DeviceID", + NULL + }; + char buf[200]; + + _OSBASE_TRACE(2, ("--- _makeInst_FanCommon() called")); + + /* the sblim-cmpi-base package offers some tool methods to get common + * system data + */ + if( !get_system_name() ) { + CMSetStatusWithChars( _broker, rc, + CMPI_RC_ERR_FAILED, "no host name found" ); + _OSBASE_TRACE(2, ("--- _makeInst_FanCommon() failed : %s", + CMGetCharPtr(rc->msg))); + return NULL; + } + + if( !get_os_name() ) { + CMSetStatusWithChars( _broker, rc, + CMPI_RC_ERR_FAILED, "no OS name found" ); + _OSBASE_TRACE(2, ("--- _makeInst_FanCommon() failed : %s", + CMGetCharPtr(rc->msg))); + return NULL; + } + + *op = CMNewObjectPath(_broker, CMGetCharPtr(CMGetNameSpace(cop, rc)), + class_name, rc); + if (CMIsNullObject(*op)) { + CMSetStatusWithChars(_broker, rc, + CMPI_RC_ERR_FAILED, "Create CMPIObjectPath failed."); + _OSBASE_TRACE(2, ("--- _makeInst_FanCommon() failed : %s", + CMGetCharPtr(rc->msg))); + return NULL; + } + ci = CMNewInstance(_broker, *op, rc); + if (CMIsNullObject(ci)) { + CMSetStatusWithChars(_broker, rc, + CMPI_RC_ERR_FAILED, "Create CMPIObjectPath failed."); + _OSBASE_TRACE(2, ("--- _makeInst_FanCommon() failed : %s", + CMGetCharPtr(rc->msg))); + return NULL; + } + CMSetPropertyFilter(ci, properties, keys); + + //* keys ****************************************************************** + CMSetProperty(ci, "CreationClassName", class_name, CMPI_chars); + CMSetProperty(ci, "SystemCreationClassName", CSCreationClassName, + CMPI_chars); + CMSetProperty(ci, "SystemName", get_system_name(), CMPI_chars); + CMSetProperty(ci, "DeviceID", sptr->device_id, CMPI_chars); + + // other properties ******************************************************* + // ManagedElement + CMSetProperty(ci, "Caption", "Computer's fan", CMPI_chars); + CMSetProperty(ci, "Description", "Computer's fan.", CMPI_chars); + snprintf(buf, 200, "Fan \"%s\" on chip \"%s\"", sptr->name, + sptr->chip_name); + CMSetProperty(ci, "ElementName", buf, CMPI_chars); + + // ManagedSystemElement + CMSetProperty(ci, "Name", sptr->name, CMPI_chars); + val.array = _get_OperationalStatus(_broker, rc, sptr); + CMSetProperty(ci, "OperationalStatus", &val, CMPI_uint16A); + val.array = _get_StatusDescriptions(_broker, rc, sptr); + CMSetProperty(ci, "StatusDescriptions", &val, CMPI_stringA); + uint16 = sptr->fault ? 20:5; // Major failure : OK + CMSetProperty(ci, "HealthState", &uint16, CMPI_uint16); + uint16 = sptr->fault ? 5:16; // Stopped : In Service + CMSetProperty(ci, "OperatingStatus", &uint16, CMPI_uint16); + uint16 = sptr->fault ? 3:1; // Error : OK + CMSetProperty(ci, "PrimaryStatus", &uint16, CMPI_uint16); + + // EnabledLogicalElement + val.array = _get_OtherIdentifyingInfo(_broker, rc, sptr); + CMSetProperty(ci, "OtherIdentifyingInfo", &val, CMPI_stringA); + val.array = _get_IdentifyingDescriptions(_broker, rc); + CMSetProperty(ci, "IdentifyingDescriptions", &val, CMPI_stringA); + + _OSBASE_TRACE(2, ("--- _makeInst_FanCommon() exited")); + return ci; +} + diff --git a/src/fan/cmpiLinux_FanCommon.h b/src/fan/cmpiLinux_FanCommon.h new file mode 100644 index 0000000..8134b3b --- /dev/null +++ b/src/fan/cmpiLinux_FanCommon.h @@ -0,0 +1,41 @@ +/* This file is part of cmpiLinux_FanProvider. + * + * cmpiLinux_FanProvider 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 3 of the License, or + * (at your option) any later version. + * + * cmpiLinux_FanProvider 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 cmpiLinux_FanProvider. If not, see + * . + */ +#ifndef CMPILINUX_FANCOMMON_H_ +#define CMPILINUX_FANCOMMON_H_ + +#include +#include "Linux_Fan.h" + +CMPIObjectPath * _makePath_FanCommon( + char const *class_name, + CMPIBroker const *_broker, + CMPIContext const *ctx, + CMPIObjectPath const *cop, + struct cim_fan *sptr, + CMPIStatus *rc); + +CMPIInstance * _makeInst_FanCommon( + char const *class_name, + CMPIBroker const *_broker, + CMPIContext const *ctx, + CMPIObjectPath const *cop, + char const **properties, + struct cim_fan *sptr, + CMPIStatus *rc, + CMPIObjectPath **op); + +#endif /* ----- CMPILINUX_FANCOMMON_H_ ----- */ diff --git a/src/fan/cmpiLinux_FanProvider.c b/src/fan/cmpiLinux_FanProvider.c new file mode 100644 index 0000000..67a1a82 --- /dev/null +++ b/src/fan/cmpiLinux_FanProvider.c @@ -0,0 +1,498 @@ +/* This file is part of cmpiLinux_FanProvider. + * + * cmpiLinux_FanProvider 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 3 of the License, or + * (at your option) any later version. + * + * cmpiLinux_FanProvider 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 cmpiLinux_FanProvider. If not, see + * . + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "cmpiLinux_Fan.h" + +#define UNUSED(x) ((void) (x)) +static const CMPIBroker * _broker; + +#ifdef CMPI_VER_100 + #define Linux_FanProviderSetInstance Linux_FanProviderModifyInstance +#endif + +// utilities ****************************************************************** +static bool data_2_uint64_t(CMPIData const * data, uint64_t *res) { + if (data->state != CMPI_goodValue) return false; + switch (data->type) { + case CMPI_string: + errno = 0; + *res = strtoull(CMGetCharPtr(data->value.string), NULL, 10); + if (errno) return false; + break; + case CMPI_sint32: *res = (uint64_t) data->value.sint32; break; + case CMPI_uint32: *res = (uint64_t) data->value.uint32; break; + case CMPI_sint64: *res = (uint64_t) data->value.sint64; break; + default: return false; + } + return true; +} + +/* ---------------------------------------------------------------------------*/ +/* Instance Provider Interface */ +/* ---------------------------------------------------------------------------*/ + + +CMPIStatus Linux_FanProviderCleanup( CMPIInstanceMI * mi, + const CMPIContext * ctx, CMPIBoolean terminate) { + UNUSED(mi); UNUSED(ctx); UNUSED(terminate); + + _OSBASE_TRACE(1,("--- %s CMPI Cleanup() called",_ClassName)); + cleanup_linux_fan_module(); + _OSBASE_TRACE(1,("--- %s CMPI Cleanup() exited",_ClassName)); + CMReturn(CMPI_RC_OK); +} + +CMPIStatus Linux_FanProviderEnumInstanceNames( CMPIInstanceMI * mi, + const CMPIContext * ctx, + const CMPIResult * rslt, + const CMPIObjectPath * ref) { + UNUSED(mi); + + CMPIObjectPath * op = NULL; + CMPIStatus rc = {CMPI_RC_OK, NULL}; + struct fanlist * lptr = NULL; + struct fanlist * rm = NULL; + + _OSBASE_TRACE(1,("--- %s CMPI EnumInstanceNames() called",_ClassName)); + + if (enum_all_fans(&lptr) != 0 ) { + CMSetStatusWithChars( _broker, &rc, + CMPI_RC_ERR_FAILED, "Could not list get fan list." ); + _OSBASE_TRACE(1, ("--- %s CMPI EnumInstanceNames() failed : %s", + _ClassName,CMGetCharPtr(rc.msg))); + return rc; + } + + // iterate fan list + for (rm = lptr; lptr && rc.rc == CMPI_RC_OK ; lptr = lptr->next) { + // method call to create the CMPIInstance object + op = _makePath_Fan(_broker, ctx, ref, lptr->f, &rc); + if (op == NULL || rc.rc != CMPI_RC_OK) { + if (rc.msg != NULL) { + _OSBASE_TRACE(1, ("--- %s CMPI EnumInstanceNames() failed" + ": %s", _ClassName, CMGetCharPtr(rc.msg))); + } + CMSetStatusWithChars(_broker, &rc, CMPI_RC_ERR_FAILED, + "Transformation from internal structure to CIM" + " ObjectPath failed."); + if (rm) free_fanlist(rm); + _OSBASE_TRACE(1, ("--- %s CMPI EnumInstanceNames() failed" + ": %s", _ClassName, CMGetCharPtr(rc.msg))); + return rc; + }else { + CMReturnObjectPath(rslt, op); + } + } + if (rm) free_fanlist(rm); + + CMReturnDone(rslt); + _OSBASE_TRACE(1, ("--- %s CMPI EnumInstanceNames() exited", _ClassName)); + return rc; +} + +CMPIStatus Linux_FanProviderEnumInstances( CMPIInstanceMI * mi, + const CMPIContext * ctx, + const CMPIResult * rslt, + const CMPIObjectPath * ref, + const char ** properties) { + UNUSED(mi); + + CMPIInstance * ci = NULL; + CMPIStatus rc = {CMPI_RC_OK, NULL}; + struct fanlist * lptr = NULL; + struct fanlist * rm = NULL; + + _OSBASE_TRACE(1,("--- %s CMPI EnumInstances() called",_ClassName)); + + if (enum_all_fans(&lptr)) { + CMSetStatusWithChars(_broker, &rc, + CMPI_RC_ERR_FAILED, "Could not list fans."); + _OSBASE_TRACE(1, ("--- %s CMPI EnumInstances() failed : %s", + _ClassName,CMGetCharPtr(rc.msg))); + return rc; + } + + // iterate fan list + for (rm=lptr; lptr && rc.rc == CMPI_RC_OK; lptr = lptr->next) { + // method call to create the CMPIInstance object + ci = _makeInst_Fan(_broker, ctx, ref, properties, lptr->f, &rc); + if (ci == NULL || rc.rc != CMPI_RC_OK ) { + if (rc.msg != NULL ) { + _OSBASE_TRACE(1, ("--- %s CMPI EnumInstances() failed :" + " %s",_ClassName,CMGetCharPtr(rc.msg))); + } + CMSetStatusWithChars( _broker, &rc, + CMPI_RC_ERR_FAILED, "Transformation from internal" + " structure to CIM Instance failed."); + if (rm) free_fanlist(rm); + _OSBASE_TRACE(1, ("--- %s CMPI EnumInstances() failed :" + " %s", _ClassName,CMGetCharPtr(rc.msg))); + return rc; + }else { + CMReturnInstance(rslt, ci); + } + } + if (rm) free_fanlist(rm); + + CMReturnDone(rslt); + _OSBASE_TRACE(1, ("--- %s CMPI EnumInstances() exited", _ClassName)); + return rc; +} + +CMPIStatus Linux_FanProviderGetInstance( CMPIInstanceMI * mi, + const CMPIContext * ctx, + const CMPIResult * rslt, + const CMPIObjectPath * cop, + const char **properties) { + UNUSED(mi); + + CMPIInstance * ci = NULL; + CMPIStatus rc = {CMPI_RC_OK, NULL}; + struct cim_fan * sptr = NULL; + CMPIData data; + CMPIArray * other_identifying_info = NULL; + CMPIString * sys_path = NULL; + CMPIString * fan_name = NULL; + CMPIString * device_id = NULL; + cim_fan_error_t cmdrc; + + _OSBASE_TRACE(1,("--- %s CMPI GetInstance() called",_ClassName)); + + _check_system_key_value_pairs(_broker, cop, "SystemCreationClassName", + "SystemName", &rc); + if (rc.rc != CMPI_RC_OK) { + _OSBASE_TRACE(1, ("--- %s CMPI GetInstance() failed : %s", + _ClassName, CMGetCharPtr(rc.msg))); + return rc; + } + + data = CMGetKey(cop, "OtherIdentifyingInfo", &rc); + if ( !rc.rc + && data.type == CMPI_stringA + && (other_identifying_info = data.value.array) + && !rc.rc + && (CMGetArrayCount(other_identifying_info, &rc) > 1) + && !rc.rc) + { + data = CMGetArrayElementAt(other_identifying_info, 0, &rc); + if (!rc.rc) sys_path = data.value.string; + data = CMGetArrayElementAt(other_identifying_info, 1, &rc); + if (!rc.rc) fan_name = data.value.string; + } + device_id = CMGetKey(cop, "DeviceID", &rc).value.string; + if ((sys_path == NULL || fan_name == NULL) && (device_id == NULL)) { + CMSetStatusWithChars(_broker, &rc, + CMPI_RC_ERR_FAILED, "Could not get fan ID." ); + _OSBASE_TRACE(1, ("--- %s CMPI GetInstance() failed : %s", + _ClassName, CMGetCharPtr(rc.msg))); + return rc; + } + + if (sys_path && fan_name) { + cmdrc = get_fan_data(CMGetCharPtr(sys_path), CMGetCharPtr(fan_name), + &sptr); + } + if ((cmdrc || !sptr) && device_id) { + cmdrc = get_fan_data_by_id(CMGetCharPtr(device_id), &sptr); + } + if (cmdrc || !sptr) { + CMSetStatusWithChars(_broker, &rc, + CMPI_RC_ERR_NOT_FOUND, cim_fan_strerror(cmdrc)); + _OSBASE_TRACE(1, ("--- %s CMPI GetInstance() exited : %s", + _ClassName,CMGetCharPtr(rc.msg))); + return rc; + } + + ci = _makeInst_Fan(_broker, ctx, cop, properties, sptr, &rc); + if (sptr) free_fan(sptr); + + if (ci == NULL) { + if (rc.msg != NULL) { + _OSBASE_TRACE(1, ("--- %s CMPI GetInstance() failed : %s", + _ClassName, CMGetCharPtr(rc.msg))); + }else { + _OSBASE_TRACE(1, ("--- %s CMPI GetInstance() failed", _ClassName)); + } + return rc; + } + + CMReturnInstance(rslt, ci); + CMReturnDone(rslt); + _OSBASE_TRACE(1, ("--- %s CMPI GetInstance() exited", _ClassName)); + return rc; +} + +CMPIStatus Linux_FanProviderCreateInstance( CMPIInstanceMI * mi, + const CMPIContext * ctx, + const CMPIResult * rslt, + const CMPIObjectPath * cop, + const CMPIInstance * ci) { + UNUSED(mi); UNUSED(ctx); UNUSED(rslt); UNUSED(cop); UNUSED(ci); + + CMPIStatus rc = {CMPI_RC_OK, NULL}; + + _OSBASE_TRACE(1, ("--- %s CMPI CreateInstance() called", _ClassName)); + CMSetStatusWithChars(_broker, &rc, + CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED"); + _OSBASE_TRACE(1, ("--- %s CMPI CreateInstance() exited", _ClassName)); + return rc; +} + +CMPIStatus Linux_FanProviderSetInstance( CMPIInstanceMI * mi, + const CMPIContext * ctx, + const CMPIResult * rslt, + const CMPIObjectPath * cop, + const CMPIInstance * ci, + const char ** properties) { + UNUSED(mi); UNUSED(ctx); UNUSED(rslt); UNUSED(properties); + + CMPIStatus rc = {CMPI_RC_OK, NULL}; + CMPIData data; + char const * device_id = NULL; + struct cim_fan * sptr; + cim_fan_prop_value_t cfpv; + cim_fan_error_t cmdrc; + char const * tmp = NULL; + char buf[200]; + + _OSBASE_TRACE(1, ("--- %s CMPI SetInstance() called", _ClassName)); + + _check_system_key_value_pairs(_broker, cop, "SystemCreationClassName", + "SystemName", &rc); + if (rc.rc != CMPI_RC_OK) { + _OSBASE_TRACE(1, ("--- %s CMPI SetInstance() failed : %s", + _ClassName, CMGetCharPtr(rc.msg))); + return rc; + } + + data = CMGetKey(cop, "DeviceID", &rc); + if (data.value.string == NULL) { + CMSetStatusWithChars(_broker, &rc, + CMPI_RC_ERR_FAILED, "Could not get fan ID." ); + _OSBASE_TRACE(1, ("--- %s CMPI SetInstance() failed : %s", + _ClassName, CMGetCharPtr(rc.msg))); + } + device_id = CMGetCharPtr(data.value.string); + if (device_id) { + cmdrc = get_fan_data_by_id(device_id, &sptr); + } + if (cmdrc || !sptr) { + CMSetStatusWithChars(_broker, &rc, + CMPI_RC_ERR_NOT_FOUND, cim_fan_strerror(cmdrc)); + _OSBASE_TRACE(1, ("--- %s CMPI SetInstance() exited : %s", + _ClassName,CMGetCharPtr(rc.msg))); + return rc; + } + + data = CMGetProperty(ci, "MinSpeed", &rc); + if (!rc.rc && data.value.uint64 != (uint64_t) sptr->min_speed) { + tmp = "MinSpeed"; + cfpv.min_speed = data.value.uint64; + cmdrc = set_fan_prop_by_id(device_id, CIM_FAN_MIN_SPEED, &cfpv); + } + data = CMGetProperty(ci , "MaxSpeed", &rc); + if (!cmdrc && !rc.rc && data.value.uint64 != (uint64_t) sptr->max_speed) { + tmp = "MaxSpeed"; + cfpv.max_speed = data.value.uint64; + set_fan_prop_by_id(device_id, CIM_FAN_MAX_SPEED, &cfpv); + } + data = CMGetProperty(ci, "Divisor", &rc); + if (!cmdrc && !rc.rc && data.value.uint32 != sptr->divisor) { + tmp = "Divisor"; + cfpv.divisor = data.value.uint32; + set_fan_prop_by_id(device_id, CIM_FAN_DIV, &cfpv); + } + data = CMGetProperty(ci, "Pulses", &rc); + if (!cmdrc && !rc.rc && data.value.uint32 != sptr->pulses) { + tmp = "Pulses"; + cfpv.pulses = data.value.uint32; + set_fan_prop_by_id(device_id, CIM_FAN_PULSES, &cfpv); + } + data = CMGetProperty(ci, "Beep", &rc); + if (!cmdrc && !rc.rc && data.value.boolean != sptr->beep) { + tmp = "Beep"; + cfpv.beep = data.value.uint32; + set_fan_prop_by_id(device_id, CIM_FAN_BEEP, &cfpv); + } + + if (cmdrc) { + if (tmp && cmdrc == CIM_FAN_SEN_NO_ENTRY) { + snprintf(buf, 200, + "System interface for fan(name=\"%s\", chip=\"%s\") does not" + " provide a way to set \"%s\".", sptr->name, sptr->chip_name, + tmp); + CMSetStatusWithChars(_broker, &rc, + CMPI_RC_ERR_FAILED, buf); + }else { + CMSetStatusWithChars(_broker, &rc, + CMPI_RC_ERR_FAILED, cim_fan_strerror(cmdrc)) + } + _OSBASE_TRACE(2, ("--- %s CMPI SetInstance() exited : %s", + _ClassName, CMGetCharPtr(rc.msg))); + }else { + rc.rc = CMPI_RC_OK; + rc.msg = NULL; + } + + return rc; +} + +CMPIStatus Linux_FanProviderDeleteInstance( CMPIInstanceMI * mi, + const CMPIContext * ctx, + const CMPIResult * rslt, + const CMPIObjectPath * cop) { + UNUSED(mi); UNUSED(ctx); UNUSED(rslt); UNUSED(cop); + + CMPIStatus rc = {CMPI_RC_OK, NULL}; + + _OSBASE_TRACE(1,("--- %s CMPI DeleteInstance() called",_ClassName)); + CMSetStatusWithChars( _broker, &rc, + CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED" ); + _OSBASE_TRACE(1,("--- %s CMPI DeleteInstance() exited",_ClassName)); + return rc; +} + +CMPIStatus Linux_FanProviderExecQuery( CMPIInstanceMI * mi, + const CMPIContext * ctx, + const CMPIResult * rslt, + const CMPIObjectPath * ref, + const char * lang, + const char * query) { + UNUSED(mi); UNUSED(ctx); UNUSED(rslt); UNUSED(ref); UNUSED(lang); + UNUSED(query); + CMPIStatus rc = {CMPI_RC_OK, NULL}; + + _OSBASE_TRACE(1,("--- %s CMPI ExecQuery() called",_ClassName)); + + CMSetStatusWithChars( _broker, &rc, + CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED" ); + + _OSBASE_TRACE(1,("--- %s CMPI ExecQuery() exited",_ClassName)); + return rc; +} + + +/* ---------------------------------------------------------------------------*/ +/* Method Provider Interface */ +/* ---------------------------------------------------------------------------*/ + + +CMPIStatus Linux_FanProviderMethodCleanup( CMPIMethodMI * mi, + const CMPIContext * ctx, CMPIBoolean terminate) { + UNUSED(mi); UNUSED(ctx), UNUSED(terminate); + _OSBASE_TRACE(1,("--- %s CMPI MethodCleanup() called",_ClassName)); + _OSBASE_TRACE(1,("--- %s CMPI MethodCleanup() exited",_ClassName)); + CMReturn(CMPI_RC_OK); +} + +CMPIStatus Linux_FanProviderInvokeMethod( CMPIMethodMI * mi, + const CMPIContext * ctx, + const CMPIResult * rslt, + const CMPIObjectPath * ref, + const char * methodName, + const CMPIArgs * in, + CMPIArgs * out) { + UNUSED(mi); UNUSED(ctx); UNUSED(in); UNUSED(out); + + struct cim_fan * sptr = NULL; + CMPIString * device_id = NULL; + CMPIValue valrc; + CMPIData data; + CMPIString * class = NULL; + CMPIStatus rc = {CMPI_RC_OK, NULL}; + uint64_t desired_speed; + + _OSBASE_TRACE(1, ("--- %s CMPI InvokeMethod() called", _ClassName)); + + class = CMGetClassName(ref, &rc); + + if ( strcasecmp(CMGetCharPtr(class), _ClassName) == 0 + && strcasecmp(methodName, "setspeed") == 0 ) { + if (!(device_id = CMGetKey(ref, "DeviceID", &rc).value.string)) { + CMSetStatusWithChars(_broker, &rc, + CMPI_RC_ERR_FAILED, "Could not get fan ID." ); + _OSBASE_TRACE(1, ("--- %s CMPI InvokeMethod() failed : %s", + _ClassName, CMGetCharPtr(rc.msg))); + }else if (get_fan_data_by_id(CMGetCharPtr(device_id), &sptr) || !sptr) { + CMSetStatusWithChars(_broker, &rc, + CMPI_RC_ERR_NOT_FOUND, "No such Fan found."); + _OSBASE_TRACE(1, ("--- %s CMPI InvokeMethod() failed : %s", + _ClassName, CMGetCharPtr(rc.msg))); + }else { + char errbuf[100]; + char const * errdscr; + data = CMGetArg(in, "DesiredSpeed", &rc); + if (data.state != CMPI_goodValue) { + switch (data.state) { + case CMPI_nullValue: errdscr = "null value"; break; + case CMPI_badValue: errdscr = "bad value"; break; + case CMPI_notFound: errdscr = "not found"; break; + default: errdscr = "unknown error"; + } + snprintf(errbuf, 100, "Argument error: DesiredSpeed - %s", errdscr); + CMSetStatusWithChars(_broker, &rc, + CMPI_RC_ERR_FAILED, errbuf); + }else if (!data_2_uint64_t(&data, &desired_speed)) { + CMSetStatusWithChars(_broker, &rc, CMPI_RC_ERR_FAILED, + "Argument error: DesiredSpeed must be of type uint64"); + }else { + CMSetStatusWithChars(_broker, &rc, + CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED"); + } + } + }else { + CMSetStatusWithChars(_broker, &rc, + CMPI_RC_ERR_METHOD_NOT_AVAILABLE, methodName); + } + + _OSBASE_TRACE(1, ("--- %s CMPI InvokeMethod() exited", _ClassName)); + return rc; +} + +/* ---------------------------------------------------------------------------*/ +/* Provider Factory */ +/* ---------------------------------------------------------------------------*/ + +CMInstanceMIStub( Linux_FanProvider, + Linux_FanProvider, + _broker, + init_linux_fan_module()); + +CMMethodMIStub( Linux_FanProvider, + Linux_FanProvider, + _broker, + init_linux_fan_module()); + +/* ---------------------------------------------------------------------------*/ +/* end of cmpiLinux_FanProvider */ +/* ---------------------------------------------------------------------------*/ + diff --git a/src/fan/cmpiLinux_FanSensor.c b/src/fan/cmpiLinux_FanSensor.c new file mode 100644 index 0000000..bbe8b22 --- /dev/null +++ b/src/fan/cmpiLinux_FanSensor.c @@ -0,0 +1,141 @@ +/* This file is part of cmpiLinux_FanProvider. + * + * cmpiLinux_FanProvider 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 3 of the License, or + * (at your option) any later version. + * + * cmpiLinux_FanProvider 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 cmpiLinux_FanProvider. If not, see + * . + */ +#include +#include +#include +#include +#include +#include +#include + +#include "cmpiLinux_FanSensor.h" + +static CMPIArray * _get_PossibleStates( + CMPIBroker const *_broker, + CMPIStatus *rc, + struct cim_fan const *sptr) +{ + int index = 0; + + CMPIArray *res = CMNewArray(_broker, 5, CMPI_string, rc); + if (!res) { + CMSetStatusWithChars(_broker, rc, CMPI_RC_ERR_FAILED, + "CMNewArray(_broker, 5, CMPI_string, rc)"); + _OSBASE_TRACE(2, ("--- _get_AccessibleFeatures failed: %s", + CMGetCharPtr(rc->msg))); + }else { + if (sptr->accessible_features & CIM_FAN_AF_MIN_SPEED) { + CMSetArrayElementAt(res, index++, "Below Minimum", CMPI_chars); + CMSetArrayElementAt(res, index++, "At Minumum", CMPI_chars); + } + CMSetArrayElementAt(res, index++, "Normal", CMPI_chars); + if (sptr->accessible_features & CIM_FAN_AF_MAX_SPEED) { + CMSetArrayElementAt(res, index++, "At Maximum", CMPI_chars); + CMSetArrayElementAt(res, index++, "Above Maximum", CMPI_chars); + } + } + return res; +} + +static char const * _get_CurrentState( + struct cim_fan const *sptr) +{ + if (sptr->accessible_features & CIM_FAN_AF_MIN_SPEED) { + if (sptr->speed < sptr->min_speed) return "Below Minimum"; + if (sptr->speed == sptr->min_speed) return "At Minimum"; + } + if (sptr->accessible_features & CIM_FAN_AF_MAX_SPEED) { + if (sptr->speed > sptr->max_speed) return "Above Maximum"; + if (sptr->speed == sptr->max_speed) return "At Maximum"; + } + return "Normal"; +} + + +CMPIObjectPath * _makePath_FanSensor( + CMPIBroker const *_broker, + CMPIContext const *ctx, + CMPIObjectPath const *cop, + struct cim_fan *sptr, + CMPIStatus *rc) +{ + return _makePath_FanCommon(_ClassName, _broker, ctx, cop, sptr, rc); +} + +CMPIInstance * _makeInst_FanSensor( + CMPIBroker const *_broker, + CMPIContext const *ctx, + CMPIObjectPath const *cop, + char const **properties, + struct cim_fan *sptr, + CMPIStatus *rc) +{ + CMPIObjectPath *op; + CMPIInstance *ci; + CMPIValue val; + + char buf[200]; + + _OSBASE_TRACE(2, ("--- _makeInst_FanSensor() called")); + if (!(ci = _makeInst_FanCommon(_ClassName, _broker, ctx, cop, properties, + sptr, rc, &op))) { + return NULL; + } + + // ManagedElement + CMSetProperty(ci, "Caption", "Fan's tachometer", CMPI_chars); + CMSetProperty(ci, "Description", "Associated sensor of fan." + " Giving information about its speed.", CMPI_chars); + snprintf(buf, 200, "Tachometer of fan \"%s\" on chip \"%s\"", sptr->name, + sptr->chip_name); + CMSetProperty(ci, "ElementName", buf, CMPI_chars); + + // Sensor + val.uint16 = 5; // Tachometer + CMSetProperty(ci, "SensorType", &val, CMPI_uint16); + val.array = _get_PossibleStates(_broker, rc, sptr); + CMSetProperty(ci, "PossibleStates", &val, CMPI_stringA); + CMSetProperty(ci, "CurrentState", _get_CurrentState(sptr), CMPI_chars); + + // NumericSensor + val.uint16 = 38; // Revolutions + CMSetProperty(ci, "BaseUnits", &val, CMPI_uint16); + val.sint32 = 0; + CMSetProperty(ci, "UnitModifier", &val, CMPI_sint32); + val.uint16 = 4; // Per Minute + CMSetProperty(ci, "RateUnits", &val, CMPI_uint16); + val.sint32 = (int32_t) sptr->speed; + CMSetProperty(ci, "CurrentReading", &val, CMPI_sint32); + if (sptr->accessible_features & CIM_FAN_AF_MAX_SPEED) { + val.sint32 = (int32_t) sptr->min_speed; + CMSetProperty(ci, "NormalMax", &val, CMPI_sint32); + } + if (sptr->accessible_features & CIM_FAN_AF_MIN_SPEED) { + val.sint32 = (int32_t) sptr->min_speed; + CMSetProperty(ci, "NormalMin", &val, CMPI_sint32); + } + val.sint32 = 0; + CMSetProperty(ci, "MinReadable", &val, CMPI_sint32); + val.boolean = true; + CMSetProperty(ci, "IsLinear", &val, CMPI_boolean); + + // Linux_FanSensor + + _OSBASE_TRACE(2, ("--- _makeInst_FanSensor() exited")); + return ci; +} + diff --git a/src/fan/cmpiLinux_FanSensor.h b/src/fan/cmpiLinux_FanSensor.h new file mode 100644 index 0000000..3d224b5 --- /dev/null +++ b/src/fan/cmpiLinux_FanSensor.h @@ -0,0 +1,40 @@ +/* This file is part of cmpiLinux_FanProvider. + * + * cmpiLinux_FanProvider 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 3 of the License, or + * (at your option) any later version. + * + * cmpiLinux_FanProvider 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 cmpiLinux_FanProvider. If not, see + * . + */ +#ifndef CMPILINUX_FANSENSOR_H_ +#define CMPILINUX_FANSENSOR_H_ + +#include "cmpiLinux_FanCommon.h" + +static char const *_ClassName = "Linux_FanSensor"; + +CMPIObjectPath * _makePath_FanSensor( + CMPIBroker const *_broker, + CMPIContext const *ctx, + CMPIObjectPath const *cop, + struct cim_fan *sptr, + CMPIStatus *rc); + +CMPIInstance * _makeInst_FanSensor( + CMPIBroker const *_broker, + CMPIContext const *ctx, + CMPIObjectPath const *cop, + char const **properties, + struct cim_fan *sptr, + CMPIStatus *rc); + +#endif /* ----- CMPILINUX_FANSENSOR_H_ ----- */ + diff --git a/src/fan/cmpiLinux_FanSensorProvider.c b/src/fan/cmpiLinux_FanSensorProvider.c new file mode 100644 index 0000000..e3e1092 --- /dev/null +++ b/src/fan/cmpiLinux_FanSensorProvider.c @@ -0,0 +1,327 @@ +/* This file is part of cmpiLinux_FanProvider. + * + * cmpiLinux_FanProvider 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 3 of the License, or + * (at your option) any later version. + * + * cmpiLinux_FanProvider 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 cmpiLinux_FanProvider. If not, see + * . + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "cmpiLinux_FanSensor.h" + +#define UNUSED(x) ((void) (x)) +static const CMPIBroker * _broker; + +#ifdef CMPI_VER_100 + #define Linux_FanSensorProviderSetInstance \ + Linux_FanSensorProviderModifyInstance +#endif + +/* ---------------------------------------------------------------------------*/ +/* Instance Provider Interface */ +/* ---------------------------------------------------------------------------*/ + +CMPIStatus Linux_FanSensorProviderCleanup( + CMPIInstanceMI * mi, + const CMPIContext * ctx, + CMPIBoolean terminate) +{ + UNUSED(mi); UNUSED(ctx); UNUSED(terminate); + + _OSBASE_TRACE(1,("--- %s CMPI Cleanup() called",_ClassName)); + cleanup_linux_fan_module(); + _OSBASE_TRACE(1,("--- %s CMPI Cleanup() exited",_ClassName)); + CMReturn(CMPI_RC_OK); +} + +CMPIStatus Linux_FanSensorProviderEnumInstanceNames( + CMPIInstanceMI * mi, + const CMPIContext * ctx, + const CMPIResult * rslt, + const CMPIObjectPath * ref) +{ + UNUSED(mi); + + CMPIObjectPath * op = NULL; + CMPIStatus rc = {CMPI_RC_OK, NULL}; + struct fanlist * lptr = NULL; + struct fanlist * rm = NULL; + + _OSBASE_TRACE(1,("--- %s CMPI EnumInstanceNames() called",_ClassName)); + + if (enum_all_fans(&lptr) != 0 ) { + CMSetStatusWithChars( _broker, &rc, + CMPI_RC_ERR_FAILED, "Could not list get fan list." ); + _OSBASE_TRACE(1, ("--- %s CMPI EnumInstanceNames() failed : %s", + _ClassName,CMGetCharPtr(rc.msg))); + return rc; + } + + // iterate fan list + for (rm = lptr; lptr && rc.rc == CMPI_RC_OK ; lptr = lptr->next) { + // method call to create the CMPIInstance object + op = _makePath_FanSensor(_broker, ctx, ref, lptr->f, &rc); + if (op == NULL || rc.rc != CMPI_RC_OK) { + if (rc.msg != NULL) { + _OSBASE_TRACE(1, ("--- %s CMPI EnumInstanceNames() failed" + ": %s", _ClassName, CMGetCharPtr(rc.msg))); + } + CMSetStatusWithChars(_broker, &rc, CMPI_RC_ERR_FAILED, + "Transformation from internal structure to CIM" + " ObjectPath failed."); + if (rm) free_fanlist(rm); + _OSBASE_TRACE(1, ("--- %s CMPI EnumInstanceNames() failed" + ": %s", _ClassName, CMGetCharPtr(rc.msg))); + return rc; + }else { + CMReturnObjectPath(rslt, op); + } + } + if (rm) free_fanlist(rm); + + CMReturnDone(rslt); + _OSBASE_TRACE(1, ("--- %s CMPI EnumInstanceNames() exited", _ClassName)); + return rc; +} + +CMPIStatus Linux_FanSensorProviderEnumInstances( + CMPIInstanceMI * mi, + const CMPIContext * ctx, + const CMPIResult * rslt, + const CMPIObjectPath * ref, + const char ** properties) +{ + UNUSED(mi); + + CMPIInstance * ci = NULL; + CMPIStatus rc = {CMPI_RC_OK, NULL}; + struct fanlist * lptr = NULL; + struct fanlist * rm = NULL; + + _OSBASE_TRACE(1,("--- %s CMPI EnumInstances() called",_ClassName)); + + if (enum_all_fans(&lptr)) { + CMSetStatusWithChars(_broker, &rc, + CMPI_RC_ERR_FAILED, "Could not list fans."); + _OSBASE_TRACE(1, ("--- %s CMPI EnumInstances() failed : %s", + _ClassName,CMGetCharPtr(rc.msg))); + return rc; + } + + // iterate fan list + for (rm=lptr; lptr && rc.rc == CMPI_RC_OK; lptr = lptr->next) { + // method call to create the CMPIInstance object + ci = _makeInst_FanSensor(_broker, ctx, ref, properties, lptr->f, &rc); + if (ci == NULL || rc.rc != CMPI_RC_OK ) { + if (rc.msg != NULL ) { + _OSBASE_TRACE(1, ("--- %s CMPI EnumInstances() failed :" + " %s",_ClassName,CMGetCharPtr(rc.msg))); + } + CMSetStatusWithChars( _broker, &rc, + CMPI_RC_ERR_FAILED, "Transformation from internal" + " structure to CIM Instance failed."); + if (rm) free_fanlist(rm); + _OSBASE_TRACE(1, ("--- %s CMPI EnumInstances() failed :" + " %s", _ClassName,CMGetCharPtr(rc.msg))); + return rc; + }else { + CMReturnInstance(rslt, ci); + } + } + if (rm) free_fanlist(rm); + + CMReturnDone(rslt); + _OSBASE_TRACE(1, ("--- %s CMPI EnumInstances() exited", _ClassName)); + return rc; +} + +CMPIStatus Linux_FanSensorProviderGetInstance( + CMPIInstanceMI * mi, + const CMPIContext * ctx, + const CMPIResult * rslt, + const CMPIObjectPath * cop, + const char **properties) +{ + UNUSED(mi); + + CMPIInstance * ci = NULL; + CMPIStatus rc = {CMPI_RC_OK, NULL}; + struct cim_fan * sptr = NULL; + CMPIData data; + CMPIArray * other_identifying_info = NULL; + CMPIString * sys_path = NULL; + CMPIString * fan_name = NULL; + CMPIString * device_id = NULL; + cim_fan_error_t cmdrc; + + _OSBASE_TRACE(1,("--- %s CMPI GetInstance() called",_ClassName)); + + data = CMGetKey(cop, "OtherIdentifyingInfo", &rc); + if ( !rc.rc + && data.type == CMPI_stringA + && (other_identifying_info = data.value.array) + && !rc.rc + && (CMGetArrayCount(other_identifying_info, &rc) > 1) + && !rc.rc) + { + data = CMGetArrayElementAt(other_identifying_info, 0, &rc); + if (!rc.rc) sys_path = data.value.string; + data = CMGetArrayElementAt(other_identifying_info, 1, &rc); + if (!rc.rc) fan_name = data.value.string; + } + device_id = CMGetKey(cop, "DeviceID", &rc).value.string; + if ((sys_path == NULL || fan_name == NULL) && (device_id == NULL)) { + CMSetStatusWithChars(_broker, &rc, + CMPI_RC_ERR_FAILED, "Could not get fan ID." ); + _OSBASE_TRACE(1, ("--- %s CMPI GetInstance() failed : %s", + _ClassName, CMGetCharPtr(rc.msg))); + return rc; + } + + if (sys_path && fan_name) { + cmdrc = get_fan_data(CMGetCharPtr(sys_path), CMGetCharPtr(fan_name), + &sptr); + } + if ((cmdrc || !sptr) && device_id) { + cmdrc = get_fan_data_by_id(CMGetCharPtr(device_id), &sptr); + } + if (cmdrc || !sptr) { + CMSetStatusWithChars(_broker, &rc, + CMPI_RC_ERR_NOT_FOUND, cim_fan_strerror(cmdrc)); + _OSBASE_TRACE(1, ("--- %s CMPI GetInstance() exited : %s", + _ClassName,CMGetCharPtr(rc.msg))); + return rc; + } + + ci = _makeInst_FanSensor(_broker, ctx, cop, properties, sptr, &rc); + if (sptr) free_fan(sptr); + + if (ci == NULL) { + if (rc.msg != NULL) { + _OSBASE_TRACE(1, ("--- %s CMPI GetInstance() failed : %s", + _ClassName, CMGetCharPtr(rc.msg))); + }else { + _OSBASE_TRACE(1, ("--- %s CMPI GetInstance() failed", _ClassName)); + } + return rc; + } + + CMReturnInstance(rslt, ci); + CMReturnDone(rslt); + _OSBASE_TRACE(1, ("--- %s CMPI GetInstance() exited", _ClassName)); + return rc; +} + +CMPIStatus Linux_FanSensorProviderCreateInstance( + CMPIInstanceMI * mi, + const CMPIContext * ctx, + const CMPIResult * rslt, + const CMPIObjectPath * cop, + const CMPIInstance * ci) +{ + UNUSED(mi); UNUSED(ctx); UNUSED(rslt); UNUSED(cop); UNUSED(ci); + + CMPIStatus rc = {CMPI_RC_OK, NULL}; + + _OSBASE_TRACE(1, ("--- %s CMPI CreateInstance() called", _ClassName)); + CMSetStatusWithChars(_broker, &rc, + CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED"); + _OSBASE_TRACE(1, ("--- %s CMPI CreateInstance() exited", _ClassName)); + return rc; +} + +CMPIStatus Linux_FanSensorProviderSetInstance( + CMPIInstanceMI * mi, + const CMPIContext * ctx, + const CMPIResult * rslt, + const CMPIObjectPath * cop, + const CMPIInstance * ci, + const char ** properties) +{ + UNUSED(mi); UNUSED(ctx); UNUSED(rslt); UNUSED(cop); + UNUSED(ci); UNUSED(properties); + + CMPIStatus rc = {CMPI_RC_OK, NULL}; + + _OSBASE_TRACE(1, ("--- %s CMPI SetInstance() called", _ClassName)); + CMSetStatusWithChars(_broker, &rc, + CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED"); + _OSBASE_TRACE(1, ("--- %s CMPI SetInstance() exited", _ClassName)); + return rc; +} + +CMPIStatus Linux_FanSensorProviderDeleteInstance( + CMPIInstanceMI * mi, + const CMPIContext * ctx, + const CMPIResult * rslt, + const CMPIObjectPath * cop) +{ + UNUSED(mi); UNUSED(ctx); UNUSED(rslt); UNUSED(cop); + + CMPIStatus rc = {CMPI_RC_OK, NULL}; + + _OSBASE_TRACE(1,("--- %s CMPI DeleteInstance() called",_ClassName)); + CMSetStatusWithChars( _broker, &rc, + CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED" ); + _OSBASE_TRACE(1,("--- %s CMPI DeleteInstance() exited",_ClassName)); + return rc; +} + +CMPIStatus Linux_FanSensorProviderExecQuery( + CMPIInstanceMI * mi, + const CMPIContext * ctx, + const CMPIResult * rslt, + const CMPIObjectPath * ref, + const char * lang, + const char * query) +{ + UNUSED(mi); UNUSED(ctx); UNUSED(rslt); UNUSED(ref); UNUSED(lang); + UNUSED(query); + CMPIStatus rc = {CMPI_RC_OK, NULL}; + + _OSBASE_TRACE(1,("--- %s CMPI ExecQuery() called",_ClassName)); + + CMSetStatusWithChars( _broker, &rc, + CMPI_RC_ERR_NOT_SUPPORTED, "CIM_ERR_NOT_SUPPORTED" ); + + _OSBASE_TRACE(1,("--- %s CMPI ExecQuery() exited",_ClassName)); + return rc; +} + + +/* ---------------------------------------------------------------------------*/ +/* Provider Factory */ +/* ---------------------------------------------------------------------------*/ + +CMInstanceMIStub( Linux_FanSensorProvider, + Linux_FanSensorProvider, + _broker, + init_linux_fan_module()); + +/* ---------------------------------------------------------------------------*/ +/* end of cmpiLinux_FanSensorProvider */ +/* ---------------------------------------------------------------------------*/ + diff --git a/src/fan/mof/Linux_Fan.mof b/src/fan/mof/Linux_Fan.mof new file mode 100644 index 0000000..02766e6 --- /dev/null +++ b/src/fan/mof/Linux_Fan.mof @@ -0,0 +1,112 @@ +// +// Linux_Fan.mof +// + +#pragma locale ("en_US") +//#pragma namespace ("root/cimv2") + +// =================================================================== +// Linux_Fan +// =================================================================== + +[ Provider("cmpi:cmpiLinux_FanProvider") ] +class Linux_Fan : CIM_Fan { + + [ Key, Override("DeviceID"), + Description("Uniquely identifies fan. It is a composition of + SysPath and Name glued with slash ('/').") ] + string DeviceId; + + [ Override("Name"), + Description("Name of fan provided by system.") ] + string Name; + + [ Description("Array of fan features, that are exposed through system + interface. In other words: those that are readible/writable."), + ValueMap { "1", "2", "3", "4", "5", "6", "7", "8" }, + Values { "MinSpeed", "MaxSpeed", "Divisor", "Pulses", "Beep", + "Alarm", "MinAlarm", "MaxAlarm" } + ] + uint16 AccessibleFeatures[]; + + [ Description("Minimum speed value."), + Write, + Units("Revolutions per Minute") ] + uint64 MinSpeed; + + [ Description("Maximum speed value."), + Write, + Units("Revolutions per Minute") ] + uint64 MaxSpeed; + + [ Description("Fan divisisor. It affects Minimum and Maximum speed value + and accuracy of readings. + The drivers account for the 'fan divisor' in their calculation + of RPM. So changing the fan divisor will NOT change the + nominal RPM reading, it will only affect the minimum and maximum + readings and the accuracy of the readings. + The actual formula is RPM = (60 * 22500) / (count * divisor)"), + Write ] + uint32 Divisor; + + [ Description("Number of tachometer pulses per fan revolution. + Integer value, typically between 1 and 4. + This value is a characteristic of the fan connected to the + device's input, so it has to be set in accordance with the fan + model."), + Write ] + uint32 Pulses; + + [ Description("This indicates, whether a PC's speaker should beep + when an alarm occurs."), + Write ] + boolean Beep; + + [ Description("ALARM warning indicating, that current speed is out of + range. This information is supplied by fan's chip driver.") ] + boolean Alarm; + + [ Description("ALARM warning indicating, that current speed is below + the critical level. This information is supplied by fan's chip driver.") + ] + boolean MinAlarm; + + [ Description("ALARM warning indicating, that current speed is above + the critical level. This information is supplied by fan's chip driver.") + ] + boolean MaxAlarm; + +}; + +// =================================================================== +// Linux_FanSensor +// =================================================================== +[ Provider("cmpi:cmpiLinux_FanSensorProvider") ] +class Linux_FanSensor : CIM_NumericSensor { + + [ Key, Override("DeviceID"), + Description("Uniquely identifies fan. It is a composition of + SysPath and Name glued with slash ('/').") ] + string DeviceId; + + [ Key, Override("Name"), + Description("Name of fan provided by system.") ] + string Name; + +}; + + +// =================================================================== +// Associations +// =================================================================== +[ Association, + Provider("cmpi:cmpiLinux_FanAssociatedSensorProvider") ] +class Linux_FanAssociatedSensor : CIM_AssociatedSensor { + + [ Override("Antecedent") ] + Linux_FanSensor REF Antecedent; + + [ Override("Dependent") ] + Linux_Fan REF Dependent; + +}; diff --git a/src/fan/mof/Linux_Fan.reg b/src/fan/mof/Linux_Fan.reg new file mode 100644 index 0000000..9d21edb --- /dev/null +++ b/src/fan/mof/Linux_Fan.reg @@ -0,0 +1,18 @@ +[Linux_Fan] + provider: Linux_FanProvider + location: cmpiLinux_FanProvider + type: instance method + namespace: root/cimv2 + +[Linux_FanSensor] + provider: Linux_FanSensorProvider + location: cmpiLinux_FanSensorProvider + type: instance + namespace: root/cimv2 + +[Linux_FanAssociatedSensor] + provider: Linux_FanAssociatedSensorProvider + location: cmpiLinux_FanAssociatedSensorProvider + type: instance association + namespace: root/cimv2 + diff --git a/src/power/CMakeLists.txt b/src/power/CMakeLists.txt new file mode 100644 index 0000000..72087b7 --- /dev/null +++ b/src/power/CMakeLists.txt @@ -0,0 +1,19 @@ + +cmake_minimum_required (VERSION 2.6) + +set(CMAKE_C_FLAGS "-std=c99 -Wall -pedantic -g") + +add_subdirectory(src) + +if(CMAKE_SIZEOF_VOID_P EQUAL 4) + set(LIB_SUFFIX "") +else(CMAKE_SIZEOF_VOID_P EQUAL 4) + SET(LIB_SUFFIX 64) +endif(CMAKE_SIZEOF_VOID_P EQUAL 4) + +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/src/Linux_PowerManagement.registration DESTINATION share/sblim-cmpi-power/) +install(FILES Linux_PowerManagement.mof DESTINATION share/sblim-cmpi-power/) +install(FILES provider-register.sh DESTINATION share/sblim-cmpi-power/) + +add_custom_target(register + ${CMAKE_CURRENT_SOURCE_DIR}/provider-register.sh -m ${CMAKE_CURRENT_SOURCE_DIR}/Linux_PowerManagement.mof -r ${CMAKE_CURRENT_BINARY_DIR}/src/Linux_PowerManagement.registration) diff --git a/src/power/Linux_PowerManagement.mof b/src/power/Linux_PowerManagement.mof new file mode 100644 index 0000000..21dfa38 --- /dev/null +++ b/src/power/Linux_PowerManagement.mof @@ -0,0 +1,58 @@ +[ Provider("cmpi:cmpiLinux_PowerManagement") ] +class Linux_PowerManagementService: CIM_PowerManagementService +{ +}; + +[ Association, + Provider("cmpi:cmpiLinux_PowerManagement") ] +class Linux_AssociatedPowerManagementService: CIM_AssociatedPowerManagementService +{ + [ Override ("ServiceProvided"), + Max ( 1 ), + Description ( "The Service that is available." )] + Linux_PowerManagementService REF ServiceProvided; + + [ Override ("UserOfService"), + Description ( "The ManagedElement that can use the Service." )] + Linux_ComputerSystem REF UserOfService; +}; + +[ Provider("cmpi:cmpiLinux_PowerManagement") ] +class Linux_PowerManagementCapabilities: CIM_PowerManagementCapabilities +{ +}; + +[ Association, + Provider("cmpi:cmpiLinux_PowerManagement") ] +class Linux_HostedService: CIM_HostedService +{ + [ Override ("Antecedent"), + Min ( 1 ), + Max ( 1 ), + Description ( "The hosting System." )] + Linux_ComputerSystem REF Antecedent; + + [ Override ( "Dependent" ), + Weak, + Description ( "The Service hosted on the System." )] + Linux_PowerManagementService REF Dependent; +}; + +[ Provider("cmpi:cmpiLinux_PowerManagement") ] +class Linux_ConcreteJob: CIM_ConcreteJob +{ +}; + +[ Provider("cmpi:cmpiLinux_PowerManagement") ] +class Linux_ElementCapabilities: CIM_ElementCapabilities +{ + [ Key, + Min ( 1 ), + Description ( "The managed element." )] + Linux_PowerManagementService REF ManagedElement; + + [ Key, + Description ( "The Capabilities object associated with the element." )] + Linux_PowerManagementCapabilities REF Capabilities; +}; + diff --git a/src/power/provider-register.sh b/src/power/provider-register.sh new file mode 100755 index 0000000..b156427 --- /dev/null +++ b/src/power/provider-register.sh @@ -0,0 +1,755 @@ +#!/bin/sh +# $Id: provider-register.sh,v 1.9 2009/05/23 02:52:50 tyreld Exp $ +# ================================================================== +# (C) Copyright IBM Corp. 2002, 2009, 2009 +# +# THIS FILE IS PROVIDED UNDER THE TERMS OF THE ECLIPSE PUBLIC LICENSE +# ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE +# CONSTITUTES RECIPIENTS ACCEPTANCE OF THE AGREEMENT. +# +# You can obtain a current copy of the Eclipse Public License from +# http://www.eclipse.org/legal/epl-v10.html +# +# Author: Viktor Mihajlovski +# Contributors: +# Description: Script to install class definitions (MOFs) and +# registration data for a variety of supported CIMOMs +# ================================================================== + +pegasus_repository() +{ + for p in $PEGASUS_HOME /var/lib/Pegasus /var/lib/pegasus \ + /usr/local/var/lib/pegasus /var/local/lib/pegasus /var/opt/tog-pegasus + do + if test -d $p/repository + then + echo $p/$1 + return 0 + fi + done + return 1 +} + +pegasus_path() +{ + for p in $PEGASUS_HOME/bin /usr/bin /usr/sbin /usr/local/bin \ + /usr/local/sbin /opt/tog-pegasus/bin /opt/tog-pegasus/sbin + do + if test -x $p/$1 + then + echo $p/$1 + return 0 + fi + done + return 1 +} + +pegasus_transform() +{ + OUTFILE=$1 + shift + regfiles=$* + PROVIDERMODULES=`cat $regfiles 2> /dev/null | grep -v '^[[:space:]]*#.*' | cut -d ' ' -f 4 | sort | uniq` + if test x"$PROVIDERMODULES" = x + then + echo Failed to read registration files >&2 + return 1 + fi + PROVIDERS=`cat $regfiles 2> /dev/null | grep -v '^[[:space:]]*#.*' | cut -d ' ' -f 3-4 | sort | uniq` + +# produce ProviderModules + echo > $OUTFILE + chatter "Processing provider modules:" $PROVIDERMODULES + for pm in $PROVIDERMODULES + do + cat >> $OUTFILE <> $OUTFILE <&2 + return 1;; + esac + done + cat >> $OUTFILE < /dev/null 2>&1 + then + CIMMOF=`pegasus_path cimmof` + if test $? != 0 + then + echo "Error: cimmof not found" >&2 + return 1 + fi + state=active + else + CIMMOF=`pegasus_path cimmofl` + if test $? != 0 + then + echo "Error: cimmofl not found" >&2 + return 1 + fi + PEGASUSREPOSITORY=`pegasus_repository` + if test $? != 0 + then + echo "Error: pegasus repository not found" >&2 + return 1 + fi + CIMMOF="$CIMMOF -R $PEGASUSREPOSITORY" + state=inactive + fi + + mofpath= + mymofs= + myregs= + mofmode=1 + namespace=$1 + shift + + while test x$1 != x + do + if test $1 = ":" + then + mofmode=0 + shift + continue + fi + if test $mofmode = 1 + then + if test x$mofpath = x + then + mofpath=`dirname $1` + fi + mymofs="$mymofs $1" + else + myregs="$myregs $1" + fi + shift + done + + for _TEMPDIR in /var/tmp /tmp + do + if test -w $_TEMPDIR + then + _REGFILENAME=$_TEMPDIR/$$.mof + break + fi + done + + + trap "rm -f $_REGFILENAME" EXIT + + if pegasus_transform $_REGFILENAME $myregs + then + chatter Registering providers with $state cimserver + $CIMMOF -uc -I $mofpath -n $namespace $mymofs && + $CIMMOF -uc -n root/PG_Interop $_REGFILENAME + else + echo "Failed to build pegasus registration MOF." >&2 + return 1 + fi +} + +pegasus_uninstall() +{ + mymofs= + myregs= + mofmode=1 + namespace=$1 + shift + + while test x$1 != x + do + if test $1 = ":" + then + mofmode=0 + shift + continue + fi + if test $mofmode = 1 + then + mymofs="$mymofs $1" + else + myregs="$myregs $1" + fi + shift + done + + if ps -C cimserver > /dev/null 2>&1 + then + PROVIDERMODULES=`cat $myregs 2> /dev/null | grep -v '^[[:space:]]*#.*' | cut -d ' ' -f 4 | sort | uniq` + if test x"$PROVIDERMODULES" = x + then + echo Failed to read registration files >&2 + return 1 + fi + CIMPROVIDER=`pegasus_path cimprovider` + if test $? != 0 + then + echo "Error: cimprovider not found" >&2 + return 1 + fi + for pm in $PROVIDERMODULES + do + chatter "Remove provider module" $pm + $CIMPROVIDER -d -m $pm > /dev/null && + $CIMPROVIDER -r -m $pm > /dev/null + done + WBEMEXEC=`pegasus_path wbemexec` + if test $? != 0 + then + echo "Error: wbemexec not found" >&2 + return 1 + fi + CLASSES=`cat $myregs 2> /dev/null | grep -v '^[[:space:]]*#.*' | cut -d ' ' -f 1 | grep -v '^CIM_'` + + for _TEMPDIR in /var/tmp /tmp + do + if test -w $_TEMPDIR + then + _DELETE_NAME=$TEMPDIR/delete-class.mof + break + fi + done + + trap "rm -f $_DELETE_NAME" EXIT + + for cls in $CLASSES + do + chatter Delete CIM Class $cls + cat > $_DELETE_NAME < + + + + + +EOFA + for ns in `echo $namespace | sed 's?/? ?'g` + do + cat >> $_DELETE_NAME < +EOFX + done + cat >> $_DELETE_NAME < + + + + + + + +EOFE + $WBEMEXEC > /dev/null $_DELETE_NAME + done + else + echo "Sorry, cimserver must be running to deregister the providers." >&2 + return 1 + fi +} + +sfcb_transform() +{ + OUTFILE=$1 + shift + regfiles=$* + +#produce sfcb registraion + for rf in $regfiles + do + cat $rf | grep -v '^[[:space:]]*#.*' | while read CLASSNAME NAMESPACE PROVIDERNAME PROVIDERMODULE CAPS + do + chatter "Registering class" $CLASSNAME + cat >> $OUTFILE < /dev/null 2>&1 + then + # sfcb is running -- need to restart + for INITSCRIPT in /etc/init.d/sfcb /usr/local/etc/init.d/sfcb none + do + if test -x $INITSCRIPT + then + break; + fi + done + chatter "Shutting down sfcb." + if test $INITSCRIPT = none + then + killall sfcbd + else + $INITSCRIPT stop + fi + t=0 + while ps -C sfcbd > /dev/null 2>&1 + do + sleep 1 + t=`expr $t + 1` + if test $t -gt 10 + then + echo "Timed out waiting for sfcb shutdown..." >&2 + echo "Please stop sfcb manually and rebuild the repository using sfcbrepos." >&2 + return 1 + fi + done + chatter "Rebuilding repository." + sfcbrepos -f $endian + if test $? != 0 + then + echo "Repository rebuild failed." >&2 + return 1 + fi + + if test $INITSCRIPT = none + then + echo "No init script found - you need to start sfcbd manually." >&2 + return 1 + else + chatter "Restarting sfcb." + $INITSCRIPT start + fi + else + # Not running - rebuild repository + chatter "Rebuilding repository." + sfcbrepos -f $endian + fi +} + +sfcb_install() +{ + mymofs= + myregs= + mofmode=1 + namespace=$1 + shift + + while test x$1 != x + do + if test $1 = ":" + then + mofmode=0 + shift + baseregname=`basename $1 .registration` + continue + fi + if test $mofmode = 1 + then + mymofs="$mymofs $1" + else + myregs="$myregs $1" + fi + shift + done + + for _TEMPDIR in /var/tmp /tmp + do + if test -w $_TEMPDIR + then + _REGFILENAME=$_TEMPDIR/$baseregname.reg + break + fi + done + + trap "rm -f $_REGFILENAME" EXIT + + if sfcb_transform $_REGFILENAME $myregs + then + chatter "Staging provider registration." + sfcbstage -n $namespace -r $_REGFILENAME $mymofs + if test $? != 0 + then + echo "Failed to stage provider registration." >&2 + return 1 + fi + sfcb_rebuild + else + echo "Failed to build sfcb registration file." >&2 + return 1 + fi +} + +sfcb_uninstall() +{ + mymofs= + namespace=$1 + shift + + while test x$1 != x + do + if test $1 = ":" + then + shift + baseregname=`basename $1 .registration` + break + fi + mymofs="$mymofs `basename $1`" + shift + done + + # "Unstage" MOFs and the registration file + chatter "Unstaging provider registrations." + sfcbunstage -n $namespace -r $baseregname.reg $mymofs + + # Rebuild repository + sfcb_rebuild +} + +openwbem_transform() +{ + OUTFILE=$1 + shift + moffiles=$* + + if rm -f $OUTFILE + then + for _f in $moffiles + do + sed "s/Provider *( *\"cmpi:/Provider(\"cmpi::/g" < $_f >> $OUTFILE + done + fi +} + +openwbem_repository() +{ + for p in /var/lib/openwbem /usr/local/var/openwbem + do + if test -f $p/schema.dat + then + echo $p + return 0 + fi + done + return 1 +} + +openwbem_install() +{ + CIMMOF=`which owmofc 2> /dev/null` + if test $? != 0 + then + echo "Error: cimmof not found" >&2 + return 1 + fi + + if ps -C owcimomd > /dev/null 2>&1 + then + state=active + else + CIMMOF="$CIMMOF -d `openwbem_repository`" + if test $? != 0 + then + echo "Error: OpenWBEM repository not found" >&2 + return 1 + fi + state=inactive + fi + + for _TEMPDIR in /var/tmp /tmp + do + if test -w $_TEMPDIR + then + _REGFILENAME=$_TEMPDIR/$$.mof + break + fi + done + + trap "rm -f $_REGFILENAME" EXIT + + if openwbem_transform $_REGFILENAME $* + then + chatter Registering providers with $state owcimomd + $CIMMOF $_REGFILENAME > /dev/null + else + echo "Failed to build OpenWBEM registration MOF." >&2 + return 1 + fi +} + +openwbem_uninstall() +{ + CIMMOF=`which owmofc 2> /dev/null` + if test $? != 0 + then + echo "Error: cimmof not found" >&2 + return 1 + fi + + if ps -C owcimomd > /dev/null 2>&1 + then + state=active + else + CIMMOF="$CIMMOF -d `openwbem_repository`" + if test $? != 0 + then + echo "Error: OpenWBEM repository not found" >&2 + return 1 + fi + state=inactive + fi + + for _TEMPDIR in /var/tmp /tmp + do + if test -w $_TEMPDIR + then + _REGFILENAME=$_TEMPDIR/$$.mof + break + fi + done + + trap "rm -f $_REGFILENAME" EXIT + + if openwbem_transform $_REGFILENAME $* + then + chatter Deregistering providers with $state owcimomd + $CIMMOF -r $_REGFILENAME > /dev/null + else + echo "Failed to build OpenWBEM registration MOF." >&2 + return 1 + fi +} + +cim_server() +{ + for exname in sfcbd cimserver owcimomd + do + if pegasus_path $exname > /dev/null + then + case $exname in + sfcbd) echo sfcb; return 0;; + cimserver) echo pegasus; return 0;; + owcimomd) echo openwbem; return 0;; + esac + break; + fi + done + echo unknown + return 1 +} + +usage() +{ + echo "usage: $0 [-h] [-v] [-d] [-t ] [-n ] -r regfile ... -m mof ..." +} + +chatter() +{ + if test x$verbose != x + then + echo $* + fi +} + +gb_getopt() +{ + rmode=0 + mmode=0 + options= + moffiles= + registrations= + while [ -n "$1" ] + do + case $1 in + -r) mmode=0; + rmode=1; + shift;; + -m) mmode=1; + rmode=0; + shift;; + -*) mmode=0; + rmode=0; + options="$options $1"; + shift;; + **) if [ $mmode = 1 ] + then moffiles="$moffiles $1" + elif [ $rmode = 1 ] + then registrations="$registrations -r $1" + else options="$options $1"; + fi; + shift;; + esac + done + echo $options $registrations $moffiles +} + +prepargs=`gb_getopt $*` +args=`getopt dvhX:t:r:n: $prepargs` +rc=$? + +if [ $rc = 127 ] +then + echo "warning: getopt not found ...continue without syntax check" + args=$prepargs +elif [ $rc != 0 ] +then + usage $0 + exit 1 +fi + +namespace="root/cimv2" + +set -- $args + +while [ -n "$1" ] +do + case $1 in + -h) help=1; + shift; + break;; + -v) verbose=1; + shift;; + -X) endian="-X $2"; + shift 2;; + -d) deregister=1; + shift;; + -t) cimserver=$2; + shift 2;; + -n) namespace=$2; + shift 2;; + -r) regs="$regs $2"; + shift 2;; + --) shift; + break;; + **) break;; + esac +done + +mofs=$* + +if [ "$help" = "1" ] +then + usage + echo -e "\t-h display help message" + echo -e "\t-v verbose mode" + echo -e "\t-d deregister provider and uninstall schema" + echo -e "\t-t specify cimserver type (pegasus|sfcb|openwbem|sniacimom)" + echo -e "\t-r specify registration files" + echo -e "\t-m specify schema mof files" + echo -e "\t-X create repository for alternate platform (sfcb only at the moment)." + echo -e "\t-n target namespace definition (default: root/cimv2)." + echo + echo Use this command to install schema mofs and register providers. + echo CIM Server Type is required as well as at least one registration file and one mof. + exit 0 +fi + +if test x"$mofs" = x || test x"$regs" = x +then + usage $0 + exit 1 +fi + +if test x$cimserver = x +then + cimserver=`cim_server` + if test $? = 0 + then + chatter "Autoselected CIM server type:" $cimserver + else + echo "CIM server type could not be determined, specify with -t." >&2 + exit 1 + fi +fi + +if test x$deregister = x +then + case $cimserver in + pegasus) pegasus_install $namespace $mofs ":" $regs;; + sfcb) sfcb_install $namespace $mofs ":" $regs;; + openwbem) openwbem_install $mofs ;; + sniacimom) echo sniacimom not yet supported && exit 1 ;; + **) echo "Invalid CIM Server Type " $cimserver && exit 1;; + esac +else + case $cimserver in + pegasus) pegasus_uninstall $namespace $mofs ":" $regs;; + sfcb) sfcb_uninstall $namespace $mofs ":" $regs;; + openwbem) openwbem_uninstall $mofs ;; + sniacimom) echo sniacimom not yet supported && exit 1 ;; + **) echo "Invalid CIM Server Type " $cimserver && exit 1;; + esac +fi diff --git a/src/power/sblim_cmpi_power_test.py b/src/power/sblim_cmpi_power_test.py new file mode 100755 index 0000000..f67fd87 --- /dev/null +++ b/src/power/sblim_cmpi_power_test.py @@ -0,0 +1,52 @@ +#!/usr/bin/python + +import sys +import pywbem + +if len(sys.argv) < 4: + print """Usage: %s
[username] [password] + Connect to CIM server at address and change the power state of the machine. + +Available states: + 4 - sleep + 5 - force reboot + 7 - hibernate + 8 - force poweroff + 12 - poweroff + 15 - reboot + +Example: %s https://127.0.0.1"5989 4 root redhat""" % (sys.argv[0], sys.argv[0]) + sys.exit(1) + +url = sys.argv[1] +try: + state = int(sys.argv[2]) +except ValueError: + print >>sys.stderr, "Unknown state: %s" % sys.argv[2] + sys.exit(4) + +username = None +password = None +if len(sys.argv) > 3: + username = sys.argv[3] +if len(sys.argv) > 4: + password = sys.argv[4] + +cliconn = pywbem.WBEMConnection(url, (username, password)) + +computerSystems = cliconn.ExecQuery('WQL', 'select * from Linux_ComputerSystem') + +if len(computerSystems) == 0: + print >>sys.stderr, "No usable Linux_ComputerSystem instance found." + sys.exit(2) + +if len(computerSystems) > 1: + print >>sys.stderr, "More than one Linux_ComputerSystem instance found, don't know which to use." + sys.exit(3) + +print cliconn.InvokeMethod("RequestPowerStateChange", "Linux_PowerManagementService", + ManagedElement=computerSystems[0].path, + TimeoutPeriod=pywbem.datetime.now(), + PowerState=pywbem.Uint16(state), + Time=pywbem.datetime.now() + ) diff --git a/src/power/src/CMakeLists.txt b/src/power/src/CMakeLists.txt new file mode 100644 index 0000000..c9d0f40 --- /dev/null +++ b/src/power/src/CMakeLists.txt @@ -0,0 +1,70 @@ + +find_package(PkgConfig) + +# Read CIM classes out of MOF file +execute_process(COMMAND sed -e "/class/ !D" -e "s/class \\(.*\\):.*/\\1/g" + INPUT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../Linux_PowerManagement.mof + OUTPUT_VARIABLE CIM_CLASSES +) + +# And fill list with them +string(REGEX MATCHALL "[a-zA-Z_-]+" CIM_CLASSES ${CIM_CLASSES}) + +# Get headers and sources names from the list of CIM classes +set(CIM_HEADERS "") +set(CIM_PROVIDERS "") +foreach(CLASS ${CIM_CLASSES}) + set(CIM_HEADERS ${CIM_HEADERS} ${CLASS}.h) + set(PROVIDER ${CLASS}Provider.c) + set(CIM_PROVIDERS ${CIM_PROVIDERS} ${PROVIDER}) +endforeach(CLASS ${CIM_CLASSES}) + +# Add library +add_library(cmpiLinux_PowerManagement SHARED + power.c + trace.c + globals.c + ${CIM_PROVIDERS} + ${CIM_HEADERS} +) + +# Link konkret library +target_link_libraries(cmpiLinux_PowerManagement "-lkonkret") +include_directories(/usr/include/cmpi ${CMAKE_CURRENT_BINARY_DIR}) + +# Check if we have upower and link it +pkg_check_modules(upower upower-glib) +if (${upower_FOUND}) + add_definitions(-DHAS_UPOWER) + target_link_libraries(cmpiLinux_PowerManagement ${upower_LIBRARIES}) + include_directories(${upower_INCLUDE_DIRS}) +endif (${upower_FOUND}) + +# Check if we have systemctl +find_program(systemctl NAMES systemctl) +if (${systemctl_FOUND}) + add_definitions(-DHAS_SYSTEMCTL) +endif (${systemctl_FOUND}) + +find_program(konkret NAMES konkret) +find_program(konkretreg NAMES konkretreg) + +# Generate headers for CIM classes +add_custom_command(OUTPUT ${CIM_HEADERS} + COMMAND KONKRET_SCHEMA_DIR=/usr/share/mof/cim-current + ${konkret} + -m /usr/share/sblim-cmpi-base/Linux_Base.mof + -m ${CMAKE_CURRENT_SOURCE_DIR}/../Linux_PowerManagement.mof + ${CIM_CLASSES} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/../Linux_PowerManagement.mof + COMMENT "Generating headers from .mof file" + ) + +add_custom_command(TARGET cmpiLinux_PowerManagement + POST_BUILD + COMMAND ${konkretreg} -r libcmpiLinux_PowerManagement.so > Linux_PowerManagement.registration + COMMENT "Generating .reg file from library" + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + ) + +install(TARGETS cmpiLinux_PowerManagement DESTINATION lib${LIB_SUFFIX}/cmpi) diff --git a/src/power/src/Linux_AssociatedPowerManagementServiceProvider.c b/src/power/src/Linux_AssociatedPowerManagementServiceProvider.c new file mode 100644 index 0000000..7d61d83 --- /dev/null +++ b/src/power/src/Linux_AssociatedPowerManagementServiceProvider.c @@ -0,0 +1,294 @@ + +#include "Linux_AssociatedPowerManagementService.h" +#include "Linux_PowerManagementService.h" +#include "Linux_ComputerSystem.h" + +#include "power.h" + +#include "trace.h" +#include "globals.h" + +static const CMPIBroker* _cb; + +static void Linux_AssociatedPowerManagementServiceInitialize(CMPIInstanceMI *mi) +{ + mi->hdl = power_ref(_cb); +} + +static void Linux_AssociatedPowerManagementServiceAssociationInitialize(CMPIAssociationMI *mi) +{ + mi->hdl = power_ref(_cb); +} + +static CMPIStatus Linux_AssociatedPowerManagementServiceCleanup( + CMPIInstanceMI* mi, + const CMPIContext* cc, + CMPIBoolean term) +{ + TRACE(1, "Linux_AssociatedPowerManagementServiceCleanup\n"); + + power_unref(mi->hdl); + mi->hdl = NULL; + + CMReturn(CMPI_RC_OK); +} + +static CMPIStatus Linux_AssociatedPowerManagementServiceEnumInstanceNames( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop) +{ + TRACE(1, "Linux_AssociatedPowerManagementServiceEnumInstanceNames\n"); + + return KDefaultEnumerateInstanceNames( + _cb, mi, cc, cr, cop); +} + +static CMPIStatus Linux_AssociatedPowerManagementServiceEnumInstances( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char** properties) +{ + TRACE(1, "Linux_AssociatedPowerManagementServiceEnumInstances\n"); + + const char *ns = KNameSpace(cop); + + Linux_AssociatedPowerManagementService w; + Linux_AssociatedPowerManagementService_Init(&w, _cb, ns); + + Linux_ComputerSystemRef computerSystemRef; + Linux_ComputerSystemRef_Init(&computerSystemRef, _cb, ns); + Linux_ComputerSystemRef_Set_Name(&computerSystemRef, get_system_name()); + Linux_ComputerSystemRef_Set_CreationClassName(&computerSystemRef, "Linux_ComputerSystem"); + Linux_AssociatedPowerManagementService_Set_UserOfService(&w, &computerSystemRef); + + Linux_PowerManagementServiceRef powerManagementServiceRef; + Linux_PowerManagementServiceRef_Init(&powerManagementServiceRef, _cb, ns); + Linux_PowerManagementServiceRef_Set_Name(&powerManagementServiceRef, get_system_name()); + Linux_PowerManagementServiceRef_Set_SystemName(&powerManagementServiceRef, get_system_name()); + Linux_PowerManagementServiceRef_Set_CreationClassName(&powerManagementServiceRef, "Linux_PowerManagementService"); + Linux_PowerManagementServiceRef_Set_SystemCreationClassName(&powerManagementServiceRef, "Linux_ComputerSystem"); + Linux_AssociatedPowerManagementService_Set_ServiceProvided(&w, &powerManagementServiceRef); + + int count; + unsigned short *list = power_available_requested_power_states(mi->hdl, &count); + Linux_AssociatedPowerManagementService_Init_AvailableRequestedPowerStates(&w, count); + for (int i = 0; i < count; i++) { + Linux_AssociatedPowerManagementService_Set_AvailableRequestedPowerStates(&w, i, list[i]); + } + + Linux_AssociatedPowerManagementService_Set_TransitioningToPowerState(&w, power_transitioning_to_power_state(mi->hdl)); + Linux_AssociatedPowerManagementService_Set_PowerState(&w, 2); + Linux_AssociatedPowerManagementService_Set_RequestedPowerState(&w, power_requested_power_state(mi->hdl)); + + KReturnInstance(cr, w); + CMReturn(CMPI_RC_OK); +} + +static CMPIStatus Linux_AssociatedPowerManagementServiceGetInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char** properties) +{ + TRACE(1, "Linux_AssociatedPowerManagementServiceGetInstance\n"); + + return KDefaultGetInstance( + _cb, mi, cc, cr, cop, properties); +} + +static CMPIStatus Linux_AssociatedPowerManagementServiceCreateInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const CMPIInstance* ci) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +static CMPIStatus Linux_AssociatedPowerManagementServiceModifyInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const CMPIInstance* ci, + const char**properties) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +static CMPIStatus Linux_AssociatedPowerManagementServiceDeleteInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +static CMPIStatus Linux_AssociatedPowerManagementServiceExecQuery( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char* lang, + const char* query) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +static CMPIStatus Linux_AssociatedPowerManagementServiceAssociationCleanup( + CMPIAssociationMI* mi, + const CMPIContext* cc, + CMPIBoolean term) +{ + power_unref(mi->hdl); + mi->hdl = NULL; + + CMReturn(CMPI_RC_OK); +} + +static CMPIStatus Linux_AssociatedPowerManagementServiceAssociators( + CMPIAssociationMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char* assocClass, + const char* resultClass, + const char* role, + const char* resultRole, + const char** properties) +{ + TRACE(1, "Linux_AssociatedPowerManagementServiceAssociators\n" + "\tassocClass: %s\n" + "\tresultClass: %s\n" + "\trole: %s\n" + "\tresultRole: %s\n", assocClass, resultClass, role, resultRole); + + if (!assocClass) { + assocClass = "Linux_AssociatedPowerManagementService"; + } + + return KDefaultAssociators( + _cb, + mi, + cc, + cr, + cop, + Linux_AssociatedPowerManagementService_ClassName, + assocClass, + resultClass, + role, + resultRole, + properties); +} + +static CMPIStatus Linux_AssociatedPowerManagementServiceAssociatorNames( + CMPIAssociationMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char* assocClass, + const char* resultClass, + const char* role, + const char* resultRole) +{ + TRACE(1, "Linux_AssociatedPowerManagementServiceAssociatorNames\n" + "\tassocClass: %s\n" + "\tresultClass: %s\n" + "\trole: %s\n" + "\tresultRole: %s\n", assocClass, resultClass, role, resultRole); + + if (!assocClass) { + assocClass = "Linux_AssociatedPowerManagementService"; + } + + return KDefaultAssociatorNames( + _cb, + mi, + cc, + cr, + cop, + Linux_AssociatedPowerManagementService_ClassName, + assocClass, + resultClass, + role, + resultRole); +} + +static CMPIStatus Linux_AssociatedPowerManagementServiceReferences( + CMPIAssociationMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char* assocClass, + const char* role, + const char** properties) +{ + TRACE(1, "Linux_AssociatedPowerManagementServiceReferences\n" + "\tassocClass: %s\n" + "\trole: %s\n", assocClass, role); + + if (!assocClass) { + assocClass = "Linux_AssociatedPowerManagementService"; + } + + return KDefaultReferences( + _cb, + mi, + cc, + cr, + cop, + Linux_AssociatedPowerManagementService_ClassName, + assocClass, + role, + properties); +} + +static CMPIStatus Linux_AssociatedPowerManagementServiceReferenceNames( + CMPIAssociationMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char* assocClass, + const char* role) +{ + TRACE(1, "Linux_AssociatedPowerManagementServiceReferenceNames(assocClass: %s, role: %s)\n", assocClass, role); + + if (!assocClass) { + assocClass = "Linux_AssociatedPowerManagementService"; + } + + return KDefaultReferenceNames( + _cb, + mi, + cc, + cr, + cop, + Linux_AssociatedPowerManagementService_ClassName, + assocClass, + role); +} + +CMInstanceMIStub( + Linux_AssociatedPowerManagementService, + Linux_AssociatedPowerManagementService, + _cb, + Linux_AssociatedPowerManagementServiceInitialize(&mi)) + +CMAssociationMIStub( + Linux_AssociatedPowerManagementService, + Linux_AssociatedPowerManagementService, + _cb, + Linux_AssociatedPowerManagementServiceAssociationInitialize(&mi)) + +KONKRET_REGISTRATION( + "root/cimv2", + "Linux_AssociatedPowerManagementService", + "Linux_AssociatedPowerManagementService", + "instance association") diff --git a/src/power/src/Linux_ConcreteJobProvider.c b/src/power/src/Linux_ConcreteJobProvider.c new file mode 100644 index 0000000..361d045 --- /dev/null +++ b/src/power/src/Linux_ConcreteJobProvider.c @@ -0,0 +1,206 @@ +#include +#include +#include "Linux_ConcreteJob.h" + +static const CMPIBroker* _cb = NULL; + +#include "power.h" +#include "trace.h" + +static void Linux_ConcreteJobInitializeInstance(CMPIInstanceMI *mi) +{ + mi->hdl = power_ref(_cb); +} + +static void Linux_ConcreteJobInitializeMethod(CMPIMethodMI *mi) +{ + mi->hdl = power_ref(_cb); +} + +static CMPIStatus Linux_ConcreteJobCleanup( + CMPIInstanceMI* mi, + const CMPIContext* cc, + CMPIBoolean term) +{ + if (power_get_jobs(mi->hdl) != NULL) { + // We have jobs running -> do not unload + CMReturn(CMPI_RC_DO_NOT_UNLOAD); + } + power_unref(mi->hdl); + CMReturn(CMPI_RC_OK); +} + +static CMPIStatus Linux_ConcreteJobEnumInstanceNames( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop) +{ + return KDefaultEnumerateInstanceNames( + _cb, mi, cc, cr, cop); +} + +static CMPIStatus Linux_ConcreteJobEnumInstances( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char** properties) +{ + CMPIStatus status; + const char *ns = KNameSpace(cop); + + TRACE(1, "Linux_ConcreteJobEnumInstances"); + PowerStateChangeJob *powerStateChangeJob; + GList *plist = power_get_jobs(mi->hdl); + + while (plist) { + powerStateChangeJob = plist->data; + Linux_ConcreteJob concreteJob; + Linux_ConcreteJob_Init(&concreteJob, _cb, ns); + Linux_ConcreteJob_Set_InstanceID(&concreteJob, "Linux_PowerStateChange_ConcreteJob:123"); // TODO: unique ID + Linux_ConcreteJob_Set_JobState(&concreteJob, job_state(powerStateChangeJob)); + Linux_ConcreteJob_Set_TimeOfLastStateChange(&concreteJob, CMNewDateTimeFromBinary(_cb, ((uint64_t) job_timeOfLastChange(powerStateChangeJob)) * 1000000, 0, &status)); + //Linux_ConcreteJob_Set_ + KReturnInstance(cr, concreteJob); + plist = g_list_next(plist); + } + + CMReturn(CMPI_RC_OK); +} + +static CMPIStatus Linux_ConcreteJobGetInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char** properties) +{ + return KDefaultGetInstance( + _cb, mi, cc, cr, cop, properties); +} + +static CMPIStatus Linux_ConcreteJobCreateInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const CMPIInstance* ci) +{ + + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +static CMPIStatus Linux_ConcreteJobModifyInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const CMPIInstance* ci, + const char** properties) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +static CMPIStatus Linux_ConcreteJobDeleteInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +static CMPIStatus Linux_ConcreteJobExecQuery( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char* lang, + const char* query) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +CMInstanceMIStub( + Linux_ConcreteJob, + Linux_ConcreteJob, + _cb, + Linux_ConcreteJobInitializeInstance(&mi)) + +static CMPIStatus Linux_ConcreteJobMethodCleanup( + CMPIMethodMI* mi, + const CMPIContext* cc, + CMPIBoolean term) +{ + power_unref(mi->hdl); + CMReturn(CMPI_RC_OK); +} + +static CMPIStatus Linux_ConcreteJobInvokeMethod( + CMPIMethodMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char* meth, + const CMPIArgs* in, + CMPIArgs* out) +{ + return Linux_ConcreteJob_DispatchMethod( + _cb, mi, cc, cr, cop, meth, in, out); +} + +CMMethodMIStub( + Linux_ConcreteJob, + Linux_ConcreteJob, + _cb, + Linux_ConcreteJobInitializeMethod(&mi)) + +KUint32 Linux_ConcreteJob_KillJob( + const CMPIBroker* cb, + CMPIMethodMI* mi, + const CMPIContext* context, + const Linux_ConcreteJobRef* self, + const KBoolean* DeleteOnKill, + CMPIStatus* status) +{ + KUint32 result = KUINT32_INIT; + + KSetStatus(status, ERR_NOT_SUPPORTED); + return result; +} + +KUint32 Linux_ConcreteJob_RequestStateChange( + const CMPIBroker* cb, + CMPIMethodMI* mi, + const CMPIContext* context, + const Linux_ConcreteJobRef* self, + const KUint16* RequestedState, + const KDateTime* TimeoutPeriod, + CMPIStatus* status) +{ + KUint32 result = KUINT32_INIT; + + KSetStatus(status, ERR_NOT_SUPPORTED); + return result; +} + +KUint32 Linux_ConcreteJob_GetError( + const CMPIBroker* cb, + CMPIMethodMI* mi, + const CMPIContext* context, + const Linux_ConcreteJobRef* self, + KString* Error, + CMPIStatus* status) +{ + KUint32 result = KUINT32_INIT; + + KSetStatus(status, ERR_NOT_SUPPORTED); + return result; +} + +KONKRET_REGISTRATION( + "root/cimv2", + "Linux_ConcreteJob", + "Linux_ConcreteJob", + "instance method") diff --git a/src/power/src/Linux_ElementCapabilitiesProvider.c b/src/power/src/Linux_ElementCapabilitiesProvider.c new file mode 100644 index 0000000..62c42e6 --- /dev/null +++ b/src/power/src/Linux_ElementCapabilitiesProvider.c @@ -0,0 +1,225 @@ +#include +#include "Linux_ElementCapabilities.h" +#include +#include "globals.h" + +static const CMPIBroker* _cb; + +static void Linux_ElementCapabilitiesInitialize() +{ +} + +static CMPIStatus Linux_ElementCapabilitiesCleanup( + CMPIInstanceMI* mi, + const CMPIContext* cc, + CMPIBoolean term) +{ + CMReturn(CMPI_RC_OK); +} + +static CMPIStatus Linux_ElementCapabilitiesEnumInstanceNames( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop) +{ + return KDefaultEnumerateInstanceNames( + _cb, mi, cc, cr, cop); +} + +static CMPIStatus Linux_ElementCapabilitiesEnumInstances( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char** properties) +{ + const char *ns = KNameSpace(cop); + + Linux_ElementCapabilities w; + Linux_ElementCapabilities_Init(&w, _cb, ns); + + Linux_PowerManagementServiceRef powerManagementServiceRef; + Linux_PowerManagementServiceRef_Init(&powerManagementServiceRef, _cb, ns); + Linux_PowerManagementServiceRef_Set_Name(&powerManagementServiceRef, get_system_name()); + Linux_PowerManagementServiceRef_Set_SystemName(&powerManagementServiceRef, get_system_name()); + Linux_PowerManagementServiceRef_Set_CreationClassName(&powerManagementServiceRef, "Linux_PowerManagementService"); + Linux_PowerManagementServiceRef_Set_SystemCreationClassName(&powerManagementServiceRef, "Linux_ComputerSystem"); + + Linux_ElementCapabilities_Set_ManagedElement(&w, &powerManagementServiceRef); + + Linux_PowerManagementCapabilitiesRef powerManagementCapabilitiesRef; + Linux_PowerManagementCapabilitiesRef_Init(&powerManagementCapabilitiesRef, _cb, ns); + Linux_PowerManagementCapabilitiesRef_Set_InstanceID(&powerManagementCapabilitiesRef, "RedHat:PowerManagementCapabilities"); + + Linux_ElementCapabilities_Set_Capabilities(&w, &powerManagementCapabilitiesRef); + + KReturnInstance(cr, w); + CMReturn(CMPI_RC_OK); +} + +static CMPIStatus Linux_ElementCapabilitiesGetInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char** properties) +{ + return KDefaultGetInstance( + _cb, mi, cc, cr, cop, properties); +} + +static CMPIStatus Linux_ElementCapabilitiesCreateInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const CMPIInstance* ci) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +static CMPIStatus Linux_ElementCapabilitiesModifyInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const CMPIInstance* ci, + const char**properties) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +static CMPIStatus Linux_ElementCapabilitiesDeleteInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +static CMPIStatus Linux_ElementCapabilitiesExecQuery( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char* lang, + const char* query) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +static CMPIStatus Linux_ElementCapabilitiesAssociationCleanup( + CMPIAssociationMI* mi, + const CMPIContext* cc, + CMPIBoolean term) +{ + CMReturn(CMPI_RC_OK); +} + +static CMPIStatus Linux_ElementCapabilitiesAssociators( + CMPIAssociationMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char* assocClass, + const char* resultClass, + const char* role, + const char* resultRole, + const char** properties) +{ + return KDefaultAssociators( + _cb, + mi, + cc, + cr, + cop, + Linux_ElementCapabilities_ClassName, + assocClass, + resultClass, + role, + resultRole, + properties); +} + +static CMPIStatus Linux_ElementCapabilitiesAssociatorNames( + CMPIAssociationMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char* assocClass, + const char* resultClass, + const char* role, + const char* resultRole) +{ + return KDefaultAssociatorNames( + _cb, + mi, + cc, + cr, + cop, + Linux_ElementCapabilities_ClassName, + assocClass, + resultClass, + role, + resultRole); +} + +static CMPIStatus Linux_ElementCapabilitiesReferences( + CMPIAssociationMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char* assocClass, + const char* role, + const char** properties) +{ + return KDefaultReferences( + _cb, + mi, + cc, + cr, + cop, + Linux_ElementCapabilities_ClassName, + assocClass, + role, + properties); +} + +static CMPIStatus Linux_ElementCapabilitiesReferenceNames( + CMPIAssociationMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char* assocClass, + const char* role) +{ + return KDefaultReferenceNames( + _cb, + mi, + cc, + cr, + cop, + Linux_ElementCapabilities_ClassName, + assocClass, + role); +} + +CMInstanceMIStub( + Linux_ElementCapabilities, + Linux_ElementCapabilities, + _cb, + Linux_ElementCapabilitiesInitialize()) + +CMAssociationMIStub( + Linux_ElementCapabilities, + Linux_ElementCapabilities, + _cb, + Linux_ElementCapabilitiesInitialize()) + +KONKRET_REGISTRATION( + "root/cimv2", + "Linux_ElementCapabilities", + "Linux_ElementCapabilities", + "instance association") diff --git a/src/power/src/Linux_HostedServiceProvider.c b/src/power/src/Linux_HostedServiceProvider.c new file mode 100644 index 0000000..4f6c7ac --- /dev/null +++ b/src/power/src/Linux_HostedServiceProvider.c @@ -0,0 +1,258 @@ + +#include +#include +#include "Linux_HostedService.h" +#include "Linux_ComputerSystem.h" + +#include "globals.h" +#include "trace.h" + +static const CMPIBroker* _cb; + +static void Linux_HostedServiceInitialize() +{ +} + +static CMPIStatus Linux_HostedServiceCleanup( + CMPIInstanceMI* mi, + const CMPIContext* cc, + CMPIBoolean term) +{ + CMReturn(CMPI_RC_OK); +} + +static CMPIStatus Linux_HostedServiceEnumInstanceNames( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop) +{ + return KDefaultEnumerateInstanceNames( + _cb, mi, cc, cr, cop); +} + +static CMPIStatus Linux_HostedServiceEnumInstances( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char** properties) +{ + const char *ns = KNameSpace(cop); + + Linux_HostedService w; + Linux_HostedService_Init(&w, _cb, ns); + + /* + * TODO: Find instance dynamically based on Name property + */ + /* + CMPIObjectPath *computerSystemOP = CMNewObjectPath(_cb, ns, "CIM_ComputerSystem", &rc); + CMPIEnumeration *en = CBEnumInstanceNames(_cb, cc, computerSystemOP, &rc); + while (CMHasNext(en, &rc)) { + data = CMGetNext(en, &rc); + if (data.type != CMPI_ref) { + TRACE(1, "Not a reference\n"); + continue; + } + fprintf(stderr, "object: %s\n", CMGetCharsPtr(CMObjectPathToString(data.value.ref, &rc), &rc)); + + name = data.value.ref->ft->getKey(data.value.ref, "Name", &rc); + if (name.type != CMPI_string) { + fprintf(stderr, "Non-string name %d\n", name.type); + continue; + } + if (rc.rc != CMPI_RC_OK) return rc; + + fprintf(stderr, "Name: %s\n", CMGetCharsPtr(name.value.string, &rc)); + if (strcmp(CMGetCharsPtr(name.value.string, &rc), get_system_name()) == 0) { + TRACE(1, "Found\n"); + CIM_ComputerSystemRef_InitFromObjectPath(&computerSystemRef, _cb, data.value.ref); + break; + } + } + */ + + Linux_ComputerSystemRef computerSystemRef; + Linux_ComputerSystemRef_Init(&computerSystemRef, _cb, ns); + Linux_ComputerSystemRef_Set_Name(&computerSystemRef, get_system_name()); + Linux_ComputerSystemRef_Set_CreationClassName(&computerSystemRef, "Linux_ComputerSystem"); + Linux_HostedService_Set_Antecedent(&w, &computerSystemRef); + + Linux_PowerManagementServiceRef powerManagementServiceRef; + Linux_PowerManagementServiceRef_Init(&powerManagementServiceRef, _cb, ns); + Linux_PowerManagementServiceRef_Set_Name(&powerManagementServiceRef, get_system_name()); + Linux_PowerManagementServiceRef_Set_SystemName(&powerManagementServiceRef, get_system_name()); + Linux_PowerManagementServiceRef_Set_CreationClassName(&powerManagementServiceRef, "Linux_PowerManagementService"); + Linux_PowerManagementServiceRef_Set_SystemCreationClassName(&powerManagementServiceRef, "Linux_ComputerSystem"); + Linux_HostedService_Set_Dependent(&w, &powerManagementServiceRef); + + KReturnInstance(cr, w); + CMReturn(CMPI_RC_OK); +} + +static CMPIStatus Linux_HostedServiceGetInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char** properties) +{ + return KDefaultGetInstance( + _cb, mi, cc, cr, cop, properties); +} + +static CMPIStatus Linux_HostedServiceCreateInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const CMPIInstance* ci) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +static CMPIStatus Linux_HostedServiceModifyInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const CMPIInstance* ci, + const char**properties) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +static CMPIStatus Linux_HostedServiceDeleteInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +static CMPIStatus Linux_HostedServiceExecQuery( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char* lang, + const char* query) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +static CMPIStatus Linux_HostedServiceAssociationCleanup( + CMPIAssociationMI* mi, + const CMPIContext* cc, + CMPIBoolean term) +{ + CMReturn(CMPI_RC_OK); +} + +static CMPIStatus Linux_HostedServiceAssociators( + CMPIAssociationMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char* assocClass, + const char* resultClass, + const char* role, + const char* resultRole, + const char** properties) +{ + return KDefaultAssociators( + _cb, + mi, + cc, + cr, + cop, + Linux_HostedService_ClassName, + assocClass, + resultClass, + role, + resultRole, + properties); +} + +static CMPIStatus Linux_HostedServiceAssociatorNames( + CMPIAssociationMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char* assocClass, + const char* resultClass, + const char* role, + const char* resultRole) +{ + return KDefaultAssociatorNames( + _cb, + mi, + cc, + cr, + cop, + Linux_HostedService_ClassName, + assocClass, + resultClass, + role, + resultRole); +} + +static CMPIStatus Linux_HostedServiceReferences( + CMPIAssociationMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char* assocClass, + const char* role, + const char** properties) +{ + return KDefaultReferences( + _cb, + mi, + cc, + cr, + cop, + Linux_HostedService_ClassName, + assocClass, + role, + properties); +} + +static CMPIStatus Linux_HostedServiceReferenceNames( + CMPIAssociationMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char* assocClass, + const char* role) +{ + return KDefaultReferenceNames( + _cb, + mi, + cc, + cr, + cop, + Linux_HostedService_ClassName, + assocClass, + role); +} + +CMInstanceMIStub( + Linux_HostedService, + Linux_HostedService, + _cb, + Linux_HostedServiceInitialize()) + +CMAssociationMIStub( + Linux_HostedService, + Linux_HostedService, + _cb, + Linux_HostedServiceInitialize()) + +KONKRET_REGISTRATION( + "root/cimv2", + "Linux_HostedService", + "Linux_HostedService", + "instance association") diff --git a/src/power/src/Linux_PowerManagementCapabilitiesProvider.c b/src/power/src/Linux_PowerManagementCapabilitiesProvider.c new file mode 100644 index 0000000..bb74e34 --- /dev/null +++ b/src/power/src/Linux_PowerManagementCapabilitiesProvider.c @@ -0,0 +1,162 @@ +#include +#include "Linux_PowerManagementCapabilities.h" + +#include "power.h" + +static const CMPIBroker* _cb = NULL; + +static void Linux_PowerManagementCapabilitiesInitialize(CMPIInstanceMI *mi) +{ + mi->hdl = power_ref(_cb); +} + +static void Linux_PowerManagementCapabilitiesInitializeMethod(CMPIMethodMI *mi) +{ + mi->hdl = power_ref(_cb); +} + +static CMPIStatus Linux_PowerManagementCapabilitiesCleanup( + CMPIInstanceMI* mi, + const CMPIContext* cc, + CMPIBoolean term) +{ + power_unref(mi->hdl); + mi->hdl = NULL; + CMReturn(CMPI_RC_OK); +} + +static CMPIStatus Linux_PowerManagementCapabilitiesEnumInstanceNames( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop) +{ + return KDefaultEnumerateInstanceNames( + _cb, mi, cc, cr, cop); +} + +static CMPIStatus Linux_PowerManagementCapabilitiesEnumInstances( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char** properties) +{ + const char *ns = KNameSpace(cop); + + Linux_PowerManagementCapabilities w; + Linux_PowerManagementCapabilities_Init(&w, _cb, ns); + // TODO: make it unique + Linux_PowerManagementCapabilities_Set_InstanceID(&w, "Linux:PowerManagementCapabilities"); + Linux_PowerManagementCapabilities_Set_ElementName(&w, "Linux:PowerManagementCapabilities"); + Linux_PowerManagementCapabilities_Set_Caption(&w, "Linux:PowerManagementCapabilities"); + + int count; + unsigned short *list = power_available_requested_power_states(mi->hdl, &count); + Linux_PowerManagementCapabilities_Init_PowerStatesSupported(&w, count); + for (int i = 0; i < count; i++) { + Linux_PowerManagementCapabilities_Set_PowerStatesSupported(&w, i, list[i]); + } + + // TODO: get this list dynamically from PowerStatesSupported (see SMASH) + Linux_PowerManagementCapabilities_Init_PowerChangeCapabilities(&w, 3); + Linux_PowerManagementCapabilities_Set_PowerChangeCapabilities(&w, 0, Linux_PowerManagementCapabilities_PowerChangeCapabilities_Power_State_Settable); + Linux_PowerManagementCapabilities_Set_PowerChangeCapabilities(&w, 1, Linux_PowerManagementCapabilities_PowerChangeCapabilities_Power_Cycling_Supported); + Linux_PowerManagementCapabilities_Set_PowerChangeCapabilities(&w, 2, Linux_PowerManagementCapabilities_PowerChangeCapabilities_Graceful_Shutdown_Supported); + KReturnInstance(cr, w); + CMReturn(CMPI_RC_OK); +} + +static CMPIStatus Linux_PowerManagementCapabilitiesGetInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char** properties) +{ + return KDefaultGetInstance( + _cb, mi, cc, cr, cop, properties); +} + +static CMPIStatus Linux_PowerManagementCapabilitiesCreateInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const CMPIInstance* ci) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +static CMPIStatus Linux_PowerManagementCapabilitiesModifyInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const CMPIInstance* ci, + const char** properties) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +static CMPIStatus Linux_PowerManagementCapabilitiesDeleteInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +static CMPIStatus Linux_PowerManagementCapabilitiesExecQuery( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char* lang, + const char* query) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +CMInstanceMIStub( + Linux_PowerManagementCapabilities, + Linux_PowerManagementCapabilities, + _cb, + Linux_PowerManagementCapabilitiesInitialize(&mi)) + +static CMPIStatus Linux_PowerManagementCapabilitiesMethodCleanup( + CMPIMethodMI* mi, + const CMPIContext* cc, + CMPIBoolean term) +{ + power_unref(mi->hdl); + mi->hdl = NULL; + + CMReturn(CMPI_RC_OK); +} + +static CMPIStatus Linux_PowerManagementCapabilitiesInvokeMethod( + CMPIMethodMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char* meth, + const CMPIArgs* in, + CMPIArgs* out) +{ + return Linux_PowerManagementCapabilities_DispatchMethod( + _cb, mi, cc, cr, cop, meth, in, out); +} + +CMMethodMIStub( + Linux_PowerManagementCapabilities, + Linux_PowerManagementCapabilities, + _cb, + Linux_PowerManagementCapabilitiesInitializeMethod(&mi)) + +KONKRET_REGISTRATION( + "root/cimv2", + "Linux_PowerManagementCapabilities", + "Linux_PowerManagementCapabilities", + "instance method") diff --git a/src/power/src/Linux_PowerManagementServiceProvider.c b/src/power/src/Linux_PowerManagementServiceProvider.c new file mode 100644 index 0000000..8ce3f6c --- /dev/null +++ b/src/power/src/Linux_PowerManagementServiceProvider.c @@ -0,0 +1,278 @@ + +#include "Linux_PowerManagementService.h" + +#include "power.h" +#include "globals.h" +#include "trace.h" + +static const CMPIBroker* _cb = NULL; + +static void Linux_PowerManagementServiceInitialize(CMPIInstanceMI *mi) +{ + mi->hdl = power_ref(_cb); +} + +static void Linux_PowerManagementServiceMethodInitialize(CMPIMethodMI *mi) +{ + mi->hdl = power_ref(_cb); +} + + +static CMPIStatus Linux_PowerManagementServiceCleanup( + CMPIInstanceMI* mi, + const CMPIContext* cc, + CMPIBoolean term) +{ + TRACE(1, "Linux_PowerManagementServiceCleanup\n"); + + power_unref(mi->hdl); + mi->hdl = NULL; + + CMReturn(CMPI_RC_OK); +} + +static CMPIStatus Linux_PowerManagementServiceEnumInstanceNames( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop) +{ + TRACE(1, "Linux_PowerManagementServiceEnumInstanceNames\n"); + + return KDefaultEnumerateInstanceNames( + _cb, mi, cc, cr, cop); +} + +static CMPIStatus Linux_PowerManagementServiceEnumInstances( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char** properties) +{ + TRACE(1, "Linux_PowerManagementServiceEnumInstances\n"); + + Linux_PowerManagementService w; + + Linux_PowerManagementService_Init(&w, _cb, KNameSpace(cop)); + Linux_PowerManagementService_Set_CreationClassName(&w, "Linux_PowerManagementService"); + Linux_PowerManagementService_Set_Name(&w, get_system_name()); + Linux_PowerManagementService_Set_SystemCreationClassName(&w, "Linux_ComputerSystem"); + Linux_PowerManagementService_Set_SystemName(&w, get_system_name()); + + /* EnabledState is an integer enumeration that indicates the enabled + * and disabled states of an element. It can also indicate the transitions + * between these requested states. + */ + Linux_PowerManagementService_Set_EnabledState(&w, Linux_PowerManagementService_EnabledDefault_Enabled); + + + /* RequestedState is an integer enumeration that indicates the last + * requested or desired state for the element, irrespective of the mechanism + * through which it was requested. The actual state of the element is + * represented by EnabledState. This property is provided to compare the + * last requested and current enabled or disabled states. + */ + Linux_PowerManagementService_Set_RequestedState(&w, Linux_PowerManagementService_RequestedState_No_Change); + + Linux_PowerManagementService_Init_AvailableRequestedStates(&w, 2); + Linux_PowerManagementService_Set_AvailableRequestedStates(&w, 0, 2); // Enabled + Linux_PowerManagementService_Set_AvailableRequestedStates(&w, 1, 3); // Disabled + + + Linux_PowerManagementService_Print(&w, stderr); + + KReturnInstance(cr, w); + CMReturn(CMPI_RC_OK); +} + +static CMPIStatus Linux_PowerManagementServiceGetInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char** properties) +{ + return KDefaultGetInstance( + _cb, mi, cc, cr, cop, properties); +} + +static CMPIStatus Linux_PowerManagementServiceCreateInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const CMPIInstance* ci) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +static CMPIStatus Linux_PowerManagementServiceModifyInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const CMPIInstance* ci, + const char** properties) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +static CMPIStatus Linux_PowerManagementServiceDeleteInstance( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +static CMPIStatus Linux_PowerManagementServiceExecQuery( + CMPIInstanceMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char* lang, + const char* query) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +CMInstanceMIStub( + Linux_PowerManagementService, + Linux_PowerManagementService, + _cb, + Linux_PowerManagementServiceInitialize(&mi)) + +static CMPIStatus Linux_PowerManagementServiceMethodCleanup( + CMPIMethodMI* mi, + const CMPIContext* cc, + CMPIBoolean term) +{ + power_unref(mi->hdl); + mi->hdl = NULL; + CMReturn(CMPI_RC_OK); +} + +static CMPIStatus Linux_PowerManagementServiceInvokeMethod( + CMPIMethodMI* mi, + const CMPIContext* cc, + const CMPIResult* cr, + const CMPIObjectPath* cop, + const char* meth, + const CMPIArgs* in, + CMPIArgs* out) +{ + return Linux_PowerManagementService_DispatchMethod( + _cb, mi, cc, cr, cop, meth, in, out); +} + +CMMethodMIStub( + Linux_PowerManagementService, + Linux_PowerManagementService, + _cb, + Linux_PowerManagementServiceMethodInitialize(&mi)) + +KUint32 Linux_PowerManagementService_RequestStateChange( + const CMPIBroker* cb, + CMPIMethodMI* mi, + const CMPIContext* context, + const Linux_PowerManagementServiceRef* self, + const KUint16* RequestedState, + KRef* Job, + const KDateTime* TimeoutPeriod, + CMPIStatus* status) +{ + KUint32 result = KUINT32_INIT; + + KSetStatus(status, ERR_NOT_SUPPORTED); + return result; + +} + +KUint32 Linux_PowerManagementService_StartService( + const CMPIBroker* cb, + CMPIMethodMI* mi, + const CMPIContext* context, + const Linux_PowerManagementServiceRef* self, + CMPIStatus* status) +{ + KUint32 result = KUINT32_INIT; + + KSetStatus(status, ERR_NOT_SUPPORTED); + return result; +} + +KUint32 Linux_PowerManagementService_StopService( + const CMPIBroker* cb, + CMPIMethodMI* mi, + const CMPIContext* context, + const Linux_PowerManagementServiceRef* self, + CMPIStatus* status) +{ + KUint32 result = KUINT32_INIT; + + KSetStatus(status, ERR_NOT_SUPPORTED); + return result; +} + +KUint32 Linux_PowerManagementService_SetPowerState( + const CMPIBroker* cb, + CMPIMethodMI* mi, + const CMPIContext* context, + const Linux_PowerManagementServiceRef* self, + const KUint16* PowerState, + const KRef* ManagedElement, + const KDateTime* Time, + CMPIStatus* status) +{ + KUint32 result = KUINT32_INIT; + + KSetStatus(status, ERR_NOT_SUPPORTED); + return result; +} + +KUint32 Linux_PowerManagementService_RequestPowerStateChange( + const CMPIBroker* cb, + CMPIMethodMI* mi, + const CMPIContext* context, + const Linux_PowerManagementServiceRef* self, + const KUint16* PowerState, + const KRef* ManagedElement, + const KDateTime* Time, + KRef* Job, + const KDateTime* TimeoutPeriod, + CMPIStatus* status) +{ + TRACE(1, "Linux_PowerManagementService_RequestPowerStateChange\n"); + KUint32 result = KUINT32_INIT; + + if (Time->exists && Time->null && TimeoutPeriod->exists && TimeoutPeriod->null) { + /* SMASH says: The TimeoutPeriod and Time parameters shall not be + * supported for the same invocation of the RequestPowerStateChange( ) + * method. When the TimeoutPeriod and Time parameters are specified + * for the same method invocation, the method shall return a value of 2. + */ + KUint32_Set(&result, 2); + return result; + } + + // Time argument is not handled because we don't support powering on systems + + if (!PowerState->exists || PowerState->null) { + TRACE(1, "wrong PowerState\n"); + KSetStatus(status, ERR_INVALID_PARAMETER); + return result; + } + power_request_power_state(mi->hdl, PowerState->value); + + KSetStatus(status, OK); + KUint32_Set(&result, 4096); + return result; +} + +KONKRET_REGISTRATION( + "root/cimv2", + "Linux_PowerManagementService", + "Linux_PowerManagementService", + "instance method") diff --git a/src/power/src/globals.c b/src/power/src/globals.c new file mode 100644 index 0000000..2ba5075 --- /dev/null +++ b/src/power/src/globals.c @@ -0,0 +1,24 @@ + +#include "globals.h" + +#define _XOPEN_SOURCE 500 + +#include +#include +#include "trace.h" + +static char *_hostname = NULL; + +const char *get_system_name() +{ + if (_hostname == NULL) { + _hostname = malloc(256 * sizeof(char)); + if (gethostname(_hostname, 255) == -1) { + TRACE(4, "get_hostname(): gethostname returned -1"); + free(_hostname); + _hostname = NULL; + } + } + // TODO: try to get full qualified hostname + return _hostname; +} diff --git a/src/power/src/globals.h b/src/power/src/globals.h new file mode 100644 index 0000000..adec07e --- /dev/null +++ b/src/power/src/globals.h @@ -0,0 +1,7 @@ + +#ifndef GLOBALS_H +#define GLOBALS_H + +const char *get_system_name(); + +#endif \ No newline at end of file diff --git a/src/power/src/power.c b/src/power/src/power.c new file mode 100644 index 0000000..751ab22 --- /dev/null +++ b/src/power/src/power.c @@ -0,0 +1,517 @@ +#include "power.h" + +#include +#include + +#include + +#include "Linux_AssociatedPowerManagementService.h" +#include "Linux_ConcreteJob.h" + +#ifdef HAS_UPOWER +#include +#endif + +struct _Power { + unsigned int instances; + unsigned short requestedPowerState; + unsigned short transitioningToPowerState; + const CMPIBroker *broker; + CMPI_MUTEX_TYPE mutex; + GList *jobs; // list of PowerStateChangeJob +#ifdef HAS_UPOWER + UpClient *up; +#endif +}; + +#define MUTEX_LOCK(power) power->broker->xft->lockMutex(power->mutex) +#define MUTEX_UNLOCK(power) power->broker->xft->unlockMutex(power->mutex) + +struct _PowerStateChangeJob { + const CMPIBroker *broker; + Power *power; + unsigned short requestedPowerState; + unsigned short jobState; + int timeOfLastChange; + int timeBeforeRemoval; + int cancelled; + int superseded; // There is another job that overrides this job + char *error; + CMPI_THREAD_TYPE thread; + CMPI_MUTEX_TYPE mutex; +}; + +Power *_power = NULL; + + +// This is just for debugging purposes, remove later +#include +#include +void print_backtrace(int signal) +{ + fprintf(stderr, "BackTrace\n"); + void *buffer[32]; + int count = backtrace(buffer, 32); + fprintf(stderr, "Size: %d\n", count); + backtrace_symbols_fd(buffer, count, stderr->_fileno); + fprintf(stderr, "Segfault detected, process id: %d. Entering infinite loop.\n", getpid()); + volatile int end = 0; + while (!end) { + sleep(1); + } +} + +Power *power_new(const CMPIBroker *_cb) +{ + signal(SIGSEGV, print_backtrace); + fprintf(stderr, "BackTrace handler registered\n"); + + Power *power = malloc(sizeof(Power)); + power->broker = _cb; + power->instances = 0; + power->requestedPowerState = Linux_AssociatedPowerManagementService_RequestedPowerState_Unknown; + power->transitioningToPowerState = Linux_AssociatedPowerManagementService_TransitioningToPowerState_No_Change; + power->mutex = _cb->xft->newMutex(0); + power->jobs = NULL; +#ifdef HAS_UPOWER + g_type_init(); + power->up = up_client_new(); +#endif + return power; +} + +void power_destroy(Power *power) +{ +#ifdef HAS_UPOWER + free(power->up); +#endif +} + +Power *power_ref(const CMPIBroker *_cb) +{ + if (_power == NULL) { + _power = power_new(_cb); + } + MUTEX_LOCK(_power); + _power->instances++; + MUTEX_UNLOCK(_power); + return _power; +} + +void power_unref(Power *power) +{ + MUTEX_LOCK(power); + power->instances--; + MUTEX_UNLOCK(power); + if (power->instances == 0) { + power_destroy(power); + power = NULL; + _power = NULL; + } +} + +unsigned short power_requested_power_state(Power *power) +{ + return power->requestedPowerState; +} + +unsigned short power_transitioning_to_power_state(Power *power) +{ + return power->transitioningToPowerState; +} + +void *state_change_thread(void *data) +{ + PowerStateChangeJob *powerStateChangeJob = data; + MUTEX_LOCK(powerStateChangeJob); + powerStateChangeJob->jobState = Linux_ConcreteJob_JobState_Running; + powerStateChangeJob->timeOfLastChange = time(NULL); + MUTEX_UNLOCK(powerStateChangeJob); + + + // Check if the job was cancelled + if (powerStateChangeJob->cancelled) { + MUTEX_LOCK(powerStateChangeJob); + powerStateChangeJob->jobState = Linux_ConcreteJob_JobState_Terminated; + powerStateChangeJob->timeOfLastChange = time(NULL); + MUTEX_UNLOCK(powerStateChangeJob); + + if (!powerStateChangeJob->superseded) { + // There is no job that replaced this job + MUTEX_LOCK(powerStateChangeJob->power); + powerStateChangeJob->power->transitioningToPowerState = Linux_AssociatedPowerManagementService_TransitioningToPowerState_No_Change; + MUTEX_UNLOCK(powerStateChangeJob->power); + } + + fprintf(stderr, "state_change_thread cancelled\n"); + return NULL; + } + + // Execute the job +#ifdef HAS_UPOWER + GError *error = NULL; +#endif + + int succeeded = 0; + switch (powerStateChangeJob->requestedPowerState) { + case Linux_AssociatedPowerManagementService_PowerState_Sleep__Deep: + // Sleep +#ifdef HAS_UPOWER + succeeded = up_client_suspend_sync(powerStateChangeJob->power->up, NULL, &error); +#else + succeeded = system("pm-suspend") == 0; +#endif + break; + case Linux_AssociatedPowerManagementService_PowerState_Power_Cycle_Off___Soft: + // Reboot (without shutting down programs) +#ifdef HAS_SYSTEMCTL + succeeded = system("systemctl --force reboot &") == 0; +#else + succeeded = system("reboot --force &") == 0; +#endif + break; + case Linux_AssociatedPowerManagementService_PowerState_Hibernate_Off___Soft: + // Hibernate +#ifdef HAS_UPOWER + succeeded = up_client_hibernate_sync(powerStateChangeJob->power->up, NULL, &error); +#else + succeeded = system("pm-hibernate") == 0; +#endif + break; + case Linux_AssociatedPowerManagementService_PowerState_Off___Soft: + // Poweroff (without shutting down programs) +#ifdef HAS_SYSTEMCTL + succeeded = system("systemctl --force poweroff &") == 0; +#else + succeeded = system("shutdown --halt now &") == 0; +#endif + break; + case Linux_AssociatedPowerManagementService_PowerState_Off___Soft_Graceful: + // Poweroff (shut down programs first) +#ifdef HAS_SYSTEMCTL + succeeded = system("systemctl poweroff &") == 0; +#else + succeeded = system("shutdown --poweroff now &") == 0; +#endif + break; + case Linux_AssociatedPowerManagementService_PowerState_Power_Cycle_Off___Soft_Graceful: + // Reboot (shut down programs first) +#ifdef HAS_SYSTEMCTL + succeeded = system("systemctl reboot &") == 0; +#else + succeeded = system("shutdown --reboot now &") == 0; +#endif + break; + } + + MUTEX_LOCK(powerStateChangeJob->power); + powerStateChangeJob->power->transitioningToPowerState = Linux_AssociatedPowerManagementService_TransitioningToPowerState_No_Change; + MUTEX_UNLOCK(powerStateChangeJob->power); + + MUTEX_LOCK(powerStateChangeJob); + if (succeeded) { + powerStateChangeJob->jobState = Linux_ConcreteJob_JobState_Completed; + } else { + powerStateChangeJob->jobState = Linux_ConcreteJob_JobState_Exception; +#ifdef HAS_UPOWER + if (error != NULL) { + powerStateChangeJob->error = error->message; + } +#endif + } + powerStateChangeJob->timeOfLastChange = time(NULL); + MUTEX_UNLOCK(powerStateChangeJob); + + fprintf(stderr, "state_change_thread finished\n"); + return NULL; +} + +int power_request_power_state(Power *power, unsigned short state) +{ + int rc = CMPI_RC_OK; + + int count, found = 0; + unsigned short *states = power_available_requested_power_states(power, &count); + for (int i = 0; i < count; ++i) { + if (states[i] == state) { + found = 1; + break; + } + } + free(states); + if (!found) { + fprintf(stderr, "Invalid state: %d\n", state); + return CMPI_RC_ERR_INVALID_PARAMETER; + } + + PowerStateChangeJob *powerStateChangeJob = malloc(sizeof(PowerStateChangeJob)); + powerStateChangeJob->broker = power->broker; + powerStateChangeJob->power = power; + powerStateChangeJob->mutex = power->broker->xft->newMutex(0); + powerStateChangeJob->requestedPowerState = state; + powerStateChangeJob->jobState = Linux_ConcreteJob_JobState_New; + powerStateChangeJob->cancelled = 0; + powerStateChangeJob->superseded = 0; + powerStateChangeJob->timeOfLastChange = time(NULL); + powerStateChangeJob->timeBeforeRemoval = 300; + powerStateChangeJob->error = NULL; + + MUTEX_LOCK(power); + power->requestedPowerState = state; + power->transitioningToPowerState = state; + + PowerStateChangeJob *job; + GList *plist = power->jobs; + while (plist) { + job = plist->data; + MUTEX_LOCK(job); + if (job->jobState != Linux_ConcreteJob_JobState_Suspended && + job->jobState != Linux_ConcreteJob_JobState_Killed && + job->jobState != Linux_ConcreteJob_JobState_Terminated) { + + job->cancelled = 1; + job->superseded = 1; + job->jobState = Linux_ConcreteJob_JobState_Shutting_Down; + job->timeOfLastChange = time(NULL); + } + MUTEX_UNLOCK(job); + plist = g_list_next(plist); + } + powerStateChangeJob->thread = power->broker->xft->newThread(state_change_thread, powerStateChangeJob, 1); + power->jobs = g_list_append(power->jobs, powerStateChangeJob); + MUTEX_UNLOCK(power); + fprintf(stderr, "State change thread started\n"); + + return rc; +} + +unsigned short *power_available_requested_power_states(Power *power, int *count) +{ + unsigned short *list = malloc(17 * sizeof(unsigned short)); + int i = 0; + + /* 1 Other + * Linux_AssociatedPowerManagementService_PowerState_Other + */ + + /* 2 On + * corresponding to ACPI state G0 or S0 or D0. + * + * Bring system to full On from any state (Sleep, Hibernate, Off) + * + * Linux_AssociatedPowerManagementService_PowerState_On + */ + // not supported + + /* 3 Sleep - Light + * corresponding to ACPI state G1, S1/S2, or D1. + * + * Standby + * + * Linux_AssociatedPowerManagementService_PowerState_Sleep___Light + */ + // not supported + + /* 4 Sleep - Deep + * corresponding to ACPI state G1, S3, or D2. + * + * Suspend + * + * Linux_AssociatedPowerManagementService_PowerState_Sleep__Deep + */ + // Sleep +#ifdef HAS_UPOWER + if (up_client_get_can_suspend(power->up)) { + list[i++] = Linux_AssociatedPowerManagementService_PowerState_Sleep__Deep; + } +#else + if (system("pm-is-supported --suspend") == 0) { + list[i++] = Linux_AssociatedPowerManagementService_PowerState_Sleep__Deep; + } +#endif + + /* 5 Power Cycle (Off - Soft) + * corresponding to ACPI state G2, S5, or D3, but where the managed + * element is set to return to power state "On" at a pre-determined time. + * + * Reset system without removing power + * + * Linux_AssociatedPowerManagementService_PowerState_Power_Cycle_Off___Soft + */ + // Reboot (without shutting down programs) + list[i++] = Linux_AssociatedPowerManagementService_PowerState_Power_Cycle_Off___Soft; + + /* 6 Off - Hard + * corresponding to ACPI state G3, S5, or D3. + * + * Power Off performed through mechanical means like unplugging + * power cable or UPS On + * + * Linux_AssociatedPowerManagementService_PowerState_Off___Hard + */ + + /* 7 Hibernate (Off - Soft) + * corresponding to ACPI state S4, where the state of the managed element + * is preserved and will be recovered upon powering on. + * + * System context and OS image written to non-volatile storage; + * system and devices powered off + * + * Linux_AssociatedPowerManagementService_PowerState_Hibernate_Off___Soft + */ + // Hibernate +#ifdef HAS_UPOWER + if (up_client_get_can_hibernate(power->up)) { + list[i++] = Linux_AssociatedPowerManagementService_PowerState_Hibernate_Off___Soft; + } +#else + if (system("pm-is-supported --hibernate") == 0) { + list[i++] = Linux_AssociatedPowerManagementService_PowerState_Hibernate_Off___Soft; + } +#endif + + /* 8 Off - Soft + * corresponding to ACPI state G2, S5, or D3. + * + * System power off but auxiliary or flea power may be available + * + * Linux_AssociatedPowerManagementService_PowerState_Off___Soft + */ + // Poweroff (without shutting down programs) + list[i++] = Linux_AssociatedPowerManagementService_PowerState_Off___Soft; + + /* 9 Power Cycle (Off-Hard) + * corresponds to the managed element reaching the ACPI state G3 + * followed by ACPI state S0. + * + * Equivalent to Off–Hard followed by On + * + * Linux_AssociatedPowerManagementService_PowerState_Power_Cycle_Off_Hard + */ + // not implemented + + /* 10 Master Bus Reset + * corresponds to the system reaching ACPI state S5 followed by ACPI + * state S0. This is used to represent system master bus reset. + * + * Hardware reset + * + * Linux_AssociatedPowerManagementService_PowerState_Master_Bus_Reset + */ + // not implemented + + /* 11 Diagnostic Interrupt (NMI) + * corresponding to the system reaching ACPI state S5 followed by ACPI + * state S0. This is used to represent system non-maskable interrupt. + * + * Hardware reset + * + * Linux_AssociatedPowerManagementService_PowerState_Diagnostic_Interrupt_NMI + */ + // not implemented + + /* 12 Off - Soft Graceful + * equivalent to Off Soft but preceded by a request to the managed element + * to perform an orderly shutdown. + * + * System power off but auxiliary or flea power may be available but preceded + * by a request to the managed element to perform an orderly shutdown. + * + * Linux_AssociatedPowerManagementService_PowerState_Off___Soft_Graceful + */ + // Poweroff (shut down programs first) + list[i++] = Linux_AssociatedPowerManagementService_PowerState_Off___Soft_Graceful; + + /* 13 Off - Hard Graceful + * equivalent to Off Hard but preceded by a request to the managed element + * to perform an orderly shutdown. + * + * Power Off performed through mechanical means like unplugging power cable + * or UPS On but preceded by a request to the managed element to perform + * an orderly shutdown. + * + * Linux_AssociatedPowerManagementService_PowerState_Off___Hard_Graceful + */ + // not implemented + + /* 14 Master Bus Rest Graceful + * equivalent to Master Bus Reset but preceded by a request to the managed + * element to perform an orderly shutdown. + * + * Hardware reset but preceded by a request to the managed element + * to perform an orderly shutdown. + * + * Linux_AssociatedPowerManagementService_PowerState_Master_Bus_Reset_Graceful + */ + // not implemented + + /* 15 Power Cycle (Off - Soft Graceful) + * equivalent to Power Cycle (Off - Soft) but preceded by a request + * to the managed element to perform an orderly shutdown. + * + * Reset system without removing power but preceded by a request + * to the managed element to perform an orderly shutdown. + * + * Linux_AssociatedPowerManagementService_PowerState_Power_Cycle_Off___Soft_Graceful + */ + // Reboot (shut down programs first) + list[i++] = Linux_AssociatedPowerManagementService_PowerState_Power_Cycle_Off___Soft_Graceful; + + /* 16 Power Cycle (Off - Hard Graceful) + * equivalent to Power Cycle (Off - Hard) but preceded by a request + * to the managed element to perform an orderly shutdown. + * + * Equivalent to Off–Hard followed by On but preceded by a request + * to the managed element to perform an orderly shutdown. + * + * Linux_AssociatedPowerManagementService_PowerState_Power_Cycle_Off___Hard_Graceful + */ + // not implemented + + *count = i; + return list; +} + +void job_free(PowerStateChangeJob *job) +{ + job->broker->xft->destroyMutex(job->mutex); +} + +GList *power_get_jobs(Power *power) +{ + PowerStateChangeJob *powerStateChangeJob; + GList *plist = power->jobs; + while (plist) { + powerStateChangeJob = plist->data; + MUTEX_LOCK(powerStateChangeJob); + if ((powerStateChangeJob->jobState == Linux_ConcreteJob_JobState_Completed || + powerStateChangeJob->jobState == Linux_ConcreteJob_JobState_Killed || + powerStateChangeJob->jobState == Linux_ConcreteJob_JobState_Terminated) && + time(NULL) - powerStateChangeJob->timeOfLastChange > powerStateChangeJob->timeBeforeRemoval) { + + MUTEX_LOCK(power); + power->jobs = g_list_remove_link(power->jobs, plist); + MUTEX_UNLOCK(power); + job_free(powerStateChangeJob); + } + MUTEX_UNLOCK(powerStateChangeJob); + plist = g_list_next(plist); + } + return power->jobs; +} + +unsigned short job_state(PowerStateChangeJob *state) +{ + return state->jobState; +} + +int job_timeOfLastChange(PowerStateChangeJob *state) +{ + return state->timeOfLastChange; +} + +int job_timeBeforeRemoval(PowerStateChangeJob *state) +{ + return state->timeBeforeRemoval; +} + diff --git a/src/power/src/power.h b/src/power/src/power.h new file mode 100644 index 0000000..8f1f0bc --- /dev/null +++ b/src/power/src/power.h @@ -0,0 +1,56 @@ +#ifndef POWER_H +#define POWER_H + +#include + +typedef struct _Power Power; +typedef struct _CMPIBroker CMPIBroker; +typedef struct _PowerStateChangeJob PowerStateChangeJob; + +/** + * Get reference to global power object + * \note Don't forget to call power_unref + */ +Power *power_ref(const CMPIBroker *_cb); + +/** + * Decrement reference counter for power struct + */ +void power_unref(Power *power); + +/** + * Get list of available requested power states + * + * \param power Pointer to power struct, obtained by power_ref + * \param count Number of states returned + * \return list of power states + */ +unsigned short *power_available_requested_power_states(Power *power, int *count); + +/** + * Get requested power state + * + * \param power Pointer to power struct, obtained by power_ref + * \return current requested power state + */ +unsigned short power_requested_power_state(Power *power); + +/** + * Request change power state to \p state + * + * \param power Pointer to power struct, obtained by power_ref + * \param state Requested power state + * \return CMPI return code + */ +int power_request_power_state(Power *power, unsigned short state); + +GList *power_get_jobs(Power *power); + +unsigned short power_transitioning_to_power_state(Power *power); + + +unsigned short job_state(PowerStateChangeJob *state); +int job_timeOfLastChange(PowerStateChangeJob *state); +int job_timeBeforeRemoval(PowerStateChangeJob *state); + +#endif // POWER_H diff --git a/src/power/src/trace.c b/src/power/src/trace.c new file mode 100644 index 0000000..1f23a6a --- /dev/null +++ b/src/power/src/trace.c @@ -0,0 +1,29 @@ + +#include +#include +#include + +static FILE *_trace_file = NULL; + +void _trace(int level, const char *file, int line, const char *format, ...) +{ + // TODO; level + if (_trace_file == NULL) { + char *filename = getenv("SBLIM_TRACE_FILE"); + if (filename != NULL) { + _trace_file = fopen(filename, "a"); + if (_trace_file == NULL) { + _trace_file = stderr; + } + } else { + _trace_file = stderr; + } + } + + va_list args; + va_start(args, format); + fprintf(_trace_file, "%s:%d\t", file, line); + vfprintf(_trace_file, format, args); + fprintf(_trace_file, "\n"); + va_end(args); +} diff --git a/src/power/src/trace.h b/src/power/src/trace.h new file mode 100644 index 0000000..65118d4 --- /dev/null +++ b/src/power/src/trace.h @@ -0,0 +1,4 @@ + +#define TRACE(level, ...) _trace(level, __FILE__, __LINE__, __VA_ARGS__) + +void _trace(int level, const char *file, int line, const char *format, ...); diff --git a/src/service/AUTHORS b/src/service/AUTHORS new file mode 100644 index 0000000..c64b60d --- /dev/null +++ b/src/service/AUTHORS @@ -0,0 +1 @@ +Vitezslav Crhonek \ No newline at end of file diff --git a/src/service/COPYING b/src/service/COPYING new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/src/service/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. 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 +them 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 prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. 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. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey 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; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If 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 convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + 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. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +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. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 3 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, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program 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, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU 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 Lesser General +Public License instead of this License. But first, please read +. diff --git a/src/service/ChangeLog b/src/service/ChangeLog new file mode 100644 index 0000000..eca4bdd --- /dev/null +++ b/src/service/ChangeLog @@ -0,0 +1 @@ +No changes. \ No newline at end of file diff --git a/src/service/Makefile.am b/src/service/Makefile.am new file mode 100644 index 0000000..5cf4745 --- /dev/null +++ b/src/service/Makefile.am @@ -0,0 +1,38 @@ +# Start from an empty extra distribution file list +EXTRA_DIST= + +# providerdir defines where provider libraries will be installed (@PROVIDERDIR@ is set by the configure script) +providerdir = @PROVIDERDIR@ + +provider_LTLIBRARIES = libService.la + +libService_la_SOURCES = Service.c +libService_la_LIBADD = -lServiceUtils -lserviceutil +libService_la_LDFLAGS = -avoid-version + +lib_LTLIBRARIES = libServiceUtils.la libserviceutil.la +libServiceUtils_la_SOURCES= ServiceUtils.c +libServiceUtils_la_LDFLAGS = -Wc,-nostartfiles +libserviceutil_la_SOURCES = util/serviceutil.c +libserviceutil_la_LDFLAGS = -Wc,-nostartfiles + +noinst_HEADERS = ServiceUtils.h util/serviceutil.h + +# Mof file +SCHEMAS=mof/Linux_Service.mof +REGISTRATIONS=mof/Linux_Service.registration + +pkgdata_DATA=$(SCHEMAS) $(REGISTRATIONS) +pkgdata_SCRIPTS=provider-register.sh + +EXTRA_DIST+=mof $(pkgdata_SCRIPTS) +# Register the provider(s) and class definition(s) to the current CIM server/CIMOM +postinstall: + sh provider-register.sh -t @CIMSERVER@ -r $(REGISTRATIONS) -m $(SCHEMAS) +preuninstall: + sh provider-register.sh -d -t @CIMSERVER@ -r $(REGISTRATIONS) -m $(SCHEMAS) + + +# Install util/syslog-service.sh +bin_SCRIPTS = util/serviceutil.sh util/servicedisc.sh +EXTRA_DIST+=$(bin_SCRIPTS) diff --git a/src/service/NEWS b/src/service/NEWS new file mode 100644 index 0000000..047ccd0 --- /dev/null +++ b/src/service/NEWS @@ -0,0 +1 @@ +No news. \ No newline at end of file diff --git a/src/service/README b/src/service/README new file mode 100644 index 0000000..62658fb --- /dev/null +++ b/src/service/README @@ -0,0 +1,6 @@ +RPM creation: + +./autoconfiscate.sh +./configure PROVIDERDIR=/usr/lib64/cmpi CIMSERVER=sfcb +make distcheck +rpmbuild with tarball and .spec diff --git a/src/service/Service.c b/src/service/Service.c new file mode 100644 index 0000000..8ab8591 --- /dev/null +++ b/src/service/Service.c @@ -0,0 +1,343 @@ +/* + * Service.c + * + * Copyright (C) 2012 Red Hat, Inc. All rights reserved. + * + * 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, see . + * + * Based on Syslog_Service.c from sblim-cmpi-syslog written by + * R Sharada , Copyright (c) IBM Corp. 2003, 2009 + * + * Red Hat Author(s): Vitezslav Crhonek + * + */ + +#include +#include +#include +#include + +#include "ServiceUtils.h" +#include "util/serviceutil.h" +#define LOCALCLASSNAME "Linux_Service" + +static const CMPIBroker *_broker; + +#ifdef CMPI_VER_100 +#define ServiceSetInstance ServiceModifyInstance +#endif + + + +/* Instance MI Cleanup */ +CMPIStatus +ServiceCleanup(CMPIInstanceMI *mi, + const CMPIContext *ctx, + CMPIBoolean terminate) +{ + CMReturn(CMPI_RC_OK); +} + + + +/* Instance MI Functions */ +CMPIStatus +ServiceEnumInstanceNames(CMPIInstanceMI *mi, + const CMPIContext *ctx, + const CMPIResult *rslt, + const CMPIObjectPath *ref) +{ + CMPIObjectPath *op = NULL; + CMPIStatus st = {CMPI_RC_OK,NULL}; + void *enumhdl = NULL; + Service servicebuf; + int i = 0; + SList *slist = NULL; + + service_debug(stderr,"ServiceEnumInstanceNames() called, ctx %p, result %p, op %p", ctx, rslt, ref); + + memset(&servicebuf, '\0', sizeof(Service)); + + slist = Service_Find_All(); + + for(i = 0; i < slist->cnt; i++) + { + enumhdl = Service_Begin_Enum(slist->name[i]); + if (enumhdl == NULL) + { + CMSetStatusWithChars(_broker, &st, CMPI_RC_ERR_FAILED, + "Could not begin service names enumeration"); + Service_Free_SList(slist); + return st; + } + else + { + if (Service_Next_Enum(enumhdl, &servicebuf, slist->name[i])) + { + // build object path from buffer + op = makeServicePath(_broker, + LOCALCLASSNAME, + CMGetCharPtr(CMGetNameSpace(ref, NULL)), + &servicebuf); + if (CMIsNullObject(op)) + { + CMSetStatusWithChars(_broker, &st, CMPI_RC_ERR_FAILED, + "Could not construct object path"); + goto label; + } + CMReturnObjectPath(rslt, op); + } +label: + CMReturnDone(rslt); + Service_End_Enum(enumhdl); + } + } + + Service_Free_SList(slist); + return st; +} + + + +CMPIStatus +ServiceEnumInstances(CMPIInstanceMI *mi, + const CMPIContext *ctx, + const CMPIResult *rslt, + const CMPIObjectPath *ref, + const char **properties) +{ + CMPIInstance *in = NULL; + CMPIStatus st = {CMPI_RC_OK,NULL}; + void *enumhdl = NULL; + Service servicebuf; + int i = 0; + SList *slist = NULL; + + service_debug(stderr,"ServiceEnumInstances() called, ctx %p, result %p, op %p", ctx, rslt, ref); + + memset(&servicebuf, '\0', sizeof(Service)); + + slist = Service_Find_All(); + + for(i = 0; i < slist->cnt; i++) + { + enumhdl = Service_Begin_Enum(slist->name[i]); + if (enumhdl == NULL) + { + CMSetStatusWithChars(_broker, &st, CMPI_RC_ERR_FAILED, + "Could not begin service instances enumeration"); + Service_Free_SList(slist); + return st; + } + else + { + if (Service_Next_Enum(enumhdl, &servicebuf, slist->name[i])) + { + // build object instance from buffer + in = makeServiceInstance(_broker, + LOCALCLASSNAME, + CMGetCharPtr(CMGetNameSpace(ref, NULL)), + &servicebuf); + if (CMIsNullObject(in)) + { + CMSetStatusWithChars(_broker, &st, CMPI_RC_ERR_FAILED, + "Could not construct instance"); + goto label; + } + CMReturnInstance(rslt, in); + } +label: + CMReturnDone(rslt); + Service_End_Enum(enumhdl); + } + } + + Service_Free_SList(slist); + return st; +} + + + +CMPIStatus +ServiceGetInstance(CMPIInstanceMI *mi, + const CMPIContext *ctx, + const CMPIResult *rslt, + const CMPIObjectPath *cop, + const char **properties) +{ + CMPIInstance *in = NULL; + CMPIStatus st = {CMPI_RC_OK,NULL}; + CMPIData nd; + void *enumhdl = NULL; + Service servicebuf; + char *name = NULL; + int i = 0; + + memset(&servicebuf, '\0', sizeof(Service)); + + service_debug(stderr,"ServiceGetInstance() called, ctx %p, result %p, op %p", ctx, rslt, cop); + + nd = CMGetKey(cop, "Name", &st); + name = CMGetCharPtr(nd.value.string); + + service_debug(stderr,"Name = %s", name); + + enumhdl = Service_Begin_Enum(name); + if (enumhdl == NULL) { + CMSetStatusWithChars(_broker, &st, CMPI_RC_ERR_FAILED, + "Could not begin service instances enumeration"); + return st; + } else { + if (Service_Next_Enum(enumhdl,&servicebuf, name)) { + if (strncmp(name, servicebuf.svName, 6)==0) { + // build object instance from buffer + in = makeServiceInstance(_broker, + LOCALCLASSNAME, + CMGetCharPtr(CMGetNameSpace(cop,NULL)), + &servicebuf); + if (CMIsNullObject(in)) { + CMSetStatusWithChars(_broker, &st, CMPI_RC_ERR_FAILED, + "Could not construct instance"); + goto label; + } + CMReturnInstance(rslt,in); + } + } +label: + CMReturnDone(rslt); + Service_End_Enum(enumhdl); + } + + return st; +} + + + +/* Instance MI functions - not supported */ +CMPIStatus +ServiceCreateInstance(CMPIInstanceMI *mi, + const CMPIContext *ctx, + const CMPIResult *rslt, + const CMPIObjectPath *cop, + const CMPIInstance *ci) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + + + +CMPIStatus +ServiceSetInstance(CMPIInstanceMI *mi, + const CMPIContext *ctx, + const CMPIResult *rslt, + const CMPIObjectPath *cop, + const CMPIInstance *ci, + const char **properties) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + + + +CMPIStatus +ServiceDeleteInstance(CMPIInstanceMI *mi, + const CMPIContext *ctx, + const CMPIResult *rslt, + const CMPIObjectPath *cop) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + +CMPIStatus +ServiceExecQuery(CMPIInstanceMI *mi, + const CMPIContext *ctx, + const CMPIResult *rslt, + const CMPIObjectPath *cop, + const char *lang, + const char *query) +{ + CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); +} + + + +/* Method MI Cleanup */ +CMPIStatus +ServiceMethodCleanup(CMPIMethodMI *mi, + const CMPIContext *ctx, + CMPIBoolean terminate) +{ + CMReturn(CMPI_RC_OK); +} + + + +/* Method MI Functions */ +CMPIStatus +ServiceInvokeMethod(CMPIMethodMI *mi, + const CMPIContext *ctx, + const CMPIResult *rslt, + const CMPIObjectPath *cop, + const char *method, + const CMPIArgs *in, + CMPIArgs *out) +{ + CMPIStatus st = {CMPI_RC_OK,NULL}; + CMPIData dt; + char typebuf[1000]; + char *name = NULL; + + memset(&typebuf, '\0', sizeof(typebuf)); + + dt = CMGetKey(cop, "Name", &st); + if (st.rc != CMPI_RC_OK) + { + CMSetStatusWithChars(_broker, &st, CMPI_RC_ERR_FAILED, + "Could not get instance name"); + + } + else + { + name = CMGetCharPtr(dt.value.string); + if (Service_Operation(name, method, typebuf, sizeof(typebuf))) + { + /* If the function returns 1, then failure */ + CMSetStatusWithChars(_broker, &st, CMPI_RC_ERR_FAILED, + "Could not get instance type"); + } + else + { + CMReturnData(rslt, typebuf, CMPI_chars); + CMReturnDone(rslt); + } + } + + return st; +} + + + +/* Instance MI Factory */ +CMInstanceMIStub(Service, + Service, + _broker, + CMNoHook); + + + +/* Method MI Factory */ +CMMethodMIStub(Service, + Service, + _broker, + CMNoHook); diff --git a/src/service/ServiceUtils.c b/src/service/ServiceUtils.c new file mode 100644 index 0000000..37bb081 --- /dev/null +++ b/src/service/ServiceUtils.c @@ -0,0 +1,119 @@ +/* + * ServiceUtils.c + * + * Copyright (C) 2012 Red Hat, Inc. All rights reserved. + * + * 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, see . + * + * Based on Syslog_ServiceUtils.c from sblim-cmpi-syslog written by + * R Sharada , Copyright (c) IBM Corp. 2003, 2009 + * + * Red Hat Author(s): Vitezslav Crhonek + * + */ + +#include +#include +#include +#include +#include + +#include "ServiceUtils.h" +#include "util/serviceutil.h" +static char sccn[] = "CIM_UnitaryComputerSystem"; +static char ccn[] = "Linux_Service"; +static char csn[500] = ""; + + + +char * +SystemCreationClassName() +{ + return sccn; +} + + + +char * +SystemName() +{ + if (*csn == 0) + gethostname(csn, sizeof(csn)); + return csn; +} + + + +char * +CreationClassName() +{ + return ccn; +} + + + +CMPIObjectPath * +makeServicePath(const CMPIBroker *broker, + const char *classname, + const char *namespace, + Service *svc) +{ + CMPIObjectPath *op = NULL; + + op = CMNewObjectPath(broker, + (char*)namespace, + (char*)classname, + NULL); + if (!CMIsNullObject(op)) + { + CMAddKey(op, "CreationClassName", CreationClassName(), CMPI_chars); + CMAddKey(op, "SystemCreationClassName", SystemCreationClassName(), CMPI_chars); + CMAddKey(op, "SystemName", SystemName(), CMPI_chars); + CMAddKey(op, "Name", svc->svName, CMPI_chars); + } + + return op; +} + + + +CMPIInstance * +makeServiceInstance(const CMPIBroker *broker, + const char * classname, + const char * namespace, + Service *svc) +{ + CMPIInstance *in = NULL; + CMPIObjectPath *op = CMNewObjectPath(broker, + (char*) namespace, + (char*) classname, + NULL); + if (!CMIsNullObject(op)) + { + in = CMNewInstance(broker, op, NULL); + if (!CMIsNullObject(in)) + { + CMSetProperty(in, "CreationClassName", CreationClassName(), CMPI_chars); + CMSetProperty(in, "SystemCreationClassName", SystemCreationClassName(), CMPI_chars); + CMSetProperty(in, "SystemName", SystemName(), CMPI_chars); + CMSetProperty(in, "Name", svc->svName, CMPI_chars); + CMSetProperty(in, "Status", svc->svStatus, CMPI_chars); + CMSetProperty(in, "Started", &svc->svStarted, CMPI_boolean); + CMSetProperty(in, "EnabledDefault", (CMPIValue*) &(svc->svEnabledDefault), CMPI_uint16); + } + } + + return in; +} + diff --git a/src/service/ServiceUtils.h b/src/service/ServiceUtils.h new file mode 100644 index 0000000..a79833c --- /dev/null +++ b/src/service/ServiceUtils.h @@ -0,0 +1,37 @@ +/* + * ServiceUtils.h + * + * Copyright (C) 2012 Red Hat, Inc. All rights reserved. + * + * 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, see . + * + * Based on Syslog_ServiceUtils.h from sblim-cmpi-syslog written by + * R Sharada , Copyright (c) IBM Corp. 2003, 2009 + * + * Red Hat Author(s): Vitezslav Crhonek + * + */ + +#ifndef SERVICEUTILS_H +#define SERVICEUTILS_H + +#include "util/serviceutil.h" + +CMPIObjectPath * +makeServicePath(const CMPIBroker *broker, const char *classname, const char *namespace, Service *svc); + +CMPIInstance * +makeServiceInstance(const CMPIBroker *broker, const char *classname, const char *namespace, Service *svc); + +#endif diff --git a/src/service/acinclude.m4 b/src/service/acinclude.m4 new file mode 100644 index 0000000..52538d0 --- /dev/null +++ b/src/service/acinclude.m4 @@ -0,0 +1,407 @@ +dnl +dnl $Id: acinclude.m4,v 1.2 2009/05/22 03:50:48 tyreld Exp $ +dnl +dnl +dnl (C) Copyright IBM Corp. 2004, 2005, 2009 +dnl +dnl THIS FILE IS PROVIDED UNDER THE TERMS OF THE ECLIPSE PUBLIC LICENSE +dnl ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE +dnl CONSTITUTES RECIPIENTS ACCEPTANCE OF THE AGREEMENT. +dnl +dnl You can obtain a current copy of the Eclipse Public License from +dnl http://www.eclipse.org/legal/epl-v10.html +dnl +dnl Author: Konrad Rzeszutek +dnl Contributors: Viktor Mihajlovski +dnl Date : 09/20/2004 +dnl +dnl +dnl CHECK_CMPI: Check for CMPI headers and set the CPPFLAGS +dnl with the -I +dnl +dnl CHECK_PEGASUS_2_3_2: Check for Pegasus 2.3.2 and set +dnl the HAVE_PEGASUS_2_3_2 +dnl flag +dnl + +AC_DEFUN([CHECK_PEGASUS_2_3_2], + [ + AC_MSG_CHECKING(for Pegasus 2.3.2) + if which cimserver > /dev/null 2>&1 + then + test_CIMSERVER=`cimserver -v` + fi + if test "$test_CIMSERVER" == "2.3.2"; then + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(HAVE_PEGASUS_2_3_2,1,[Defined to 1 if Pegasus 2.3.2 is used]) + else + AC_MSG_RESULT(no) + + fi + ] +) + +dnl +dnl CHECK_PEGASUS_2_4: Check for Pegasus 2.4 and set the +dnl the -DPEGASUS_USE_EXPERIMENTAL_INTERFACES flag +dnl +AC_DEFUN([CHECK_PEGASUS_2_4], + [ + AC_MSG_CHECKING(for Pegasus 2.4) + if which cimserver > /dev/null 2>&1 + then + test_CIMSERVER=`cimserver -v` + fi + if test "$test_CIMSERVER" == "2.4"; then + AC_MSG_RESULT(yes) + CPPFLAGS="$CPPFLAGS -DPEGASUS_USE_EXPERIMENTAL_INTERFACES" + AC_DEFINE_UNQUOTED(HAVE_PEGASUS_2_4,1,[Defined to 1 if Pegasus 2.4 is used]) + else + AC_MSG_RESULT(no) + + fi + ] +) + + +dnl +dnl Helper functions +dnl +AC_DEFUN([_CHECK_CMPI], + [ + AC_MSG_CHECKING($1) + AC_TRY_LINK( + [ + #include + #include + #include + #include + ], + [ + CMPIBroker broker; + CMPIStatus status = {CMPI_RC_OK, NULL}; + CMPIString *s = CMNewString(&broker, "TEST", &status); + ], + [ + have_CMPI=yes + dnl AC_MSG_RESULT(yes) + ], + [ + have_CMPI=no + dnl AC_MSG_RESULT(no) + ]) + +]) + +AC_DEFUN([_CHECK_INDHELP_HEADER], + [ + AC_MSG_CHECKING($1) + AC_TRY_COMPILE( + [ + #include + #include + ], + [ + CMPISelectExp *filter = NULL; + ind_set_select("/root/cimv2",NULL,filter); + ], + [ + have_INDHELP=yes + dnl AC_MSG_RESULT(yes) + ], + [ + have_INDHELP=no + dnl AC_MSG_RESULT(no) + ]) + +]) + +dnl +dnl The main function to check for CMPI headers +dnl Modifies the CPPFLAGS with the right include directory and sets +dnl the 'have_CMPI' to either 'no' or 'yes' +dnl + +AC_DEFUN([CHECK_CMPI], + [ + AC_MSG_CHECKING(for CMPI headers) + dnl Check just with the standard include paths + CMPI_CPP_FLAGS="$CPPFLAGS" + _CHECK_CMPI(standard) + if test "$have_CMPI" == "yes"; then + dnl The standard include paths worked. + AC_MSG_RESULT(yes) + else + _DIRS_="/usr/include/cmpi \ + /usr/local/include/cmpi \ + $PEGASUS_ROOT/src/Pegasus/Provider/CMPI \ + /opt/tog-pegasus/include/Pegasus/Provider/CMPI \ + /usr/include/Pegasus/Provider/CMPI \ + /usr/include/openwbem \ + /usr/sniacimom/include" + for _DIR_ in $_DIRS_ + do + _cppflags=$CPPFLAGS + _include_CMPI="$_DIR_" + CPPFLAGS="$CPPFLAGS -I$_include_CMPI" + _CHECK_CMPI($_DIR_) + if test "$have_CMPI" == "yes"; then + dnl Found it + AC_MSG_RESULT(yes) + dnl Save the new -I parameter + CMPI_CPP_FLAGS="$CPPFLAGS" + break + fi + CPPFLAGS=$_cppflags + done + fi + CPPFLAGS="$CMPI_CPP_FLAGS" + if test "$have_CMPI" == "no"; then + AC_MSG_ERROR(no. Sorry cannot find CMPI headers files.) + fi + ] +) + +dnl +dnl The main function to check for the indication_helper header. +dnl Modifies the CPPFLAGS with the right include directory and sets +dnl the 'have_INDHELP' to either 'no' or 'yes' +dnl + +AC_DEFUN([CHECK_INDHELP_HEADER], + [ + INDHELP_CPP_FLAGS="$CPPFLAGS" + AC_MSG_CHECKING(for indication helper header) + dnl Check just with the standard include paths + _CHECK_INDHELP_HEADER(standard) + if test "$have_INDHELP" == "yes"; then + dnl The standard include paths worked. + AC_MSG_RESULT(yes) + else + _DIRS_="/usr/include/sblim \ + /usr/local/include/sblim" + for _DIR_ in $_DIRS_ + do + _cppflags=$CPPFLAGS + _include_INDHELP="$_DIR_" + CPPFLAGS="$CPPFLAGS -I$_include_INDHELP" + _CHECK_INDHELP_HEADER($_DIR_) + if test "$have_INDHELP" == "yes"; then + dnl Found it + AC_MSG_RESULT(yes) + dnl Save the new -I parameter + INDHELP_CPP_FLAGS="$CPPFLAGS" + break + fi + CPPFLAGS=$_cppflags + done + fi + CPPFLAGS="$INDHELP_CPP_FLAGS" + if test "$have_INDHELP" == "no"; then + AC_MSG_RESULT(no) + fi + ] +) + +dnl +dnl The check for the CMPI provider directory +dnl Sets the PROVIDERDIR variable. +dnl + +AC_DEFUN([CHECK_PROVIDERDIR], + [ + AC_MSG_CHECKING(for CMPI provider directory) + _DIRS="$libdir/cmpi" + save_exec_prefix=${exec_prefix} + save_prefix=${prefix} + if test xNONE == x${prefix}; then + prefix=/usr/local + fi + if test xNONE == x${exec_prefix}; then + exec_prefix=$prefix + fi + for _dir in $_DIRS + do + _xdir=`eval echo $_dir` + AC_MSG_CHECKING( $_dir ) + if test -d $_xdir ; then + dnl Found it + AC_MSG_RESULT(yes) + if test x"$PROVIDERDIR" == x ; then + PROVIDERDIR=$_dir + fi + break + fi + done + if test x"$PROVIDERDIR" == x ; then + PROVIDERDIR="$libdir"/cmpi + AC_MSG_RESULT(implied: $PROVIDERDIR) + fi + exec_prefix=$save_exec_prefix + prefix=$save_prefix + ] +) + +dnl +dnl The "check" for the CIM server type in PATH and +dnl the sbin directories. +dnl Sets the CIMSERVER variable. +dnl + +AC_DEFUN([CHECK_CIMSERVER], + [ + AC_MSG_CHECKING(for CIM servers) + if test x"$CIMSERVER" = x + then + _SERVERS="sfcbd cimserver owcimomd" + _SAVE_PATH=$PATH + PATH=/usr/sbin:/usr/local/sbin:$PATH + for _name in $_SERVERS + do + AC_MSG_CHECKING( $_name ) + for _path in `echo $PATH | sed "s/:/ /g"` + do + if test -f $_path/$_name ; then + dnl Found it + AC_MSG_RESULT(yes) + if test x"$CIMSERVER" == x ; then + case $_name in + sfcbd) CIMSERVER=sfcb;; + cimserver) CIMSERVER=pegasus;; + owcimomd) CIMSERVER=openwbem;; + esac + fi + break; + fi + done + done + PATH=$_SAVE_PATH + if test x"$CIMSERVER" == x ; then + CIMSERVER=sfcb + AC_MSG_RESULT(implied: $CIMSERVER) + fi + fi + # Cross platform only needed for sfcb currently + if test $CIMSERVER = sfcb + then + AC_REQUIRE([AC_CANONICAL_HOST]) + AC_CHECK_SIZEOF(int) + case "$build_cpu" in + i*86) case "$host_cpu" in + powerpc*) if test $ac_cv_sizeof_int == 4 + then + REGISTER_FLAGS="-X P32" + fi ;; + esac ;; + esac + AC_SUBST(REGISTER_FLAGS) + fi + ] +) + +dnl +dnl The check for the SBLIM test suite +dnl Sets the TESTSUITEDIR variable and the TESTSUITE conditional +dnl + +AC_DEFUN([CHECK_TESTSUITE], + [ + AC_MSG_CHECKING(for SBLIM testsuite) + _DIRS="$datadir/sblim-testsuite" + save_exec_prefix=${exec_prefix} + save_prefix=${prefix} + if test xNONE == x${prefix}; then + prefix=/usr/local + fi + if test xNONE == x${exec_prefix}; then + exec_prefix=$prefix + fi + for _name in $_DIRS + do + AC_MSG_CHECKING( $_name ) + _xname=`eval echo $_name` + if test -x $_xname/run.sh ; then + dnl Found it + AC_MSG_RESULT(yes) + if test x"$TESTSUITEDIR" == x; then + TESTSUITEDIR=$_name + fi + AC_SUBST(TESTSUITEDIR) + break; + fi + done + if test x"$TESTSUITEDIR" == x ; then + AC_MSG_RESULT(no) + fi + AM_CONDITIONAL(TESTSUITE,[test x"$TESTSUITEDIR" != x]) + exec_prefix=$save_exec_prefix + prefix=$save_prefix + ] +) + +dnl +dnl The main function to check for the cmpi-base common header +dnl Modifies the CPPFLAGS with the right include directory and sets +dnl the 'have_SBLIMBASE' to either 'no' or 'yes' +dnl +AC_DEFUN([_CHECK_SBLIM_BASE], + [ + AC_MSG_CHECKING($1) + _ldflags=$LDFLAGS + LDFLAGS="$LDFLAGS -lcmpiOSBase_Common" + AC_TRY_LINK( + [ + #include + ], + [ + get_system_name(); + ], + [ + have_SBLIMBASE=yes + LDFLAGS=$_ldflags + dnl AC_MSG_RESULT(yes) + ], + [ + have_SBLIMBASE=no + LDFLAGS=$_ldflags + dnl AC_MSG_RESULT(no) + ]) + +]) + +AC_DEFUN([CHECK_SBLIM_BASE], + [ + AC_MSG_CHECKING(for SBLIM Base) + SBLIMBASE_CPP_FLAGS="$CPPFLAGS" + dnl Check just with the standard include paths + _CHECK_SBLIM_BASE(standard) + if test "$have_SBLIMBASE" == "yes"; then + dnl The standard include paths worked. + AC_MSG_RESULT(yes) + else + _DIRS_="/usr/include/sblim \ + /usr/local/include/sblim" + for _DIR_ in $_DIRS_ + do + _cppflags=$CPPFLAGS + _include_SBLIMBASE="$_DIR_" + CPPFLAGS="$CPPFLAGS -I$_include_SBLIMBASE" + _CHECK_SBLIM_BASE($_DIR_) + if test "$have_SBLIMBASE" == "yes"; then + dnl Found it + AC_MSG_RESULT(yes) + dnl Save the new -I parameter + SBLIMBASE_CPP_FLAGS="$CPPFLAGS" + LIBSBLIMBASE=-lcmpiOSBase_Common + break + fi + CPPFLAGS=$_cppflags + done + fi + CPPFLAGS=$SBLIMBASE_CPP_FLAGS + AC_SUBST(LIBSBLIMBASE) + if test "$have_SBLIMBASE" == "no"; then + AC_MSG_ERROR(no. The required SBLIM Base package is missing.) + fi + ] +) diff --git a/src/service/autoconfiscate.sh b/src/service/autoconfiscate.sh new file mode 100755 index 0000000..70a21a7 --- /dev/null +++ b/src/service/autoconfiscate.sh @@ -0,0 +1,39 @@ +#!/bin/sh +# $Id: autoconfiscate.sh,v 1.2 2009/05/22 03:50:48 tyreld Exp $ +# ============================================================================ +# (C) Copyright IBM Corp. 2005, 2009 +# +# THIS FILE IS PROVIDED UNDER THE TERMS OF THE ECLIPSE PUBLIC LICENSE +# ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE +# CONSTITUTES RECIPIENTS ACCEPTANCE OF THE AGREEMENT. +# +# You can obtain a current copy of the Eclipse Public License from +# http://www.eclipse.org/legal/epl-v10.html +# +# Author: Viktor Mihajlovski, +# Contributors: Dr. Gareth S. Bestor, +# Last Updated: April 15, 2005 +# Description: +# Setup autoconf/automake build environment for package. +# Run this script as the first step of building this package. +# ============================================================================ +# NO CHANGES SHOULD BE NECESSARY TO THIS FILE +# ============================================================================ + +echo "Running aclocal ..." && +aclocal --force && + +echo "Running autoheader ..." && +autoheader --force && + +echo "Running libtool ..." && +libtoolize --force && + +echo "Running automake ..." && +automake --add-missing --force-missing && + +echo "Running autoconf ..." && +autoconf --force && + +echo "You may now run ./configure" + diff --git a/src/service/cmpi-service.spec b/src/service/cmpi-service.spec new file mode 100644 index 0000000..90f7a40 --- /dev/null +++ b/src/service/cmpi-service.spec @@ -0,0 +1,91 @@ +%global provider_dir %{_libdir}/cmpi + +Summary: service instrumentation +Name: cmpi-service +Version: 0.0.1 +Release: 1%{?dist} +License: GPLv2+ +Group: Applications/System +URL: http://www.redhat.com +Source0: %{name}-%{version}.tar.gz + +BuildRequires: libtool +Requires: cim-server +Requires: /etc/ld.so.conf.d +Requires(post): /sbin/ldconfig +Requires(postun): /sbin/ldconfig + +%description +Standards Based Linux Instrumentation Syslog Providers + +%prep +%setup -q + +%build +%ifarch s390 s390x ppc ppc64 +export CFLAGS="$RPM_OPT_FLAGS -fsigned-char" +%else +export CFLAGS="$RPM_OPT_FLAGS" +%endif +%configure \ + CIMSERVER=sfcb \ + PROVIDERDIR=%{provider_dir} +sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' libtool +sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool +make + +%install +rm -rf $RPM_BUILD_ROOT +make install DESTDIR=$RPM_BUILD_ROOT +# remove unused libtool files +rm -f $RPM_BUILD_ROOT/%{_libdir}/*a +rm -f $RPM_BUILD_ROOT/%{provider_dir}/*a +# shared libraries +mkdir -p $RPM_BUILD_ROOT/%{_sysconfdir}/ld.so.conf.d +echo "%{_libdir}/cmpi" > $RPM_BUILD_ROOT/%{_sysconfdir}/ld.so.conf.d/%{name}-%{_arch}.conf +# move libraries to provider dir +mv $RPM_BUILD_ROOT/%{_libdir}/lib[Ss]ervice*.so* $RPM_BUILD_ROOT/%{provider_dir} +# add shebang to the scripts +#sed -i -e '1i#!/bin/sh' $RPM_BUILD_ROOT/%{_bindir}/serviceutil.sh + +%files +%defattr(-,root,root,-) +%{_bindir}/serviceutil.sh +%{_bindir}/servicedisc.sh +%{provider_dir}/lib[Ss]ervice*.so* +%{_datadir}/%{name} +%config(noreplace) %{_sysconfdir}/ld.so.conf.d/%{name}-%{_arch}.conf + +%define SERVICE_SCHEMA %{_datadir}/%{name}/Linux_Service.mof +%define SERVICE_REGISTRATION %{_datadir}/%{name}/Linux_Service.registration + +%pre +# If upgrading, deregister old version +if [ $1 -gt 1 ]; then + %{_datadir}/%{name}/provider-register.sh -d \ + -r %{SERVICE_REGISTRATION} -m %{SERVICE_SCHEMA} > /dev/null 2>&1 || :; +fi + +%post +/sbin/ldconfig +if [ $1 -ge 1 ]; then +# Register Schema and Provider - this is higly provider specific + %{_datadir}/%{name}/provider-register.sh \ + -r %{SERVICE_REGISTRATION} -m %{SERVICE_SCHEMA} > /dev/null 2>&1 || :; +fi; + +%preun +# Deregister only if not upgrading +if [ $1 -eq 0 ]; then + %{_datadir}/%{name}/provider-register.sh -d \ + -r %{SERVICE_REGISTRATION} -m %{SERVICE_SCHEMA} > /dev/null 2>&1 || :; +fi + +%postun -p /sbin/ldconfig + +%clean +rm -rf $RPM_BUILD_ROOT + +%changelog +* Thu Mar 29 2012 Vitezslav Crhonek - 0.0.1-1 +- Initial support diff --git a/src/service/configure.ac b/src/service/configure.ac new file mode 100644 index 0000000..fc0c9c6 --- /dev/null +++ b/src/service/configure.ac @@ -0,0 +1,74 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ(2.59) +AC_INIT(SBLIM Service Provider, 0.0.1, vcrhonek@redhat.com, cmpi-service) +AC_CONFIG_HEADER([config.h]) +AM_INIT_AUTOMAKE + +AC_CANONICAL_HOST +case $host_cpu in + i*86) HW=INTEL;; + s390*) HW=S390;; + ppc*) HW=PPC;; + x86_64) HW=X86_64;; + ia64) HW=IA64;; + **) HW=GENERIC;; +esac + +# Configuration Arguments +AC_ARG_VAR([PROVIDERDIR],[the directory where the CMPI providers will be installed.]) +AC_ARG_VAR([CIMSERVER],[the target CIM server (pegasus|sfcb|openwbem|sniacimom).]) + +# Checks for programs. +AC_PROG_CC +AC_PROG_INSTALL +AC_PROG_LIBTOOL + +# Check for required CMPI header files (defined in acinclude.m4) +CHECK_CMPI + +# Check for required libraries (defined in acinclude.m4) +CHECK_PROVIDERDIR + +# Check for CIM Server (defined in acinclude.m4) +CHECK_CIMSERVER + +# Checks for header files. +AC_HEADER_DIRENT +AC_HEADER_STDC +AC_HEADER_SYS_WAIT +AC_CHECK_HEADERS([fcntl.h langinfo.h limits.h malloc.h stdlib.h string.h sys/time.h unistd.h]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_C_INLINE +AC_TYPE_MODE_T +AC_TYPE_OFF_T +AC_TYPE_SIZE_T +AC_HEADER_TIME +AC_STRUCT_TM + +AC_FUNC_MALLOC +AC_FUNC_STAT +AC_CHECK_FUNCS([gethostname strcasecmp strchr strdup strstr]) + +AC_CONFIG_FILES([Makefile]) + +# Extend CPPFLAGS +CPPFLAGS="$CPPFLAGS -D$HW" + +# Display configuration options +echo "-------------------------------------------------------" +echo "Configuration for $PACKAGE complete." +echo "" +echo "The following configuration options have been selected:" +echo "CIMSERVER: " $CIMSERVER +echo "PROVIDERDIR: " $PROVIDERDIR +echo "SYSLOG:" $SYSLOG +echo "CPPFLAGS:" $CPPFLAGS +echo "-------------------------------------------------------" + +AC_OUTPUT + +echo "You may now run make" diff --git a/src/service/mof/Linux_Service.mof b/src/service/mof/Linux_Service.mof new file mode 100644 index 0000000..cf59c10 --- /dev/null +++ b/src/service/mof/Linux_Service.mof @@ -0,0 +1,58 @@ +// +// Linux_Service.mof +// +// Copyright (C) 2012 Red Hat, Inc. All rights reserved. +// +// 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, see . +// +// Red Hat Author(s): Vitezslav Crhonek +// + +[ Description("Class representing Linux Service"), + Provider("cmpi:Service") +] +class Linux_Service : CIM_Service +{ + [ Override("StartService"), + Provider("cmpi:Service") ] + uint32 StartService(); + + [ Override("StopService"), + Provider("cmpi:Service") ] + uint32 StopService(); + + [ Provider("cmpi:Service") ] + uint32 ReloadService(); + + [ Provider("cmpi:Service") ] + uint32 RestartService(); + + [ Provider("cmpi:Service") ] + uint32 TryRestartService(); + + [ Provider("cmpi:Service") ] + uint32 CondRestartService(); + + [ Provider("cmpi:Service") ] + uint32 ReloadOrRestartService(); + + [ Provider("cmpi:Service") ] + uint32 ReloadOrTryRestartService(); + + [ Provider("cmpi:Service") ] + uint32 TurnServiceOn(); + + [ Provider("cmpi:Service") ] + uint32 TurnServiceOff(); +}; diff --git a/src/service/mof/Linux_Service.registration b/src/service/mof/Linux_Service.registration new file mode 100644 index 0000000..ecf288b --- /dev/null +++ b/src/service/mof/Linux_Service.registration @@ -0,0 +1,2 @@ +# Classname Namespace Providername Libraryname Capabilities ... +Linux_Service root/cimv2 Service Service instance method diff --git a/src/service/provider-register.sh b/src/service/provider-register.sh new file mode 100755 index 0000000..db0681c --- /dev/null +++ b/src/service/provider-register.sh @@ -0,0 +1,755 @@ +#!/bin/sh +# $Id: provider-register.sh,v 1.2 2009/05/22 03:50:49 tyreld Exp $ +# ================================================================== +# (C) Copyright IBM Corp. 2005, 2009 +# +# THIS FILE IS PROVIDED UNDER THE TERMS OF THE ECLIPSE PUBLIC LICENSE +# ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE +# CONSTITUTES RECIPIENTS ACCEPTANCE OF THE AGREEMENT. +# +# You can obtain a current copy of the Eclipse Public License from +# http://www.eclipse.org/legal/epl-v10.html +# +# Author: Viktor Mihajlovski +# Contributors: +# Description: Script to install class definitions (MOFs) and +# registration data for a variety of supported CIMOMs +# ================================================================== + +pegasus_repository() +{ + for p in $PEGASUS_HOME /var/lib/Pegasus /var/lib/pegasus \ + /usr/local/var/lib/pegasus /var/local/lib/pegasus /var/opt/tog-pegasus + do + if test -d $p/repository + then + echo $p/$1 + return 0 + fi + done + return 1 +} + +pegasus_path() +{ + for p in $PEGASUS_HOME/bin /usr/bin /usr/sbin /usr/local/bin \ + /usr/local/sbin /opt/tog-pegasus/bin /opt/tog-pegasus/sbin + do + if test -x $p/$1 + then + echo $p/$1 + return 0 + fi + done + return 1 +} + +pegasus_transform() +{ + OUTFILE=$1 + shift + regfiles=$* + PROVIDERMODULES=`cat $regfiles 2> /dev/null | grep -v '^[[:space:]]*#.*' | cut -d ' ' -f 4 | sort | uniq` + if test x"$PROVIDERMODULES" = x + then + echo Failed to read registration files >&2 + return 1 + fi + PROVIDERS=`cat $regfiles 2> /dev/null | grep -v '^[[:space:]]*#.*' | cut -d ' ' -f 3-4 | sort | uniq` + +# produce ProviderModules + echo > $OUTFILE + chatter "Processing provider modules:" $PROVIDERMODULES + for pm in $PROVIDERMODULES + do + cat >> $OUTFILE <> $OUTFILE <&2 + return 1;; + esac + done + cat >> $OUTFILE < /dev/null 2>&1 + then + CIMMOF=`pegasus_path cimmof` + if test $? != 0 + then + echo "Error: cimmof not found" >&2 + return 1 + fi + state=active + else + CIMMOF=`pegasus_path cimmofl` + if test $? != 0 + then + echo "Error: cimmofl not found" >&2 + return 1 + fi + PEGASUSREPOSITORY=`pegasus_repository` + if test $? != 0 + then + echo "Error: pegasus repository not found" >&2 + return 1 + fi + CIMMOF="$CIMMOF -R $PEGASUSREPOSITORY" + state=inactive + fi + + mofpath= + mymofs= + myregs= + mofmode=1 + namespace=$1 + shift + + while test x$1 != x + do + if test $1 = ":" + then + mofmode=0 + shift + continue + fi + if test $mofmode = 1 + then + if test x$mofpath = x + then + mofpath=`dirname $1` + fi + mymofs="$mymofs $1" + else + myregs="$myregs $1" + fi + shift + done + + for _TEMPDIR in /var/tmp /tmp + do + if test -w $_TEMPDIR + then + _REGFILENAME=$_TEMPDIR/$$.mof + break + fi + done + + + trap "rm -f $_REGFILENAME" EXIT + + if pegasus_transform $_REGFILENAME $myregs + then + chatter Registering providers with $state cimserver + $CIMMOF -uc -I $mofpath -n $namespace $mymofs && + $CIMMOF -uc -n root/PG_Interop $_REGFILENAME + else + echo "Failed to build pegasus registration MOF." >&2 + return 1 + fi +} + +pegasus_uninstall() +{ + mymofs= + myregs= + mofmode=1 + namespace=$1 + shift + + while test x$1 != x + do + if test $1 = ":" + then + mofmode=0 + shift + continue + fi + if test $mofmode = 1 + then + mymofs="$mymofs $1" + else + myregs="$myregs $1" + fi + shift + done + + if ps -C cimserver > /dev/null 2>&1 + then + PROVIDERMODULES=`cat $myregs 2> /dev/null | grep -v '^[[:space:]]*#.*' | cut -d ' ' -f 4 | sort | uniq` + if test x"$PROVIDERMODULES" = x + then + echo Failed to read registration files >&2 + return 1 + fi + CIMPROVIDER=`pegasus_path cimprovider` + if test $? != 0 + then + echo "Error: cimprovider not found" >&2 + return 1 + fi + for pm in $PROVIDERMODULES + do + chatter "Remove provider module" $pm + $CIMPROVIDER -d -m $pm > /dev/null && + $CIMPROVIDER -r -m $pm > /dev/null + done + WBEMEXEC=`pegasus_path wbemexec` + if test $? != 0 + then + echo "Error: wbemexec not found" >&2 + return 1 + fi + CLASSES=`cat $myregs 2> /dev/null | grep -v '^[[:space:]]*#.*' | cut -d ' ' -f 1 | grep -v '^CIM_'` + + for _TEMPDIR in /var/tmp /tmp + do + if test -w $_TEMPDIR + then + _DELETE_NAME=$TEMPDIR/delete-class.mof + break + fi + done + + trap "rm -f $_DELETE_NAME" EXIT + + for cls in $CLASSES + do + chatter Delete CIM Class $cls + cat > $_DELETE_NAME < + + + + + +EOFA + for ns in `echo $namespace | sed 's?/? ?'g` + do + cat >> $_DELETE_NAME < +EOFX + done + cat >> $_DELETE_NAME < + + + + + + + +EOFE + $WBEMEXEC > /dev/null $_DELETE_NAME + done + else + echo "Sorry, cimserver must be running to deregister the providers." >&2 + return 1 + fi +} + +sfcb_transform() +{ + OUTFILE=$1 + shift + regfiles=$* + +#produce sfcb registraion + for rf in $regfiles + do + cat $rf | grep -v '^[[:space:]]*#.*' | while read CLASSNAME NAMESPACE PROVIDERNAME PROVIDERMODULE CAPS + do + chatter "Registering class" $CLASSNAME + cat >> $OUTFILE < /dev/null 2>&1 + then + # sfcb is running -- need to restart + for INITSCRIPT in /etc/rc.d/init.d/sblim-sfcb /etc/init.d/sfcb /usr/local/etc/init.d/sfcb none + do + if test -x $INITSCRIPT + then + break; + fi + done + chatter "Shutting down sfcb." + if test $INITSCRIPT = none + then + killall sfcbd + else + $INITSCRIPT stop + fi + t=0 + while ps -C sfcbd > /dev/null 2>&1 + do + sleep 1 + t=`expr $t + 1` + if test $t -gt 10 + then + echo "Timed out waiting for sfcb shutdown..." >&2 + echo "Please stop sfcb manually and rebuild the repository using sfcbrepos." >&2 + return 1 + fi + done + chatter "Rebuilding repository." + sfcbrepos -f $endian + if test $? != 0 + then + echo "Repository rebuild failed." >&2 + return 1 + fi + + if test $INITSCRIPT = none + then + echo "No init script found - you need to start sfcbd manually." >&2 + return 1 + else + chatter "Restarting sfcb." + $INITSCRIPT start + fi + else + # Not running - rebuild repository + chatter "Rebuilding repository." + sfcbrepos -f $endian + fi +} + +sfcb_install() +{ + mymofs= + myregs= + mofmode=1 + namespace=$1 + shift + + while test x$1 != x + do + if test $1 = ":" + then + mofmode=0 + shift + baseregname=`basename $1 .registration` + continue + fi + if test $mofmode = 1 + then + mymofs="$mymofs $1" + else + myregs="$myregs $1" + fi + shift + done + + for _TEMPDIR in /var/tmp /tmp + do + if test -w $_TEMPDIR + then + _REGFILENAME=$_TEMPDIR/$baseregname.reg + break + fi + done + + trap "rm -f $_REGFILENAME" EXIT + + if sfcb_transform $_REGFILENAME $myregs + then + chatter "Staging provider registration." + sfcbstage -n $namespace -r $_REGFILENAME $mymofs + if test $? != 0 + then + echo "Failed to stage provider registration." >&2 + return 1 + fi + sfcb_rebuild + else + echo "Failed to build sfcb registration file." >&2 + return 1 + fi +} + +sfcb_uninstall() +{ + mymofs= + namespace=$1 + shift + + while test x$1 != x + do + if test $1 = ":" + then + shift + baseregname=`basename $1 .registration` + break + fi + mymofs="$mymofs `basename $1`" + shift + done + + # "Unstage" MOFs and the registration file + chatter "Unstaging provider registrations." + sfcbunstage -n $namespace -r $baseregname.reg $mymofs + + # Rebuild repository + sfcb_rebuild +} + +openwbem_transform() +{ + OUTFILE=$1 + shift + moffiles=$* + + if rm -f $OUTFILE + then + for _f in $moffiles + do + sed "s/Provider *( *\"cmpi:/Provider(\"cmpi::/g" < $_f >> $OUTFILE + done + fi +} + +openwbem_repository() +{ + for p in /var/lib/openwbem /usr/local/var/openwbem + do + if test -f $p/schema.dat + then + echo $p + return 0 + fi + done + return 1 +} + +openwbem_install() +{ + CIMMOF=`which owmofc 2> /dev/null` + if test $? != 0 + then + echo "Error: cimmof not found" >&2 + return 1 + fi + + if ps -C owcimomd > /dev/null 2>&1 + then + state=active + else + CIMMOF="$CIMMOF -d `openwbem_repository`" + if test $? != 0 + then + echo "Error: OpenWBEM repository not found" >&2 + return 1 + fi + state=inactive + fi + + for _TEMPDIR in /var/tmp /tmp + do + if test -w $_TEMPDIR + then + _REGFILENAME=$_TEMPDIR/$$.mof + break + fi + done + + trap "rm -f $_REGFILENAME" EXIT + + if openwbem_transform $_REGFILENAME $* + then + chatter Registering providers with $state owcimomd + $CIMMOF $_REGFILENAME > /dev/null + else + echo "Failed to build OpenWBEM registration MOF." >&2 + return 1 + fi +} + +openwbem_uninstall() +{ + CIMMOF=`which owmofc 2> /dev/null` + if test $? != 0 + then + echo "Error: cimmof not found" >&2 + return 1 + fi + + if ps -C owcimomd > /dev/null 2>&1 + then + state=active + else + CIMMOF="$CIMMOF -d `openwbem_repository`" + if test $? != 0 + then + echo "Error: OpenWBEM repository not found" >&2 + return 1 + fi + state=inactive + fi + + for _TEMPDIR in /var/tmp /tmp + do + if test -w $_TEMPDIR + then + _REGFILENAME=$_TEMPDIR/$$.mof + break + fi + done + + trap "rm -f $_REGFILENAME" EXIT + + if openwbem_transform $_REGFILENAME $* + then + chatter Deregistering providers with $state owcimomd + $CIMMOF -r $_REGFILENAME > /dev/null + else + echo "Failed to build OpenWBEM registration MOF." >&2 + return 1 + fi +} + +cim_server() +{ + for exname in sfcbd cimserver owcimomd + do + if pegasus_path $exname > /dev/null + then + case $exname in + sfcbd) echo sfcb; return 0;; + cimserver) echo pegasus; return 0;; + owcimomd) echo openwbem; return 0;; + esac + break; + fi + done + echo unknown + return 1 +} + +usage() +{ + echo "usage: $0 [-h] [-v] [-d] [-t ] [-n ] -r regfile ... -m mof ..." +} + +chatter() +{ + if test x$verbose != x + then + echo $* + fi +} + +gb_getopt() +{ + rmode=0 + mmode=0 + options= + moffiles= + registrations= + while [ -n "$1" ] + do + case $1 in + -r) mmode=0; + rmode=1; + shift;; + -m) mmode=1; + rmode=0; + shift;; + -*) mmode=0; + rmode=0; + options="$options $1"; + shift;; + **) if [ $mmode = 1 ] + then moffiles="$moffiles $1" + elif [ $rmode = 1 ] + then registrations="$registrations -r $1" + else options="$options $1"; + fi; + shift;; + esac + done + echo $options $registrations $moffiles +} + +prepargs=`gb_getopt $*` +args=`getopt dvhX:t:r:n: $prepargs` +rc=$? + +if [ $rc = 127 ] +then + echo "warning: getopt not found ...continue without syntax check" + args=$prepargs +elif [ $rc != 0 ] +then + usage $0 + exit 1 +fi + +namespace="root/cimv2" + +set -- $args + +while [ -n "$1" ] +do + case $1 in + -h) help=1; + shift; + break;; + -v) verbose=1; + shift;; + -X) endian="-X $2"; + shift 2;; + -d) deregister=1; + shift;; + -t) cimserver=$2; + shift 2;; + -n) namespace=$2; + shift 2;; + -r) regs="$regs $2"; + shift 2;; + --) shift; + break;; + **) break;; + esac +done + +mofs=$* + +if [ "$help" = "1" ] +then + usage + echo -e "\t-h display help message" + echo -e "\t-v verbose mode" + echo -e "\t-d deregister provider and uninstall schema" + echo -e "\t-t specify cimserver type (pegasus|sfcb|openwbem|sniacimom)" + echo -e "\t-r specify registration files" + echo -e "\t-m specify schema mof files" + echo -e "\t-X create repository for alternate platform (sfcb only at the moment)." + echo -e "\t-n target namespace definition (default: root/cimv2)." + echo + echo Use this command to install schema mofs and register providers. + echo CIM Server Type is required as well as at least one registration file and one mof. + exit 0 +fi + +if test x"$mofs" = x || test x"$regs" = x +then + usage $0 + exit 1 +fi + +if test x$cimserver = x +then + cimserver=`cim_server` + if test $? = 0 + then + chatter "Autoselected CIM server type:" $cimserver + else + echo "CIM server type could not be determined, specify with -t." >&2 + exit 1 + fi +fi + +if test x$deregister = x +then + case $cimserver in + pegasus) pegasus_install $namespace $mofs ":" $regs;; + sfcb) sfcb_install $namespace $mofs ":" $regs;; + openwbem) openwbem_install $mofs ;; + sniacimom) echo sniacimom not yet supported && exit 1 ;; + **) echo "Invalid CIM Server Type " $cimserver && exit 1;; + esac +else + case $cimserver in + pegasus) pegasus_uninstall $namespace $mofs ":" $regs;; + sfcb) sfcb_uninstall $namespace $mofs ":" $regs;; + openwbem) openwbem_uninstall $mofs ;; + sniacimom) echo sniacimom not yet supported && exit 1 ;; + **) echo "Invalid CIM Server Type " $cimserver && exit 1;; + esac +fi diff --git a/src/service/util/servicedisc.sh b/src/service/util/servicedisc.sh new file mode 100755 index 0000000..6d6fbb7 --- /dev/null +++ b/src/service/util/servicedisc.sh @@ -0,0 +1,45 @@ +# +# servicedisc.sh +# +# Copyright (C) 2012 Red Hat, Inc. All rights reserved. +# +# 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, see . +# +# Red Hat Author(s): Vitezslav Crhonek +# + +# path to systemd service directory +SYSTEMD_SDIR=/lib/systemd/system +# path to sysv service initscript directory +SYSV_SDIR=/etc/rc.d/init.d + +if [ -d $SYSTEMD_SDIR ]; +then + for i in $SYSTEMD_SDIR/*.service; + do + SFILE=${i#$SYSTEMD_SDIR/} + echo ${SFILE%.service} + done + exit 0 +elif [ -d $SYSV_SDIR ]; +then + for i in $SYSV_SDIR/*; + do + echo ${i#$SYSV_SDIR/} + done + exit 0 +fi + +# unsupported init system +exit 1 diff --git a/src/service/util/serviceutil.c b/src/service/util/serviceutil.c new file mode 100644 index 0000000..829d0ec --- /dev/null +++ b/src/service/util/serviceutil.c @@ -0,0 +1,262 @@ +/* + * serviceutil.c + * + * Copyright (C) 2012 Red Hat, Inc. All rights reserved. + * + * 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, see . + * + * Based on syslogserviceutil.c from sblim-cmpi-syslog written by + * R Sharada , Copyright (c) IBM Corp. 2003, 2009 + * + * Red Hat Author(s): Vitezslav Crhonek + * + */ + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include + +#include "serviceutil.h" + +#define OPERATION_BUFSIZE 300 +#define STATUS_BUFSIZE 2000 +#define MAX_SLIST_CNT 1000 + +/* FIXME don't use tmpnam function */ + +char *suscript = "serviceutil.sh"; +char *sdscript = "servicedisc.sh"; + +typedef struct { + FILE *fp; + char name[L_tmpnam]; + FILE *fp2; + char name2[L_tmpnam]; +} Control; + +void +Service_Free_SList(SList *slist) +{ + int i; + + if (slist == NULL) + return; + + for(i = 0; i < slist->cnt; i++) + free(slist->name[i]); + free(slist->name); + free(slist); + + return; +} + +SList * +Service_Find_All(void) +{ + char svname[256]; + char cmdbuffer[STATUS_BUFSIZE]; + Control *cc = malloc(sizeof(Control)); + SList *slist; + + if (cc && tmpnam(cc->name)) + { + snprintf(cmdbuffer, STATUS_BUFSIZE, "%s > %s", sdscript, cc->name); + if (system(cmdbuffer) == 0) + cc->fp = fopen(cc->name, "r"); + else + { + free(cc); + cc=NULL; + return NULL; + } + slist = malloc(sizeof(SList)); + slist->name = malloc(MAX_SLIST_CNT * sizeof(char *)); + slist->cnt = 0; + while (fgets(svname, sizeof(svname), cc->fp) != NULL) + { + slist->name[slist->cnt] = strndup(svname, strlen(svname) - 1); + slist->cnt++; + } + return slist; + } + else + { + return NULL; + } +} + +void * +Service_Begin_Enum(const char *service) +{ + char cmdbuffer[STATUS_BUFSIZE]; + Control *cc = malloc(sizeof(Control)); + + memset(&cmdbuffer, '\0', sizeof(cmdbuffer)); + + if (cc && tmpnam(cc->name) && tmpnam(cc->name2)) + { + snprintf(cmdbuffer, STATUS_BUFSIZE, "%s status %s > %s", suscript, service, cc->name); + if (system(cmdbuffer) == 0) + { + cc->fp = fopen(cc->name, "r"); + snprintf(cmdbuffer, STATUS_BUFSIZE, "%s is-enabled %s > %s", suscript, service, cc->name2); + if (system(cmdbuffer) == 0) + { + cc->fp2 = fopen(cc->name2, "r"); + } + else + { + free(cc); + cc=NULL; + } + } + else + { + free(cc); + cc=NULL; + } + } + + return cc; +} + +int +Service_Next_Enum(void *handle, Service* svc, const char *service) +{ + char result[2000]; + char svname[256]; + int pid = 0; + Control *cc = (Control *) handle; + int state = 0, ret = 0; + + memset(&result, '\0', sizeof(result)); + memset(&svname, '\0', sizeof(svname)); + + if (cc && svc) + { + svc->svEnabledDefault = 5; + while (fgets(result, sizeof(result), cc->fp) != NULL) + { + if (strncmp(result, "stopped", 7) == 0) + { + svc->pid = 0; + ret = 1; + } + else + { + state = sscanf(result,"%d %s", &pid, svname); + svc->pid = pid; + if (state) ret = 1; + } + } + svc->svName = strdup(service); + + while (fgets(result, sizeof(result), cc->fp2) != NULL) + { + if (strncmp(result, "enabled", 7) == 0) + svc->svEnabledDefault = 2; + if (strncmp(result, "disabled", 8) == 0) + svc->svEnabledDefault = 3; + } + } + + if (svc) + { + if (svc->pid) + { + svc->svStarted = 1; + svc->svStatus = strdup("OK"); + } + else + { + svc->svStarted = 0; + svc->svStatus = strdup("Stopped"); + } + } + + return ret; +} + +void +Service_End_Enum(void *handle) +{ + Control *cc = (Control *) handle; + + if (cc) { + fclose(cc->fp); + fclose(cc->fp2); + remove(cc->name); + remove(cc->name2); + free(cc); + } +} + +int +Service_Operation(const char *service, const char *method, char *result, int resultlen) +{ + char cmdbuffer[OPERATION_BUFSIZE]; + FILE *fcmdout = NULL; + char *op = NULL; + char *cmdout; + int fd; + + memset(&cmdbuffer, '\0', sizeof(cmdbuffer)); + memset(&cmdout, '\0', sizeof(cmdout)); + asprintf(&cmdout, "%s", "/tmp/Service_OperationXXXXXX"); + + if (!strcasecmp(method, "startservice")) + op="start"; + else if (!strcasecmp(method, "stopservice")) + op="stop"; + else if (!strcasecmp(method, "reloadservice")) + op="reload"; + else if (!strcasecmp(method, "restartservice")) + op="restart"; + else if (!strcasecmp(method, "tryrestartservice")) + op="try-restart"; + else if (!strcasecmp(method, "condrestartservice")) + op="condrestart"; + else if (!strcasecmp(method, "reloadorrestartservice")) + op="reload-or-restart"; + else if (!strcasecmp(method, "reloadortryrestartservice")) + op="reload-or-try-restart"; + else if (!strcasecmp(method, "turnserviceon")) + op="enable"; + else if (!strcasecmp(method, "turnserviceoff")) + op="disable"; + else + return -1; + + if (op && ((fd = mkstemp(cmdout)) != -1)) + { + snprintf(cmdbuffer, OPERATION_BUFSIZE, "%s %s %s > %s", suscript, op, service, cmdout); + if (system(cmdbuffer) == 0) + { + /* we got some output? */ + if ((fcmdout = fopen(cmdout, "r")) && fgets(result, resultlen, fcmdout)) + { + fclose(fcmdout); + } + close(fd); + return 0; + } + } + + return 1; +} diff --git a/src/service/util/serviceutil.h b/src/service/util/serviceutil.h new file mode 100644 index 0000000..a4a9d11 --- /dev/null +++ b/src/service/util/serviceutil.h @@ -0,0 +1,67 @@ +/* + * serviceutil.sh + * + * Copyright (C) 2012 Red Hat, Inc. All rights reserved. + * + * 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, see . + * + * Based on syslogserviceutil.h from sblim-cmpi-syslog written by + * R Sharada , Copyright (c) IBM Corp. 2003, 2009 + * + * Red Hat Author(s): Vitezslav Crhonek + * + */ + +#ifndef SERVICEUTIL_H +#define SERVICEUTIL_H + +#include + +#ifdef DEBUG +#define service_debug(fd, args...) fprintf(fd, args) +#else +#define service_debug(a, b...) +#endif + +#define ARRAY_SIZE(name) (sizeof(name) / sizeof(name[0])) + +struct _Service { + char *svSystemCCname; + char *svSystemname; + char *svCCname; + char *svName; /* "rsyslog", "httpd", ... */ + char *svStatus; /* "Stopped", "OK" */ + int *svEnabledDefault; /* 5 - "Not Applicable", 2 - "Enabled", 3 - "Disabled" */ + int svStarted; /* 0, 1 */ + int pid; /* PID */ +}; + +struct _SList { + char **name; + int cnt; +}; + +typedef struct _Service Service; +typedef struct _SList SList; + +void Service_Free_SList(SList *slist); +SList *Service_Find_All(void); + +void *Service_Begin_Enum(const char *service); +int Service_Next_Enum(void *handle, Service* svc, const char *service); +void Service_End_Enum(void *handle); + +int Service_Operation(const char *service, const char *method, char *result, int resultlen); + +#endif diff --git a/src/service/util/serviceutil.sh b/src/service/util/serviceutil.sh new file mode 100755 index 0000000..c4d9efd --- /dev/null +++ b/src/service/util/serviceutil.sh @@ -0,0 +1,90 @@ +# +# serviceutil.sh +# +# Copyright (C) 2012 Red Hat, Inc. All rights reserved. +# +# 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, see . +# +# Based on syslog-service.sh from sblim-cmpi-syslog written by +# R Sharada , Copyright (c) IBM Corp. 2003, 2009 +# +# Red Hat Author(s): Vitezslav Crhonek +# + +# path to systemd service directory +SYSTEMD_SDIR=/lib/systemd/system +# path to sysv service initscript directory +SYSV_SDIR=/etc/rc.d/init.d +# service unit name +SUNIT_NAME=$2.service + +if [ -f $SYSTEMD_SDIR/$SUNIT_NAME ]; +then + case "$1" in + start|stop|reload|restart|try-restart|condrestart|reload-or-restart|reload-or-try-restart|enable|disable|is-enabled) + systemctl $1 $SUNIT_NAME + ;; + status) + output=`systemctl status $SUNIT_NAME` + if echo "$output" | grep Active: | grep inactive > /dev/null 2>&1; then + echo "stopped" + elif echo "$output" | grep Active: | grep failed > /dev/null 2>&1; then + echo "stopped" # TODO - should be failed and propagated to the state property + else + pid=`echo "$output" | sed -n -e 's/^[ \t]\+Main PID:[ \t]\+\([0-9]\+\).*/\1/p'` + echo "$pid $2" + fi + ;; + *) + echo "Unsupported method!" + exit 1 + esac +elif [ -f $SYSV_SDIR/$2 ]; +then + case "$1" in + start|stop|reload|restart|condrestart) + $SYSV_SDIR/$2 $1 + ;; + status) + output=`$SYSV_SDIR/$2 status` + if echo "$output" | grep "stopped" > /dev/null 2>&1; then + echo "stopped" + elif echo "$output" | grep "not running" > /dev/null 2>&1; then + echo "stopped" + elif echo "$output" | grep "running" > /dev/null 2>&1; then + echo "$output" | awk '{print $3 " " $1}' | tr -d '=)=' + fi + ;; + is-enabled) + CUR_RLVL=`runlevel | cut -d " " -f 2` + output=`chkconfig --list tog-pegasus | cut -f $((CUR_RLVL + 2))` + if echo "$output" | grep "on" > /dev/null 2>&1; then + echo "enabled" + elif echo "$output" | grep "off" > /dev/null 2>&1; then + echo "disabled" + fi + ;; + enable) + chkconfig $2 on + ;; + disable) + chkconfig $2 off + ;; + *) + echo "Unsupported method!" + exit 1 + esac +fi + +exit 0 -- cgit