summaryrefslogtreecommitdiffstats
path: root/src/software/providers
diff options
context:
space:
mode:
Diffstat (limited to 'src/software/providers')
l---------src/software/providers1
-rw-r--r--src/software/providers/LMI_SoftwareFileCheck.py413
-rw-r--r--src/software/providers/LMI_SoftwareInstalledPackage.py509
-rw-r--r--src/software/providers/LMI_SoftwarePackage.py522
-rw-r--r--src/software/providers/LMI_SoftwarePackageChecks.py311
-rw-r--r--src/software/providers/__init__.py20
-rw-r--r--src/software/providers/util/__init__.py20
-rw-r--r--src/software/providers/util/common.py809
-rw-r--r--src/software/providers/util/singletonmixin.py508
9 files changed, 1 insertions, 3112 deletions
diff --git a/src/software/providers b/src/software/providers
new file mode 120000
index 0000000..6105f87
--- /dev/null
+++ b/src/software/providers
@@ -0,0 +1 @@
+openlmi/software \ No newline at end of file
diff --git a/src/software/providers/LMI_SoftwareFileCheck.py b/src/software/providers/LMI_SoftwareFileCheck.py
deleted file mode 100644
index c667352..0000000
--- a/src/software/providers/LMI_SoftwareFileCheck.py
+++ /dev/null
@@ -1,413 +0,0 @@
-# Software Management Providers
-#
-# Copyright (C) 2012 Red Hat, Inc. All rights reserved.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-#
-# Authors: Michal Minar <miminar@redhat.com>
-#
-
-"""Python Provider for LMI_SoftwareFileCheck
-
-Instruments the CIM class LMI_SoftwareFileCheck
-
-"""
-
-import pywbem
-from pywbem.cim_provider2 import CIMProvider2
-from openlmi.software.util.common import *
-
-filecheck2model = SoftwareFileCheck.filecheck_wrapper(
- 'root/cimv2', 'LMI_SoftwareFileCheck')
-
-class LMI_SoftwareFileCheck(CIMProvider2):
- """Instrument the CIM class LMI_SoftwareFileCheck
-
- Identifies a file contained by RPM package. It's located in directory
- identified in FileName. The Invoke methods check for file existence
- and whether its attributes match those given by RPM package.
-
- """
-
- def __init__ (self, env):
- logger = env.get_logger()
- logger.log_debug('Initializing provider %s from %s' \
- % (self.__class__.__name__, __file__))
-
-
- def get_instance(self, env, model):
- """Return an instance.
-
- Keyword arguments:
- env -- Provider Environment (pycimmb.ProviderEnvironment)
- model -- A template of the pywbem.CIMInstance to be returned. The
- key properties are set on this instance to correspond to the
- instanceName that was requested. The properties of the model
- are already filtered according to the PropertyList from the
- request. Only properties present in the model need to be
- given values. If you prefer, you can set all of the
- values, and the instance will be filtered for you.
-
- Possible Errors:
- CIM_ERR_ACCESS_DENIED
- CIM_ERR_INVALID_PARAMETER (including missing, duplicate, unrecognized
- or otherwise incorrect parameters)
- CIM_ERR_NOT_FOUND (the CIM Class does exist, but the requested CIM
- Instance does not exist in the specified namespace)
- CIM_ERR_FAILED (some other unspecified error occurred)
-
- """
-
- logger = env.get_logger()
- logger.log_debug('Entering %s.get_instance()' \
- % self.__class__.__name__)
-
- with YumDB.getInstance(env) as yb:
- vpkg = SoftwareFileCheck.object_path2yumcheck(env, model.path)
- pkg = vpkg.po
- fi = pkg.hdr.fiFromHeader()
- return filecheck2model(vpkg, model['Name'], env, False)
-
- def enum_instances(self, env, model, keys_only):
- """Enumerate instances.
-
- The WBEM operations EnumerateInstances and EnumerateInstanceNames
- are both mapped to this method.
- This method is a python generator
-
- Keyword arguments:
- env -- Provider Environment (pycimmb.ProviderEnvironment)
- model -- A template of the pywbem.CIMInstances to be generated.
- The properties of the model are already filtered according to
- the PropertyList from the request. Only properties present in
- the model need to be given values. If you prefer, you can
- always set all of the values, and the instance will be filtered
- for you.
- keys_only -- A boolean. True if only the key properties should be
- set on the generated instances.
-
- Possible Errors:
- CIM_ERR_FAILED (some other unspecified error occurred)
-
- """
-
- logger = env.get_logger()
- logger.log_debug('Entering %s.enum_instances()' \
- % self.__class__.__name__)
-
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_SUPPORTED) # Remove to implement
-
- def set_instance(self, env, instance, modify_existing):
- """Return a newly created or modified instance.
-
- Keyword arguments:
- env -- Provider Environment (pycimmb.ProviderEnvironment)
- instance -- The new pywbem.CIMInstance. If modifying an existing
- instance, the properties on this instance have been filtered by
- the PropertyList from the request.
- modify_existing -- True if ModifyInstance, False if CreateInstance
-
- Return the new instance. The keys must be set on the new instance.
-
- Possible Errors:
- CIM_ERR_ACCESS_DENIED
- CIM_ERR_NOT_SUPPORTED
- CIM_ERR_INVALID_PARAMETER (including missing, duplicate, unrecognized
- or otherwise incorrect parameters)
- CIM_ERR_ALREADY_EXISTS (the CIM Instance already exists -- only
- valid if modify_existing is False, indicating that the operation
- was CreateInstance)
- CIM_ERR_NOT_FOUND (the CIM Instance does not exist -- only valid
- if modify_existing is True, indicating that the operation
- was ModifyInstance)
- CIM_ERR_FAILED (some other unspecified error occurred)
-
- """
-
- logger = env.get_logger()
- logger.log_debug('Entering %s.set_instance()' \
- % self.__class__.__name__)
- # TODO create or modify the instance
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_SUPPORTED) # Remove to implement
- return instance
-
- def delete_instance(self, env, instance_name):
- """Delete an instance.
-
- Keyword arguments:
- env -- Provider Environment (pycimmb.ProviderEnvironment)
- instance_name -- A pywbem.CIMInstanceName specifying the instance
- to delete.
-
- Possible Errors:
- CIM_ERR_ACCESS_DENIED
- CIM_ERR_NOT_SUPPORTED
- CIM_ERR_INVALID_NAMESPACE
- CIM_ERR_INVALID_PARAMETER (including missing, duplicate, unrecognized
- or otherwise incorrect parameters)
- CIM_ERR_INVALID_CLASS (the CIM Class does not exist in the specified
- namespace)
- CIM_ERR_NOT_FOUND (the CIM Class does exist, but the requested CIM
- Instance does not exist in the specified namespace)
- CIM_ERR_FAILED (some other unspecified error occurred)
-
- """
-
- logger = env.get_logger()
- logger.log_debug('Entering %s.delete_instance()' \
- % self.__class__.__name__)
-
- # TODO delete the resource
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_SUPPORTED) # Remove to implement
-
- def cim_method_invoke(self, env, object_name):
- """Implements LMI_SoftwareFileCheck.Invoke()
-
- The Invoke method evaluates this Check. The details of the
- evaluation are described by the specific subclasses of CIM_Check.
- When the SoftwareElement being checked is already installed, the
- CIM_InstalledSoftwareElement association identifies the
- CIM_ComputerSystem in whose context the Invoke is executed. If
- this association is not in place, then the InvokeOnSystem method
- should be used - since it identifies the TargetSystem as an input
- parameter of the method. \nThe results of the Invoke method are
- based on the return value. A zero is returned if the condition is
- satisfied. A one is returned if the method is not supported. Any
- other value indicates the condition is not satisfied.
-
- Keyword arguments:
- env -- Provider Environment (pycimmb.ProviderEnvironment)
- object_name -- A pywbem.CIMInstanceName or pywbem.CIMCLassName
- specifying the object on which the method Invoke()
- should be invoked.
-
- Returns a two-tuple containing the return value (type pywbem.Uint32)
- and a list of CIMParameter objects representing the output parameters
-
- Output parameters: none
-
- Possible Errors:
- CIM_ERR_ACCESS_DENIED
- CIM_ERR_INVALID_PARAMETER (including missing, duplicate,
- unrecognized or otherwise incorrect parameters)
- CIM_ERR_NOT_FOUND (the target CIM Class or instance does not
- exist in the specified namespace)
- CIM_ERR_METHOD_NOT_AVAILABLE (the CIM Server is unable to honor
- the invocation request)
- CIM_ERR_FAILED (some other unspecified error occurred)
-
- """
-
- logger = env.get_logger()
- logger.log_debug('Entering %s.cim_method_invoke()' \
- % self.__class__.__name__)
-
- with YumDB.getInstance(env) as yb:
- vpkg = SoftwareFileCheck.object_path2yumcheck(env, object_name)
- fc = SoftwareFileCheck.test_file(env,
- SoftwareFileCheck.pkg_checksum_type(vpkg.po),
- vpkg._files[object_name["Name"]])
- out_params = []
- ret = 0 if SoftwareFileCheck.filecheck_passed(fc) else 2
- return (pywbem.Uint32(ret), out_params)
-
- def cim_method_invokeonsystem(self, env, object_name,
- param_targetsystem=None):
- """Implements LMI_SoftwareFileCheck.InvokeOnSystem()
-
- The InvokeOnSystem method evaluates this Check. The details of the
- evaluation are described by the specific subclasses of CIM_Check.
- The method\'s TargetSystem input parameter specifies the
- ComputerSystem in whose context the method is invoked. \nThe
- results of the InvokeOnSystem method are based on the return
- value. A zero is returned if the condition is satisfied. A one is
- returned if the method is not supported. Any other value indicates
- the condition is not satisfied.
-
- Keyword arguments:
- env -- Provider Environment (pycimmb.ProviderEnvironment)
- object_name -- A pywbem.CIMInstanceName or pywbem.CIMCLassName
- specifying the object on which the method InvokeOnSystem()
- should be invoked.
- param_targetsystem -- The input parameter TargetSystem (
- type REF (pywbem.CIMInstanceName(
- classname='CIM_ComputerSystem', ...))
- Reference to ComputerSystem in whose context the method is to
- be invoked.
-
-
- Returns a two-tuple containing the return value (type pywbem.Uint32)
- and a list of CIMParameter objects representing the output parameters
-
- Output parameters: none
-
- Possible Errors:
- CIM_ERR_ACCESS_DENIED
- CIM_ERR_INVALID_PARAMETER (including missing, duplicate,
- unrecognized or otherwise incorrect parameters)
- CIM_ERR_NOT_FOUND (the target CIM Class or instance does not
- exist in the specified namespace)
- CIM_ERR_METHOD_NOT_AVAILABLE (the CIM Server is unable to honor
- the invocation request)
- CIM_ERR_FAILED (some other unspecified error occurred)
-
- """
-
- logger = env.get_logger()
- logger.log_debug('Entering %s.cim_method_invokeonsystem()' \
- % self.__class__.__name__)
-
- # TODO do something
- raise pywbem.CIMError(pywbem.CIM_ERR_METHOD_NOT_AVAILABLE) # Remove to implemented
- out_params = []
- #rval = # TODO (type pywbem.Uint32)
- return (rval, out_params)
-
- class Values(object):
- class TargetOperatingSystem(object):
- Unknown = pywbem.Uint16(0)
- Other = pywbem.Uint16(1)
- MACOS = pywbem.Uint16(2)
- ATTUNIX = pywbem.Uint16(3)
- DGUX = pywbem.Uint16(4)
- DECNT = pywbem.Uint16(5)
- Tru64_UNIX = pywbem.Uint16(6)
- OpenVMS = pywbem.Uint16(7)
- HPUX = pywbem.Uint16(8)
- AIX = pywbem.Uint16(9)
- MVS = pywbem.Uint16(10)
- OS400 = pywbem.Uint16(11)
- OS_2 = pywbem.Uint16(12)
- JavaVM = pywbem.Uint16(13)
- MSDOS = pywbem.Uint16(14)
- WIN3x = pywbem.Uint16(15)
- WIN95 = pywbem.Uint16(16)
- WIN98 = pywbem.Uint16(17)
- WINNT = pywbem.Uint16(18)
- WINCE = pywbem.Uint16(19)
- NCR3000 = pywbem.Uint16(20)
- NetWare = pywbem.Uint16(21)
- OSF = pywbem.Uint16(22)
- DC_OS = pywbem.Uint16(23)
- Reliant_UNIX = pywbem.Uint16(24)
- SCO_UnixWare = pywbem.Uint16(25)
- SCO_OpenServer = pywbem.Uint16(26)
- Sequent = pywbem.Uint16(27)
- IRIX = pywbem.Uint16(28)
- Solaris = pywbem.Uint16(29)
- SunOS = pywbem.Uint16(30)
- U6000 = pywbem.Uint16(31)
- ASERIES = pywbem.Uint16(32)
- HP_NonStop_OS = pywbem.Uint16(33)
- HP_NonStop_OSS = pywbem.Uint16(34)
- BS2000 = pywbem.Uint16(35)
- LINUX = pywbem.Uint16(36)
- Lynx = pywbem.Uint16(37)
- XENIX = pywbem.Uint16(38)
- VM = pywbem.Uint16(39)
- Interactive_UNIX = pywbem.Uint16(40)
- BSDUNIX = pywbem.Uint16(41)
- FreeBSD = pywbem.Uint16(42)
- NetBSD = pywbem.Uint16(43)
- GNU_Hurd = pywbem.Uint16(44)
- OS9 = pywbem.Uint16(45)
- MACH_Kernel = pywbem.Uint16(46)
- Inferno = pywbem.Uint16(47)
- QNX = pywbem.Uint16(48)
- EPOC = pywbem.Uint16(49)
- IxWorks = pywbem.Uint16(50)
- VxWorks = pywbem.Uint16(51)
- MiNT = pywbem.Uint16(52)
- BeOS = pywbem.Uint16(53)
- HP_MPE = pywbem.Uint16(54)
- NextStep = pywbem.Uint16(55)
- PalmPilot = pywbem.Uint16(56)
- Rhapsody = pywbem.Uint16(57)
- Windows_2000 = pywbem.Uint16(58)
- Dedicated = pywbem.Uint16(59)
- OS_390 = pywbem.Uint16(60)
- VSE = pywbem.Uint16(61)
- TPF = pywbem.Uint16(62)
- Windows__R__Me = pywbem.Uint16(63)
- Caldera_Open_UNIX = pywbem.Uint16(64)
- OpenBSD = pywbem.Uint16(65)
- Not_Applicable = pywbem.Uint16(66)
- Windows_XP = pywbem.Uint16(67)
- z_OS = pywbem.Uint16(68)
- Microsoft_Windows_Server_2003 = pywbem.Uint16(69)
- Microsoft_Windows_Server_2003_64_Bit = pywbem.Uint16(70)
- Windows_XP_64_Bit = pywbem.Uint16(71)
- Windows_XP_Embedded = pywbem.Uint16(72)
- Windows_Vista = pywbem.Uint16(73)
- Windows_Vista_64_Bit = pywbem.Uint16(74)
- Windows_Embedded_for_Point_of_Service = pywbem.Uint16(75)
- Microsoft_Windows_Server_2008 = pywbem.Uint16(76)
- Microsoft_Windows_Server_2008_64_Bit = pywbem.Uint16(77)
- FreeBSD_64_Bit = pywbem.Uint16(78)
- RedHat_Enterprise_Linux = pywbem.Uint16(79)
- RedHat_Enterprise_Linux_64_Bit = pywbem.Uint16(80)
- Solaris_64_Bit = pywbem.Uint16(81)
- SUSE = pywbem.Uint16(82)
- SUSE_64_Bit = pywbem.Uint16(83)
- SLES = pywbem.Uint16(84)
- SLES_64_Bit = pywbem.Uint16(85)
- Novell_OES = pywbem.Uint16(86)
- Novell_Linux_Desktop = pywbem.Uint16(87)
- Sun_Java_Desktop_System = pywbem.Uint16(88)
- Mandriva = pywbem.Uint16(89)
- Mandriva_64_Bit = pywbem.Uint16(90)
- TurboLinux = pywbem.Uint16(91)
- TurboLinux_64_Bit = pywbem.Uint16(92)
- Ubuntu = pywbem.Uint16(93)
- Ubuntu_64_Bit = pywbem.Uint16(94)
- Debian = pywbem.Uint16(95)
- Debian_64_Bit = pywbem.Uint16(96)
- Linux_2_4_x = pywbem.Uint16(97)
- Linux_2_4_x_64_Bit = pywbem.Uint16(98)
- Linux_2_6_x = pywbem.Uint16(99)
- Linux_2_6_x_64_Bit = pywbem.Uint16(100)
- Linux_64_Bit = pywbem.Uint16(101)
- Other_64_Bit = pywbem.Uint16(102)
- Microsoft_Windows_Server_2008_R2 = pywbem.Uint16(103)
- VMware_ESXi = pywbem.Uint16(104)
- Microsoft_Windows_7 = pywbem.Uint16(105)
- CentOS_32_bit = pywbem.Uint16(106)
- CentOS_64_bit = pywbem.Uint16(107)
- Oracle_Enterprise_Linux_32_bit = pywbem.Uint16(108)
- Oracle_Enterprise_Linux_64_bit = pywbem.Uint16(109)
- eComStation_32_bitx = pywbem.Uint16(110)
-
- class SoftwareElementState(object):
- Deployable = pywbem.Uint16(0)
- Installable = pywbem.Uint16(1)
- Executable = pywbem.Uint16(2)
- Running = pywbem.Uint16(3)
-
- class FileType(object):
- Unknown = pywbem.Uint16(0)
- File = pywbem.Uint16(1)
- Directory = pywbem.Uint16(2)
- Symlink = pywbem.Uint16(3)
- FIFO = pywbem.Uint16(4)
- Character_Device = pywbem.Uint16(5)
- Block_Device = pywbem.Uint16(6)
-
-## end of class LMI_SoftwareFileCheckProvider
-
-## get_providers() for associating CIM Class Name to python provider class name
-
-def get_providers(env):
- lmi_softwarefilecheck_prov = LMI_SoftwareFileCheck(env)
- return {'LMI_SoftwareFileCheck': lmi_softwarefilecheck_prov}
diff --git a/src/software/providers/LMI_SoftwareInstalledPackage.py b/src/software/providers/LMI_SoftwareInstalledPackage.py
deleted file mode 100644
index 51d15b6..0000000
--- a/src/software/providers/LMI_SoftwareInstalledPackage.py
+++ /dev/null
@@ -1,509 +0,0 @@
-# -*- encoding: utf-8 -*-
-# Software Management Providers
-#
-# Copyright (C) 2012 Red Hat, Inc. All rights reserved.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-#
-# Authors: Michal Minar <miminar@redhat.com>
-#
-
-"""Python Provider for LMI_SoftwareInstalledPackage
-
-Instruments the CIM class LMI_SoftwareInstalledPackage
-
-"""
-
-import itertools
-import pywbem
-from pywbem.cim_provider2 import CIMProvider2
-from openlmi.software.LMI_SoftwarePackage import pkg2model, LMI_SoftwarePackage
-from openlmi.software.LMI_SoftwareFileCheck import filecheck2model
-from openlmi.software.util.common import *
-
-class LMI_SoftwareInstalledPackage(CIMProvider2):
- """Instrument the CIM class LMI_SoftwareInstalledPackage
-
- The InstalledSoftwareElement association allows the identification of
- the ComputerSystem on which a particular SoftwareElement is installed.
-
- """
-
- def __init__ (self, env):
- logger = env.get_logger()
- logger.log_debug('Initializing provider %s from %s' \
- % (self.__class__.__name__, __file__))
-
- def get_instance(self, env, model):
- """Return an instance.
-
- Keyword arguments:
- env -- Provider Environment (pycimmb.ProviderEnvironment)
- model -- A template of the pywbem.CIMInstance to be returned. The
- key properties are set on this instance to correspond to the
- instanceName that was requested. The properties of the model
- are already filtered according to the PropertyList from the
- request. Only properties present in the model need to be
- given values. If you prefer, you can set all of the
- values, and the instance will be filtered for you.
-
- Possible Errors:
- CIM_ERR_ACCESS_DENIED
- CIM_ERR_INVALID_PARAMETER (including missing, duplicate, unrecognized
- or otherwise incorrect parameters)
- CIM_ERR_NOT_FOUND (the CIM Class does exist, but the requested CIM
- Instance does not exist in the specified namespace)
- CIM_ERR_FAILED (some other unspecified error occurred)
-
- """
-
- logger = env.get_logger()
- logger.log_debug('Entering %s.get_instance()' \
- % self.__class__.__name__)
-
- if not "Software" in model:
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "Missing Software property.")
- if not "System" in model:
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "Missing System property.")
- check_computer_system_op(env, model['System'])
- with YumDB.getInstance(env):
- pkg = SoftwarePackage.object_path2pkg(env, model['Software'])
- model['Software'] = pkg2model(env, pkg, True)
- return model
-
- def enum_instances(self, env, model, keys_only):
- """Enumerate instances.
-
- The WBEM operations EnumerateInstances and EnumerateInstanceNames
- are both mapped to this method.
- This method is a python generator
-
- Keyword arguments:
- env -- Provider Environment (pycimmb.ProviderEnvironment)
- model -- A template of the pywbem.CIMInstances to be generated.
- The properties of the model are already filtered according to
- the PropertyList from the request. Only properties present in
- the model need to be given values. If you prefer, you can
- always set all of the values, and the instance will be filtered
- for you.
- keys_only -- A boolean. True if only the key properties should be
- set on the generated instances.
-
- Possible Errors:
- CIM_ERR_FAILED (some other unspecified error occurred)
-
- """
-
- logger = env.get_logger()
- logger.log_debug('Entering %s.enum_instances()' \
- % self.__class__.__name__)
-
- # Prime model.path with knowledge of the keys, so key values on
- # the CIMInstanceName (model.path) will automatically be set when
- # we set property values on the model.
- model.path.update({'System': None, 'Software': None})
-
- yum_package_path = pywbem.CIMInstanceName("LMI_SoftwarePackage",
- namespace=model.path.namespace,
- host=model.path.host)
- model['System'] = get_computer_system_op()
- with YumDB.getInstance(env) as yb:
- for rpm in yb.rpmdb:
- iname = pkg2model(env, rpm, True, yum_package_path)
- model['Software'] = iname
- if keys_only:
- yield model
- else:
- try:
- yield self.get_instance(env, model)
- except pywbem.CIMError, (num, msg):
- if num not in (pywbem.CIM_ERR_NOT_FOUND,
- pywbem.CIM_ERR_ACCESS_DENIED):
- raise
-
- def set_instance(self, env, instance, modify_existing):
- """Return a newly created or modified instance.
-
- Keyword arguments:
- env -- Provider Environment (pycimmb.ProviderEnvironment)
- instance -- The new pywbem.CIMInstance. If modifying an existing
- instance, the properties on this instance have been filtered by
- the PropertyList from the request.
- modify_existing -- True if ModifyInstance, False if CreateInstance
-
- Return the new instance. The keys must be set on the new instance.
-
- Possible Errors:
- CIM_ERR_ACCESS_DENIED
- CIM_ERR_NOT_SUPPORTED
- CIM_ERR_INVALID_PARAMETER (including missing, duplicate, unrecognized
- or otherwise incorrect parameters)
- CIM_ERR_ALREADY_EXISTS (the CIM Instance already exists -- only
- valid if modify_existing is False, indicating that the operation
- was CreateInstance)
- CIM_ERR_NOT_FOUND (the CIM Instance does not exist -- only valid
- if modify_existing is True, indicating that the operation
- was ModifyInstance)
- CIM_ERR_FAILED (some other unspecified error occurred)
-
- """
-
- logger = env.get_logger()
- logger.log_debug('Entering %s.set_instance()' \
- % self.__class__.__name__)
-
- # parse and check arguments
- if modify_existing is True:
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_SUPPORTED,
- "MofifyInstance is not supported")
-
- if not "Software" in instance:
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "Missing Software property.")
- if not "System" in instance:
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "Missing System property.")
- check_computer_system_op(env, instance['System'])
-
- with YumDB.getInstance(env) as yb:
- pkg = SoftwarePackage.object_path2pkg_search(env, instance['Software'])
- if isinstance(pkg, yum.rpmsack.RPMInstalledPackage):
- raise pywbem.CIMError(pywbem.CIM_ERR_ALREADY_EXISTS,
- "Package is already installed.")
-
- logger.log_info('installing package {}'.format(pkg.nevra))
- # install
- yb.install(pkg)
- yb.buildTransaction()
- yb.processTransaction()
- logger.log_info('package installed'.format(pkg.nevra))
-
- # return instance
- pkg_iname = pkg2model(env, pkg, True)
- pkg_iname["SoftwareElementState"] = \
- LMI_SoftwarePackage.Values.SoftwareElementState.Executable
- instance["Software"] = pkg_iname
- return LMI_SoftwareInstalledPackage(env).get_instance(env, instance)
-
- def delete_instance(self, env, instance_name):
- """Delete an instance.
-
- Keyword arguments:
- env -- Provider Environment (pycimmb.ProviderEnvironment)
- instance_name -- A pywbem.CIMInstanceName specifying the instance
- to delete.
-
- Possible Errors:
- CIM_ERR_ACCESS_DENIED
- CIM_ERR_NOT_SUPPORTED
- CIM_ERR_INVALID_NAMESPACE
- CIM_ERR_INVALID_PARAMETER (including missing, duplicate, unrecognized
- or otherwise incorrect parameters)
- CIM_ERR_INVALID_CLASS (the CIM Class does not exist in the specified
- namespace)
- CIM_ERR_NOT_FOUND (the CIM Class does exist, but the requested CIM
- Instance does not exist in the specified namespace)
- CIM_ERR_FAILED (some other unspecified error occurred)
-
- """
-
- logger = env.get_logger()
- logger.log_debug('Entering %s.delete_instance()' \
- % self.__class__.__name__)
-
- if not "Software" in instance_name:
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "Missing Software property.")
- if not "System" in instance_name:
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "Missing System property.")
- check_computer_system_op(env, instance_name['System'])
- with YumDB.getInstance(env) as yb:
- pkg = SoftwarePackage.object_path2pkg(env, instance_name["Software"])
- logger.log_info('removing package "%s"' % pkg.nevra)
- yb.remove(pkg)
- yb.buildTransaction()
- yb.processTransaction()
- logger.log_info('package "%s" removed' % pkg.nevra)
-
- def references(self, env, object_name, model, result_class_name, role,
- result_role, keys_only):
- """Instrument Associations.
-
- All four association-related operations (Associators, AssociatorNames,
- References, ReferenceNames) are mapped to this method.
- This method is a python generator
-
- Keyword arguments:
- env -- Provider Environment (pycimmb.ProviderEnvironment)
- object_name -- A pywbem.CIMInstanceName that defines the source
- CIM Object whose associated Objects are to be returned.
- model -- A template pywbem.CIMInstance to serve as a model
- of the objects to be returned. Only properties present on this
- model need to be set.
- result_class_name -- If not empty, this string acts as a filter on
- the returned set of Instances by mandating that each returned
- Instances MUST represent an association between object_name
- and an Instance of a Class whose name matches this parameter
- or a subclass.
- role -- If not empty, MUST be a valid Property name. It acts as a
- filter on the returned set of Instances by mandating that each
- returned Instance MUST refer to object_name via a Property
- whose name matches the value of this parameter.
- result_role -- If not empty, MUST be a valid Property name. It acts
- as a filter on the returned set of Instances by mandating that
- each returned Instance MUST represent associations of
- object_name to other Instances, where the other Instances play
- the specified result_role in the association (i.e. the
- name of the Property in the Association Class that refers to
- the Object related to object_name MUST match the value of this
- parameter).
- keys_only -- A boolean. True if only the key properties should be
- set on the generated instances.
-
- The following diagram may be helpful in understanding the role,
- result_role, and result_class_name parameters.
- +------------------------+ +-------------------+
- | object_name.classname | | result_class_name |
- | ~~~~~~~~~~~~~~~~~~~~~ | | ~~~~~~~~~~~~~~~~~ |
- +------------------------+ +-------------------+
- | +-----------------------------------+ |
- | | [Association] model.classname | |
- | object_name | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
- +--------------+ object_name.classname REF role | |
- (CIMInstanceName) | result_class_name REF result_role +------+
- | |(CIMInstanceName)
- +-----------------------------------+
-
- Possible Errors:
- CIM_ERR_ACCESS_DENIED
- CIM_ERR_NOT_SUPPORTED
- CIM_ERR_INVALID_NAMESPACE
- CIM_ERR_INVALID_PARAMETER (including missing, duplicate, unrecognized
- or otherwise incorrect parameters)
- CIM_ERR_FAILED (some other unspecified error occurred)
-
- """
-
- logger = env.get_logger()
- logger.log_debug('Entering %s.references()' \
- % self.__class__.__name__)
- ch = env.get_cimom_handle()
-
- # If you want to get references for free, implemented in terms
- # of enum_instances, just leave the code below unaltered.
- if ch.is_subclass(object_name.namespace,
- sub=object_name.classname,
- super='CIM_ComputerSystem') or \
- ch.is_subclass(object_name.namespace,
- sub=object_name.classname,
- super='LMI_SoftwarePackage'):
- return self.simple_refs(env, object_name, model,
- result_class_name, role, result_role, keys_only)
-
- def cim_method_checkintegrity(self, env, object_name):
- """Implements LMI_SoftwarePackage.CheckIntegrity()
-
- Verify existence and attributes of files installed from RPM
- package. If all files installed exist and their attributes
- matches, method returns "Pass". "Not passed" is returned when
- arbitrary file differs in its attributes. And "Error" if
- verification could not be done.
-
- Keyword arguments:
- env -- Provider Environment (pycimmb.ProviderEnvironment)
- object_name -- A pywbem.CIMInstanceName or pywbem.CIMCLassName
- specifying the object on which the method CheckIntegrity()
- should be invoked.
-
- Returns a two-tuple containing the return value (
- type pywbem.Uint32 self.Values.CheckIntegrity)
- and a list of CIMParameter objects representing the output parameters
-
- Output parameters:
- Failed -- (type REF (pywbem.CIMInstanceName(
- classname='LMI_SoftwareFileCheck', ...))
- Array of references to LMI_SoftwareFileCheck, that did not pass
- verification.
-
- Possible Errors:
- CIM_ERR_ACCESS_DENIED
- CIM_ERR_INVALID_PARAMETER (including missing, duplicate,
- unrecognized or otherwise incorrect parameters)
- CIM_ERR_NOT_FOUND (the target CIM Class or instance does not
- exist in the specified namespace)
- CIM_ERR_METHOD_NOT_AVAILABLE (the CIM Server is unable to honor
- the invocation request)
- CIM_ERR_FAILED (some other unspecified error occurred)
-
- """
-
- logger = env.get_logger()
- logger.log_debug('Entering %s.cim_method_checkintegrity()' \
- % self.__class__.__name__)
-
- failed = []
- if not "Software" in object_name:
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "Missing Software property.")
- if not "System" in object_name:
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "Missing System property.")
- with YumDB.getInstance(env) as yb:
- pkg = SoftwarePackage.object_path2pkg(env, object_name['Software'])
- csum = SoftwareFileCheck.pkg_checksum_type(pkg)
- vpkg = yum.packages._RPMVerifyPackage(
- pkg, pkg.hdr.fiFromHeader(), csum, [], True)
- for vpf in vpkg:
- fc = SoftwareFileCheck.test_file(env, csum, vpf)
- if SoftwareFileCheck.filecheck_passed(fc): continue
- failed.append(filecheck2model(
- vpkg, vpf.filename, env, keys_only=True, fc=fc))
- out_params = [ pywbem.CIMParameter('Failed', type='reference',
- value=failed) ]
- return ( getattr(self.Values.CheckIntegrity,
- 'Pass' if len(failed) == 0 else 'Not_passed')
- , out_params )
-
- def cim_method_update(self, env, object_name,
- param_epoch=None,
- param_release=None,
- param_version=None):
- """Implements LMI_SoftwareInstalledPackage.Update()
-
- Updates the package to latest version. When any of "version" or
- "release" argument is given, install only matching available
- package. Otherwise try to update to newest package available.
-
- Keyword arguments:
- env -- Provider Environment (pycimmb.ProviderEnvironment)
- object_name -- A pywbem.CIMInstanceName or pywbem.CIMCLassName
- specifying the object on which the method Update()
- should be invoked.
- param_release -- The input parameter release (type unicode)
- Specify particular release of package to update to. Update to
- newest, when empty
- param_version -- The input parameter version (type unicode)
- Specify particular version of package to update to. Update to
- newest, when empty
-
- Returns a two-tuple containing the return value (
- type pywbem.Uint16 self.Values.Update)
- and a list of CIMParameter objects representing the output parameters
-
- Output parameters:
- Installed -- (type REF (pywbem.CIMInstanceName(
- classname='LMI_SoftwareInstalledPackage', ...))
- The reference to newly installed package, if installation was
- successful. Otherwise reference to current package.
-
- Possible Errors:
- CIM_ERR_ACCESS_DENIED
- CIM_ERR_INVALID_PARAMETER (including missing, duplicate,
- unrecognized or otherwise incorrect parameters)
- CIM_ERR_NOT_FOUND (the target CIM Class or instance does not
- exist in the specified namespace)
- CIM_ERR_METHOD_NOT_AVAILABLE (the CIM Server is unable to honor
- the invocation request)
- CIM_ERR_FAILED (some other unspecified error occurred)
-
- """
-
- logger = env.get_logger()
- logger.log_debug('Entering %s.cim_method_update()' \
- % self.__class__.__name__)
-
- if not "Software" in object_name:
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "Missing Software property.")
- if not "System" in object_name:
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "Missing System property.")
- check_computer_system_op(env, object_name['System'])
-
- with YumDB.getInstance(env) as yb:
- orig = SoftwarePackage.object_path2pkg(env, object_name['Software'])
-
- evr_str = []
- for name, param in (
- ('epoch', param_epoch),
- ('version', param_version),
- ('release', param_release)):
- evr_str.append("%s(%s)"%(name,param))
- if len(evr_str):
- evr_str = "specific "+'-'.join(evr_str)
- else:
- evr_str = "the newest version-release"
-
- logger.log_info('trying to update to %s of package \"%s\"' %
- (evr_str, object_name["Software"]["Name"]))
-
- pl = yb.doPackageLists('all', showdups=True)
- exact,_,_ = yum.packages.parsePackages(
- itertools.chain(pl.available, pl.installed),
- [orig.name])
- # NOTE: available ∩ installed = ∅
- exact = sorted(exact, key=lambda a:a.evra)
-
- try:
- pkg = [ p for p in exact
- if (not param_epoch or param_epoch == p.epoch)
- and (not param_version or param_version == p.ver)
- and (not param_release or param_release == p.rel) ] [-1]
- except IndexError:
- logger.log_error(
- 'could not find any matching available package')
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND)
- out_params = [pywbem.CIMParameter('Installed', type='reference',
- value=pkg2model(env, pkg, True))]
- if orig.evra == pkg.evra:
- logger.log_info('already up to date')
- return (self.Values.Update.Already_newest, out_params)
-
- yb.update(update_to=True,
- name=pkg.name,
- epoch=pkg.epoch,
- version=pkg.version,
- release=pkg.release)
- yb.buildTransaction()
- yb.processTransaction()
- logger.log_info('package {} updated to: {}'.format(
- orig.name, pkg.evra))
-
- out_params[0].value["SoftwareElementState"] = \
- LMI_SoftwarePackage.Values.SoftwareElementState.Executable
-
- return (self.Values.Update.Successful_installation, out_params)
-
- class Values(object):
- class Update(object):
- Already_newest = pywbem.Uint16(0)
- Successful_installation = pywbem.Uint16(1)
- Failed = pywbem.Uint16(2)
-
- class CheckIntegrity(object):
- Pass = pywbem.Uint32(0)
- Not_passed = pywbem.Uint32(1)
- Error = pywbem.Uint32(2)
-
-## end of class LMI_SoftwareInstalledPackage
-
-## get_providers() for associating CIM Class Name to python provider class name
-
-def get_providers(env):
- lmi_softwareinstalledpackage_prov = LMI_SoftwareInstalledPackage(env)
- return {'LMI_SoftwareInstalledPackage': lmi_softwareinstalledpackage_prov}
diff --git a/src/software/providers/LMI_SoftwarePackage.py b/src/software/providers/LMI_SoftwarePackage.py
deleted file mode 100644
index 2395dca..0000000
--- a/src/software/providers/LMI_SoftwarePackage.py
+++ /dev/null
@@ -1,522 +0,0 @@
-# -*- encoding: utf-8 -*-
-# Software Management Providers
-#
-# Copyright (C) 2012 Red Hat, Inc. All rights reserved.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-#
-# Authors: Michal Minar <miminar@redhat.com>
-#
-
-"""Python Provider for LMI_SoftwarePackage
-
-Instruments the CIM class LMI_SoftwarePackage
-
-"""
-
-import itertools
-import datetime
-import pywbem
-from pywbem.cim_provider2 import CIMProvider2
-from openlmi.software.util.common import *
-
-pkg2model = SoftwarePackage.pkg2model_wrapper('root/cimv2', "LMI_SoftwarePackage")
-
-class LMI_SoftwarePackage(CIMProvider2):
- """Instrument the CIM class LMI_SoftwarePackage
-
- RPM package installed on particular computer system with YUM (The
- Yellowdog Updated, Modified) package manager.
-
- """
-
- def __init__ (self, env):
- logger = env.get_logger()
- logger.log_debug('Initializing provider %s from %s' \
- % (self.__class__.__name__, __file__))
-
- def get_instance(self, env, model):
- """Return an instance.
-
- Keyword arguments:
- env -- Provider Environment (pycimmb.ProviderEnvironment)
- model -- A template of the pywbem.CIMInstance to be returned. The
- key properties are set on this instance to correspond to the
- instanceName that was requested. The properties of the model
- are already filtered according to the PropertyList from the
- request. Only properties present in the model need to be
- given values. If you prefer, you can set all of the
- values, and the instance will be filtered for you.
-
- Possible Errors:
- CIM_ERR_ACCESS_DENIED
- CIM_ERR_INVALID_PARAMETER (including missing, duplicate, unrecognized
- or otherwise incorrect parameters)
- CIM_ERR_NOT_FOUND (the CIM Class does exist, but the requested CIM
- Instance does not exist in the specified namespace)
- CIM_ERR_FAILED (some other unspecified error occurred)
-
- """
-
- logger = env.get_logger()
- logger.log_debug('Entering %s.get_instance()' \
- % self.__class__.__name__)
-
- with YumDB.getInstance(env):
- pkg = SoftwarePackage.object_path2pkg(env, model.path, 'all')
- return pkg2model(env, pkg, keys_only=False, model=model)
-
- def enum_instances(self, env, model, keys_only):
- """Enumerate instances.
-
- The WBEM operations EnumerateInstances and EnumerateInstanceNames
- are both mapped to this method.
- This method is a python generator
-
- Keyword arguments:
- env -- Provider Environment (pycimmb.ProviderEnvironment)
- model -- A template of the pywbem.CIMInstances to be generated.
- The properties of the model are already filtered according to
- the PropertyList from the request. Only properties present in
- the model need to be given values. If you prefer, you can
- always set all of the values, and the instance will be filtered
- for you.
- keys_only -- A boolean. True if only the key properties should be
- set on the generated instances.
-
- Possible Errors:
- CIM_ERR_FAILED (some other unspecified error occurred)
-
- """
-
- logger = env.get_logger()
- logger.log_debug('Entering %s.enum_instances()' \
- % self.__class__.__name__)
-
- # Prime model.path with knowledge of the keys, so key values on
- # the CIMInstanceName (model.path) will automatically be set when
- # we set property values on the model.
- model.path.update({'TargetOperatingSystem': None, 'Version': None,
- 'SoftwareElementState': None, 'Name': None,
- 'SoftwareElementID': None})
-
- with YumDB.getInstance(env) as yb:
- # get all packages
- pl = yb.doPackageLists('all', showdups=True)
- pl = itertools.chain(pl.installed, pl.available)
- # NOTE: available ∩ installed = ∅
- for pkg in sorted(pl, key=lambda a:a.evra):
- yield pkg2model(env, pkg, keys_only, model)
-
- def set_instance(self, env, instance, modify_existing):
- """Return a newly created or modified instance.
-
- Keyword arguments:
- env -- Provider Environment (pycimmb.ProviderEnvironment)
- instance -- The new pywbem.CIMInstance. If modifying an existing
- instance, the properties on this instance have been filtered by
- the PropertyList from the request.
- modify_existing -- True if ModifyInstance, False if CreateInstance
-
- Return the new instance. The keys must be set on the new instance.
-
- Possible Errors:
- CIM_ERR_ACCESS_DENIED
- CIM_ERR_NOT_SUPPORTED
- CIM_ERR_INVALID_PARAMETER (including missing, duplicate, unrecognized
- or otherwise incorrect parameters)
- CIM_ERR_ALREADY_EXISTS (the CIM Instance already exists -- only
- valid if modify_existing is False, indicating that the operation
- was CreateInstance)
- CIM_ERR_NOT_FOUND (the CIM Instance does not exist -- only valid
- if modify_existing is True, indicating that the operation
- was ModifyInstance)
- CIM_ERR_FAILED (some other unspecified error occurred)
-
- """
-
- logger = env.get_logger()
- logger.log_debug('Entering %s.set_instance()' \
- % self.__class__.__name__)
- # TODO create or modify the instance
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_SUPPORTED) # Remove to implement
- return instance
-
- def delete_instance(self, env, instance_name):
- """Delete an instance.
-
- Keyword arguments:
- env -- Provider Environment (pycimmb.ProviderEnvironment)
- instance_name -- A pywbem.CIMInstanceName specifying the instance
- to delete.
-
- Possible Errors:
- CIM_ERR_ACCESS_DENIED
- CIM_ERR_NOT_SUPPORTED
- CIM_ERR_INVALID_NAMESPACE
- CIM_ERR_INVALID_PARAMETER (including missing, duplicate, unrecognized
- or otherwise incorrect parameters)
- CIM_ERR_INVALID_CLASS (the CIM Class does not exist in the specified
- namespace)
- CIM_ERR_NOT_FOUND (the CIM Class does exist, but the requested CIM
- Instance does not exist in the specified namespace)
- CIM_ERR_FAILED (some other unspecified error occurred)
-
- """
-
- logger = env.get_logger()
- logger.log_debug('Entering %s.delete_instance()' \
- % self.__class__.__name__)
-
- # TODO delete the resource
- # Remove to implement
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_SUPPORTED)
-
- def cim_method_install(self, env, object_name):
- """Implements LMI_SoftwarePackage.Install()
-
- Will install available package.
-
- Keyword arguments:
- env -- Provider Environment (pycimmb.ProviderEnvironment)
- object_name -- A pywbem.CIMInstanceName or pywbem.CIMCLassName
- specifying the object on which the method Update()
- should be invoked.
-
- Returns a two-tuple containing the return value (type pywbem.Uint32 self.Values.Install)
- and a list of CIMParameter objects representing the output parameters
-
- Output parameters:
- Installed -- (type REF (pywbem.CIMInstanceName(
- classname='LMI_SoftwareInstalledPackage', ...))
- The reference to newly installed package, if installation was
- successful. Null otherwise.
-
- Possible Errors:
- CIM_ERR_ACCESS_DENIED
- CIM_ERR_INVALID_PARAMETER (including missing, duplicate,
- unrecognized or otherwise incorrect parameters)
- CIM_ERR_NOT_FOUND (the target CIM Class or instance does not
- exist in the specified namespace)
- CIM_ERR_METHOD_NOT_AVAILABLE (the CIM Server is unable to honor
- the invocation request)
- CIM_ERR_FAILED (some other unspecified error occurred)
-
- """
- logger = env.get_logger()
- logger.log_debug('Entering %s.cim_method_install()' \
- % self.__class__.__name__)
-
- with YumDB.getInstance(env) as yb:
- # get available packages
- pkg = SoftwarePackage.object_path2pkg_search(env, object_name)
- out_params = [ pywbem.CIMParameter('Installed', type='reference') ]
- if isinstance(pkg, yum.rpmsack.RPMInstalledPackage):
- out_params[0].value = pkg2model(env, pkg, True)
- return (self.Values.Install.Already_installed, out_params)
-
- logger.log_info('installing package {}'.format(pkg.nevra))
- # install
- yb.install(pkg)
- yb.buildTransaction()
- yb.processTransaction()
- logger.log_info('package installed'.format(pkg.nevra))
-
- out_params[0].value = pkg2model(env, pkg, True, object_name)
- out_params[0].value['SoftwareElementState'] = \
- self.Values.SoftwareElementState.Executable
- return (self.Values.Install.Successful_installation, out_params)
-
- def cim_method_remove(self, env, object_name):
- """Implements LMI_SoftwarePackage.Remove()
-
- Will uninstall installed package.
-
- Keyword arguments:
- env -- Provider Environment (pycimmb.ProviderEnvironment)
- object_name -- A pywbem.CIMInstanceName or pywbem.CIMCLassName
- specifying the object on which the method Remove()
- should be invoked.
-
- Returns a two-tuple containing the return value (type pywbem.Uint32 self.Values.Remove)
- and a list of CIMParameter objects representing the output parameters
-
- Output parameters: none
-
- Possible Errors:
- CIM_ERR_ACCESS_DENIED
- CIM_ERR_INVALID_PARAMETER (including missing, duplicate,
- unrecognized or otherwise incorrect parameters)
- CIM_ERR_NOT_FOUND (the target CIM Class or instance does not
- exist in the specified namespace)
- CIM_ERR_METHOD_NOT_AVAILABLE (the CIM Server is unable to honor
- the invocation request)
- CIM_ERR_FAILED (some other unspecified error occurred)
-
- """
-
- logger = env.get_logger()
- logger.log_debug('Entering %s.cim_method_remove()' \
- % self.__class__.__name__)
-
- with YumDB.getInstance(env) as yb:
- pkg = SoftwarePackage.object_path2pkg(env, object_name, 'all')
- if isinstance(pkg, yum.rpmsack.RPMInstalledPackage):
- logger.log_info('removing package "%s"' % pkg.nevra)
- yb.remove(pkg)
- yb.buildTransaction()
- yb.processTransaction()
- logger.log_info('package "%s" removed' % pkg.nevra)
- rval = self.Values.Remove.Successful_removal
- else:
- rval = self.Values.Remove.Not_installed
- #rval = # TODO (type pywbem.Uint32 self.Values.Remove)
- return (rval, [])
-
- class Values(object):
- class DetailedStatus(object):
- Not_Available = pywbem.Uint16(0)
- No_Additional_Information = pywbem.Uint16(1)
- Stressed = pywbem.Uint16(2)
- Predictive_Failure = pywbem.Uint16(3)
- Non_Recoverable_Error = pywbem.Uint16(4)
- Supporting_Entity_in_Error = pywbem.Uint16(5)
- # DMTF_Reserved = ..
- # Vendor_Reserved = 0x8000..
-
- class Status(object):
- OK = 'OK'
- Error = 'Error'
- Degraded = 'Degraded'
- Unknown = 'Unknown'
- Pred_Fail = 'Pred Fail'
- Starting = 'Starting'
- Stopping = 'Stopping'
- Service = 'Service'
- Stressed = 'Stressed'
- NonRecover = 'NonRecover'
- No_Contact = 'No Contact'
- Lost_Comm = 'Lost Comm'
- Stopped = 'Stopped'
-
- class HealthState(object):
- Unknown = pywbem.Uint16(0)
- OK = pywbem.Uint16(5)
- Degraded_Warning = pywbem.Uint16(10)
- Minor_failure = pywbem.Uint16(15)
- Major_failure = pywbem.Uint16(20)
- Critical_failure = pywbem.Uint16(25)
- Non_recoverable_error = pywbem.Uint16(30)
- # DMTF_Reserved = ..
- # Vendor_Specific = 32768..65535
-
- class TargetOperatingSystem(object):
- Unknown = pywbem.Uint16(0)
- Other = pywbem.Uint16(1)
- MACOS = pywbem.Uint16(2)
- ATTUNIX = pywbem.Uint16(3)
- DGUX = pywbem.Uint16(4)
- DECNT = pywbem.Uint16(5)
- Tru64_UNIX = pywbem.Uint16(6)
- OpenVMS = pywbem.Uint16(7)
- HPUX = pywbem.Uint16(8)
- AIX = pywbem.Uint16(9)
- MVS = pywbem.Uint16(10)
- OS400 = pywbem.Uint16(11)
- OS_2 = pywbem.Uint16(12)
- JavaVM = pywbem.Uint16(13)
- MSDOS = pywbem.Uint16(14)
- WIN3x = pywbem.Uint16(15)
- WIN95 = pywbem.Uint16(16)
- WIN98 = pywbem.Uint16(17)
- WINNT = pywbem.Uint16(18)
- WINCE = pywbem.Uint16(19)
- NCR3000 = pywbem.Uint16(20)
- NetWare = pywbem.Uint16(21)
- OSF = pywbem.Uint16(22)
- DC_OS = pywbem.Uint16(23)
- Reliant_UNIX = pywbem.Uint16(24)
- SCO_UnixWare = pywbem.Uint16(25)
- SCO_OpenServer = pywbem.Uint16(26)
- Sequent = pywbem.Uint16(27)
- IRIX = pywbem.Uint16(28)
- Solaris = pywbem.Uint16(29)
- SunOS = pywbem.Uint16(30)
- U6000 = pywbem.Uint16(31)
- ASERIES = pywbem.Uint16(32)
- HP_NonStop_OS = pywbem.Uint16(33)
- HP_NonStop_OSS = pywbem.Uint16(34)
- BS2000 = pywbem.Uint16(35)
- LINUX = pywbem.Uint16(36)
- Lynx = pywbem.Uint16(37)
- XENIX = pywbem.Uint16(38)
- VM = pywbem.Uint16(39)
- Interactive_UNIX = pywbem.Uint16(40)
- BSDUNIX = pywbem.Uint16(41)
- FreeBSD = pywbem.Uint16(42)
- NetBSD = pywbem.Uint16(43)
- GNU_Hurd = pywbem.Uint16(44)
- OS9 = pywbem.Uint16(45)
- MACH_Kernel = pywbem.Uint16(46)
- Inferno = pywbem.Uint16(47)
- QNX = pywbem.Uint16(48)
- EPOC = pywbem.Uint16(49)
- IxWorks = pywbem.Uint16(50)
- VxWorks = pywbem.Uint16(51)
- MiNT = pywbem.Uint16(52)
- BeOS = pywbem.Uint16(53)
- HP_MPE = pywbem.Uint16(54)
- NextStep = pywbem.Uint16(55)
- PalmPilot = pywbem.Uint16(56)
- Rhapsody = pywbem.Uint16(57)
- Windows_2000 = pywbem.Uint16(58)
- Dedicated = pywbem.Uint16(59)
- OS_390 = pywbem.Uint16(60)
- VSE = pywbem.Uint16(61)
- TPF = pywbem.Uint16(62)
- Windows__R__Me = pywbem.Uint16(63)
- Caldera_Open_UNIX = pywbem.Uint16(64)
- OpenBSD = pywbem.Uint16(65)
- Not_Applicable = pywbem.Uint16(66)
- Windows_XP = pywbem.Uint16(67)
- z_OS = pywbem.Uint16(68)
- Microsoft_Windows_Server_2003 = pywbem.Uint16(69)
- Microsoft_Windows_Server_2003_64_Bit = pywbem.Uint16(70)
- Windows_XP_64_Bit = pywbem.Uint16(71)
- Windows_XP_Embedded = pywbem.Uint16(72)
- Windows_Vista = pywbem.Uint16(73)
- Windows_Vista_64_Bit = pywbem.Uint16(74)
- Windows_Embedded_for_Point_of_Service = pywbem.Uint16(75)
- Microsoft_Windows_Server_2008 = pywbem.Uint16(76)
- Microsoft_Windows_Server_2008_64_Bit = pywbem.Uint16(77)
- FreeBSD_64_Bit = pywbem.Uint16(78)
- RedHat_Enterprise_Linux = pywbem.Uint16(79)
- RedHat_Enterprise_Linux_64_Bit = pywbem.Uint16(80)
- Solaris_64_Bit = pywbem.Uint16(81)
- SUSE = pywbem.Uint16(82)
- SUSE_64_Bit = pywbem.Uint16(83)
- SLES = pywbem.Uint16(84)
- SLES_64_Bit = pywbem.Uint16(85)
- Novell_OES = pywbem.Uint16(86)
- Novell_Linux_Desktop = pywbem.Uint16(87)
- Sun_Java_Desktop_System = pywbem.Uint16(88)
- Mandriva = pywbem.Uint16(89)
- Mandriva_64_Bit = pywbem.Uint16(90)
- TurboLinux = pywbem.Uint16(91)
- TurboLinux_64_Bit = pywbem.Uint16(92)
- Ubuntu = pywbem.Uint16(93)
- Ubuntu_64_Bit = pywbem.Uint16(94)
- Debian = pywbem.Uint16(95)
- Debian_64_Bit = pywbem.Uint16(96)
- Linux_2_4_x = pywbem.Uint16(97)
- Linux_2_4_x_64_Bit = pywbem.Uint16(98)
- Linux_2_6_x = pywbem.Uint16(99)
- Linux_2_6_x_64_Bit = pywbem.Uint16(100)
- Linux_64_Bit = pywbem.Uint16(101)
- Other_64_Bit = pywbem.Uint16(102)
- Microsoft_Windows_Server_2008_R2 = pywbem.Uint16(103)
- VMware_ESXi = pywbem.Uint16(104)
- Microsoft_Windows_7 = pywbem.Uint16(105)
- CentOS_32_bit = pywbem.Uint16(106)
- CentOS_64_bit = pywbem.Uint16(107)
- Oracle_Enterprise_Linux_32_bit = pywbem.Uint16(108)
- Oracle_Enterprise_Linux_64_bit = pywbem.Uint16(109)
- eComStation_32_bitx = pywbem.Uint16(110)
-
- class Remove(object):
- Not_installed = pywbem.Uint32(0)
- Successful_removal = pywbem.Uint32(1)
- Failed = pywbem.Uint32(2)
-
- class CommunicationStatus(object):
- Unknown = pywbem.Uint16(0)
- Not_Available = pywbem.Uint16(1)
- Communication_OK = pywbem.Uint16(2)
- Lost_Communication = pywbem.Uint16(3)
- No_Contact = pywbem.Uint16(4)
- # DMTF_Reserved = ..
- # Vendor_Reserved = 0x8000..
-
- class OperationalStatus(object):
- Unknown = pywbem.Uint16(0)
- Other = pywbem.Uint16(1)
- OK = pywbem.Uint16(2)
- Degraded = pywbem.Uint16(3)
- Stressed = pywbem.Uint16(4)
- Predictive_Failure = pywbem.Uint16(5)
- Error = pywbem.Uint16(6)
- Non_Recoverable_Error = pywbem.Uint16(7)
- Starting = pywbem.Uint16(8)
- Stopping = pywbem.Uint16(9)
- Stopped = pywbem.Uint16(10)
- In_Service = pywbem.Uint16(11)
- No_Contact = pywbem.Uint16(12)
- Lost_Communication = pywbem.Uint16(13)
- Aborted = pywbem.Uint16(14)
- Dormant = pywbem.Uint16(15)
- Supporting_Entity_in_Error = pywbem.Uint16(16)
- Completed = pywbem.Uint16(17)
- Power_Mode = pywbem.Uint16(18)
- Relocating = pywbem.Uint16(19)
- # DMTF_Reserved = ..
- # Vendor_Reserved = 0x8000..
-
- class OperatingStatus(object):
- Unknown = pywbem.Uint16(0)
- Not_Available = pywbem.Uint16(1)
- Servicing = pywbem.Uint16(2)
- Starting = pywbem.Uint16(3)
- Stopping = pywbem.Uint16(4)
- Stopped = pywbem.Uint16(5)
- Aborted = pywbem.Uint16(6)
- Dormant = pywbem.Uint16(7)
- Completed = pywbem.Uint16(8)
- Migrating = pywbem.Uint16(9)
- Emigrating = pywbem.Uint16(10)
- Immigrating = pywbem.Uint16(11)
- Snapshotting = pywbem.Uint16(12)
- Shutting_Down = pywbem.Uint16(13)
- In_Test = pywbem.Uint16(14)
- Transitioning = pywbem.Uint16(15)
- In_Service = pywbem.Uint16(16)
- # DMTF_Reserved = ..
- # Vendor_Reserved = 0x8000..
-
- class SoftwareElementState(object):
- Deployable = pywbem.Uint16(0)
- Installable = pywbem.Uint16(1)
- Executable = pywbem.Uint16(2)
- Running = pywbem.Uint16(3)
-
- class PrimaryStatus(object):
- Unknown = pywbem.Uint16(0)
- OK = pywbem.Uint16(1)
- Degraded = pywbem.Uint16(2)
- Error = pywbem.Uint16(3)
- # DMTF_Reserved = ..
- # Vendor_Reserved = 0x8000..
-
- class Install(object):
- Already_installed = pywbem.Uint32(0)
- Successful_installation = pywbem.Uint32(1)
- Failed = pywbem.Uint32(2)
-
-## end of class LMI_SoftwarePackage
-
-## get_providers() for associating CIM Class Name to python provider class name
-
-def get_providers(env):
- lmi_softwarepackage_prov = LMI_SoftwarePackage(env)
- return {'LMI_SoftwarePackage': lmi_softwarepackage_prov}
diff --git a/src/software/providers/LMI_SoftwarePackageChecks.py b/src/software/providers/LMI_SoftwarePackageChecks.py
deleted file mode 100644
index a2f798b..0000000
--- a/src/software/providers/LMI_SoftwarePackageChecks.py
+++ /dev/null
@@ -1,311 +0,0 @@
-# Software Management Providers
-#
-# Copyright (C) 2012 Red Hat, Inc. All rights reserved.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-#
-# Authors: Michal Minar <miminar@redhat.com>
-#
-
-"""Python Provider for LMI_SoftwarePackageChecks
-
-Instruments the CIM class LMI_SoftwarePackageChecks
-
-"""
-
-import pywbem
-from pywbem.cim_provider2 import CIMProvider2
-from openlmi.software.LMI_SoftwareFileCheck import filecheck2model
-from openlmi.software.LMI_SoftwarePackage import pkg2model
-from openlmi.software.util.common import *
-
-class LMI_SoftwarePackageChecks(CIMProvider2):
- """Instrument the CIM class LMI_SoftwarePackageChecks
-
- This association ties a SoftwareElement to a specific Check to validate
- its state or its movement to the next state. Note that
- SoftwareElements in a running state cannot transition to another
- state. Therefore, the value of the Phase property is restricted to 0
- ("In-State") for SoftwareElements in the running state.
-
- """
-
- def __init__ (self, env):
- logger = env.get_logger()
- logger.log_debug('Initializing provider %s from %s' \
- % (self.__class__.__name__, __file__))
-
- def get_instance(self, env, model):
- """Return an instance.
-
- Keyword arguments:
- env -- Provider Environment (pycimmb.ProviderEnvironment)
- model -- A template of the pywbem.CIMInstance to be returned. The
- key properties are set on this instance to correspond to the
- instanceName that was requested. The properties of the model
- are already filtered according to the PropertyList from the
- request. Only properties present in the model need to be
- given values. If you prefer, you can set all of the
- values, and the instance will be filtered for you.
-
- Possible Errors:
- CIM_ERR_ACCESS_DENIED
- CIM_ERR_INVALID_PARAMETER (including missing, duplicate, unrecognized
- or otherwise incorrect parameters)
- CIM_ERR_NOT_FOUND (the CIM Class does exist, but the requested CIM
- Instance does not exist in the specified namespace)
- CIM_ERR_FAILED (some other unspecified error occurred)
-
- """
-
- logger = env.get_logger()
- logger.log_debug('Entering %s.get_instance()' \
- % self.__class__.__name__)
-
- if not "Check" in model:
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "Missing Check property.")
- if not "Element" in model:
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "Missing Element property.")
- vpkg = SoftwareFileCheck.object_path2yumcheck(env, model['Check'])
- model['Check'] = filecheck2model(vpkg, model['Check']['Name'],
- env, keys_only=True)
- model['Element'] = pkg2model(env, vpkg.po, keys_only=True)
- return model
-
- def enum_instances(self, env, model, keys_only):
- """Enumerate instances.
-
- The WBEM operations EnumerateInstances and EnumerateInstanceNames
- are both mapped to this method.
- This method is a python generator
-
- Keyword arguments:
- env -- Provider Environment (pycimmb.ProviderEnvironment)
- model -- A template of the pywbem.CIMInstances to be generated.
- The properties of the model are already filtered according to
- the PropertyList from the request. Only properties present in
- the model need to be given values. If you prefer, you can
- always set all of the values, and the instance will be filtered
- for you.
- keys_only -- A boolean. True if only the key properties should be
- set on the generated instances.
-
- Possible Errors:
- CIM_ERR_FAILED (some other unspecified error occurred)
-
- """
-
- logger = env.get_logger()
- logger.log_debug('Entering %s.enum_instances()' \
- % self.__class__.__name__)
-
- # Prime model.path with knowledge of the keys, so key values on
- # the CIMInstanceName (model.path) will automatically be set when
- # we set property values on the model.
- model.path.update({'Check': None, 'Element': None})
-
- while False: # TODO more instances?
- # TODO fetch system resource
- # Key properties
- #model['Check'] = pywbem.CIMInstanceName(classname='LMI_SoftwareFileCheck', ...) # TODO (type = REF (pywbem.CIMInstanceName(classname='LMI_SoftwareFileCheck', ...))
- #model['Element'] = pywbem.CIMInstanceName(classname='LMI_SoftwarePackage', ...) # TODO (type = REF (pywbem.CIMInstanceName(classname='LMI_SoftwarePackage', ...))
- if keys_only:
- yield model
- else:
- try:
- yield self.get_instance(env, model)
- except pywbem.CIMError, (num, msg):
- if num not in (pywbem.CIM_ERR_NOT_FOUND,
- pywbem.CIM_ERR_ACCESS_DENIED):
- raise
-
- def set_instance(self, env, instance, modify_existing):
- """Return a newly created or modified instance.
-
- Keyword arguments:
- env -- Provider Environment (pycimmb.ProviderEnvironment)
- instance -- The new pywbem.CIMInstance. If modifying an existing
- instance, the properties on this instance have been filtered by
- the PropertyList from the request.
- modify_existing -- True if ModifyInstance, False if CreateInstance
-
- Return the new instance. The keys must be set on the new instance.
-
- Possible Errors:
- CIM_ERR_ACCESS_DENIED
- CIM_ERR_NOT_SUPPORTED
- CIM_ERR_INVALID_PARAMETER (including missing, duplicate, unrecognized
- or otherwise incorrect parameters)
- CIM_ERR_ALREADY_EXISTS (the CIM Instance already exists -- only
- valid if modify_existing is False, indicating that the operation
- was CreateInstance)
- CIM_ERR_NOT_FOUND (the CIM Instance does not exist -- only valid
- if modify_existing is True, indicating that the operation
- was ModifyInstance)
- CIM_ERR_FAILED (some other unspecified error occurred)
-
- """
-
- logger = env.get_logger()
- logger.log_debug('Entering %s.set_instance()' \
- % self.__class__.__name__)
- # TODO create or modify the instance
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_SUPPORTED) # Remove to implement
- return instance
-
- def delete_instance(self, env, instance_name):
- """Delete an instance.
-
- Keyword arguments:
- env -- Provider Environment (pycimmb.ProviderEnvironment)
- instance_name -- A pywbem.CIMInstanceName specifying the instance
- to delete.
-
- Possible Errors:
- CIM_ERR_ACCESS_DENIED
- CIM_ERR_NOT_SUPPORTED
- CIM_ERR_INVALID_NAMESPACE
- CIM_ERR_INVALID_PARAMETER (including missing, duplicate, unrecognized
- or otherwise incorrect parameters)
- CIM_ERR_INVALID_CLASS (the CIM Class does not exist in the specified
- namespace)
- CIM_ERR_NOT_FOUND (the CIM Class does exist, but the requested CIM
- Instance does not exist in the specified namespace)
- CIM_ERR_FAILED (some other unspecified error occurred)
-
- """
-
- logger = env.get_logger()
- logger.log_debug('Entering %s.delete_instance()' \
- % self.__class__.__name__)
-
- # TODO delete the resource
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_SUPPORTED) # Remove to implement
-
- def references(self, env, object_name, model, result_class_name, role,
- result_role, keys_only):
- """Instrument Associations.
-
- All four association-related operations (Associators, AssociatorNames,
- References, ReferenceNames) are mapped to this method.
- This method is a python generator
-
- Keyword arguments:
- env -- Provider Environment (pycimmb.ProviderEnvironment)
- object_name -- A pywbem.CIMInstanceName that defines the source
- CIM Object whose associated Objects are to be returned.
- model -- A template pywbem.CIMInstance to serve as a model
- of the objects to be returned. Only properties present on this
- model need to be set.
- result_class_name -- If not empty, this string acts as a filter on
- the returned set of Instances by mandating that each returned
- Instances MUST represent an association between object_name
- and an Instance of a Class whose name matches this parameter
- or a subclass.
- role -- If not empty, MUST be a valid Property name. It acts as a
- filter on the returned set of Instances by mandating that each
- returned Instance MUST refer to object_name via a Property
- whose name matches the value of this parameter.
- result_role -- If not empty, MUST be a valid Property name. It acts
- as a filter on the returned set of Instances by mandating that
- each returned Instance MUST represent associations of
- object_name to other Instances, where the other Instances play
- the specified result_role in the association (i.e. the
- name of the Property in the Association Class that refers to
- the Object related to object_name MUST match the value of this
- parameter).
- keys_only -- A boolean. True if only the key properties should be
- set on the generated instances.
-
- The following diagram may be helpful in understanding the role,
- result_role, and result_class_name parameters.
- +------------------------+ +-------------------+
- | object_name.classname | | result_class_name |
- | ~~~~~~~~~~~~~~~~~~~~~ | | ~~~~~~~~~~~~~~~~~ |
- +------------------------+ +-------------------+
- | +-----------------------------------+ |
- | | [Association] model.classname | |
- | object_name | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
- +--------------+ object_name.classname REF role | |
- (CIMInstanceName) | result_class_name REF result_role +------+
- | |(CIMInstanceName)
- +-----------------------------------+
-
- Possible Errors:
- CIM_ERR_ACCESS_DENIED
- CIM_ERR_NOT_SUPPORTED
- CIM_ERR_INVALID_NAMESPACE
- CIM_ERR_INVALID_PARAMETER (including missing, duplicate, unrecognized
- or otherwise incorrect parameters)
- CIM_ERR_FAILED (some other unspecified error occurred)
-
- """
-
- logger = env.get_logger()
- logger.log_debug('Entering %s.references()' \
- % self.__class__.__name__)
- ch = env.get_cimom_handle()
-
- # Prime model.path with knowledge of the keys, so key values on
- # the CIMInstanceName (model.path) will automatically be set when
- # we set property values on the model.
- model.path.update({'Check': None, 'Element': None})
-
- with YumDB.getInstance(env):
- if ( (not role or role.lower() == 'element')
- and ch.is_subclass(object_name.namespace,
- sub=object_name.classname,
- super='LMI_SoftwarePackage')):
- filecheck_model = pywbem.CIMInstanceName(
- classname='LMI_SoftwareFileCheck',
- namespace="root/cimv2",
- host=model.path.host)
- model['Element'] = object_name
-
- pkg = SoftwarePackage.object_path2pkg(env, object_name)
- vpkg = yum.packages._RPMVerifyPackage(
- pkg, pkg.hdr.fiFromHeader(),
- SoftwareFileCheck.pkg_checksum_type(pkg), [], True)
- for fc in vpkg:
- model['Check'] = filecheck2model(
- vpkg, fc.filename, env, keys_only=True,
- model=filecheck_model)
- yield model
-
- if ( (not role or role.lower() == 'check')
- and ch.is_subclass(object_name.namespace,
- sub=object_name.classname,
- super='LMI_SoftwareFileCheck')):
- model['Check'] = object_name
-
- vpkg = SoftwareFileCheck.object_path2yumcheck(env, object_name)
- model['Element'] = pkg2model(
- env, vpkg.po, keys_only=True)
- yield model
-
- class Values(object):
- class Phase(object):
- In_State = pywbem.Uint16(0)
- Next_State = pywbem.Uint16(1)
-
-## end of class LMI_SoftwarePackageChecksProvider
-
-## get_providers() for associating CIM Class Name to python provider class name
-
-def get_providers(env):
- lmi_softwarepackagechecks_prov = LMI_SoftwarePackageChecks(env)
- return {'LMI_SoftwarePackageChecks': lmi_softwarepackagechecks_prov}
diff --git a/src/software/providers/__init__.py b/src/software/providers/__init__.py
deleted file mode 100644
index 2ebe827..0000000
--- a/src/software/providers/__init__.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Software Management Providers
-#
-# Copyright (C) 2012 Red Hat, Inc. All rights reserved.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-#
-# Authors: Michal Minar <miminar@redhat.com>
-#
diff --git a/src/software/providers/util/__init__.py b/src/software/providers/util/__init__.py
deleted file mode 100644
index 2ebe827..0000000
--- a/src/software/providers/util/__init__.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Software Management Providers
-#
-# Copyright (C) 2012 Red Hat, Inc. All rights reserved.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-#
-# Authors: Michal Minar <miminar@redhat.com>
-#
diff --git a/src/software/providers/util/common.py b/src/software/providers/util/common.py
deleted file mode 100644
index 7b54f1e..0000000
--- a/src/software/providers/util/common.py
+++ /dev/null
@@ -1,809 +0,0 @@
-# -*- encoding: utf-8 -*-
-# Software Management Providers
-#
-# Copyright (C) 2012 Red Hat, Inc. All rights reserved.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-#
-# Authors: Michal Minar <miminar@redhat.com>
-#
-
-"""Common utilities for LMI_Software* providers
-"""
-
-import collections
-from datetime import datetime
-import grp
-import hashlib
-import itertools
-import os
-import platform
-import pwd
-import re
-import rpm
-import socket
-import stat
-import pywbem
-import yum
-import cmpi_pywbem_bindings as pycimmb
-from openlmi.software.util import singletonmixin
-
-re_evra = re.compile(r'^(?P<epoch>\d+):(?P<ver>[^-]+)'
- r'-(?P<rel>.+)\.(?P<arch>[^.]+)$')
-re_nevra = re.compile(r'^(?P<name>.+)-(?P<evra>((?P<epoch>\d+):)?(?P<ver>[^-]+)'
- r'-(?P<rel>.+)\.(?P<arch>[^.]+))$')
-
-rpmdb_path = '/var/lib/rpm/Packages'
-
-class YumDB(singletonmixin.Singleton):
-
- ignoreSubsequent = True
-
- def __init__(self, env, *args, **kwargs):
- if not isinstance(env, pycimmb.ProviderEnvironment):
- raise TypeError("env must be instance of"
- " pycimmb.ProviderEnvironment")
- self._yum_args = (args, kwargs)
- self._yum = None
- self._db_mtime = 0
- self._lock_cnt = 0
- self.env = env
- env.get_logger().log_info('init called')
-
- def is_dirty(self):
- return self._db_mtime < os.stat(rpmdb_path).st_mtime
-
- def is_locked(self):
- return self._yum._lockfile is not None
-
- def update_db(self):
- self.env.get_logger().log_info('updating rpmdb')
- self._db_mtime = os.stat(rpmdb_path).st_mtime
- self._yum.doConfigSetup()
- self._yum.doTsSetup()
- self._yum.doRpmDBSetup()
-
- def __enter__(self):
- self._lock_cnt += 1
- if self._lock_cnt < 2:
- self._yum = yum.YumBase(*self._yum_args[0], **self._yum_args[1])
- if not self.is_locked() and self.is_dirty():
- self.update_db()
- self._yum.doLock()
- return self
-
- def __exit__(self, exc_type, exc_value, traceback):
- if self._lock_cnt == 1:
- del self._yum
- self._lock_cnt -= 1
-
- def __getattr__(self, name):
- if not self.is_locked() and self.is_dirty():
- self.update_db()
- return getattr(self._yum, name)
-
-
-def _get_distname():
- if hasattr(platform, 'linux_distribution'):
- return platform.linux_distribution(
- full_distribution_name=False)[0].lower()
- else:
- return platform.dist()[0].lower()
-
-
-def get_target_operating_system():
- """
- @return (val, text).
- Where val is a number from ValueMap of TargetOperatingSystem property
- of CIM_SoftwareElement class and text is its testual representation.
- """
-
- system = platform.system()
- if system.lower() == 'linux':
- try:
- val, dist = \
- { 'redhat' : (79, 'RedHat Enterprise Linux')
- , 'suse' : (81, 'SUSE')
- , 'mandriva' : (88, 'Mandriva')
- , 'ubuntu' : (93, 'Ubuntu')
- , 'debian' : (95, 'Debian')
- }[_get_distname()]
- except KeyError:
- linrel = platform.uname()[2]
- if linrel.startswith('2.4'):
- val, dist = (97, 'Linux 2.4.x')
- elif linrel.startswith('2.6'):
- val, dist = (99, 'Linux 2.6.x')
- else:
- return (36, 'LINUX') # no check for x86_64
- if platform.machine() == 'x86_64':
- val += 1
- dist += ' 64-Bit'
- return (val, dist)
- elif system.lower() in ('macosx', 'darwin'):
- return (2, 'MACOS')
- # elif system.lower() == 'windows': # no general value
- else:
- return (0, 'Unknown')
-
-def get_computer_system_op():
- return pywbem.CIMInstanceName(
- classname='CIM_ComputerSystem',
- keybindings={
- "CreationClassName": "CIM_ComputerSystem"
- , "Name" : socket.gethostname() },
- namespace="root/cimv2")
-
-def check_target_operating_system(system):
- """
- @return if param system matches current target operating system
- """
- if isinstance(system, basestring):
- system = int(system)
- if not isinstance(system, (int, long)):
- raise TypeError("system must be either string or integer, not {}"
- .format(system.__class__.__name__))
- tos = get_target_operating_system()
- if system == tos: return True
- if system == 36: # linux
- if platform.system().lower() == "linux": return True
- if ( system >= 97 and system <= 100 # linux 2.x.x
- and platform.uname()[2].startswith('2.4' if system < 99 else '2.6')
- # check machine
- and ( bool(platform.machine().endswith('64'))
- == bool(not (system % 2)))):
- return True
- return False
-
-def check_computer_system_op(env, system):
- if not isinstance(system, pywbem.CIMInstanceName):
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "\"System\" must be a CIMInstanceName")
- our_system = get_computer_system_op()
- ch = env.get_cimom_handle()
- if not ch.is_subclass(system.namespace,
- sub=system.classname,
- super=our_system.classname):
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "Class of \"System\" must be a sublass of %s" %
- our_system.classname)
- if not 'CreationClassName' in system or not 'Name' in system:
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "\"System\" is missing one of keys")
- if not ch.is_subclass(system.namespace,
- sub=system['CreationClassName'],
- super=our_system.classname):
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "CreationClassName of \"System\" must be a sublass of %s" %
- our_system.classname)
- if system['Name'] != our_system['Name']:
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "Name of \"System\" does not match \"%s\"" %
- our_system['Name'])
- return True
-
-
-def match_pkg(pkg, **kwargs):
- """
- all not Null and not empty arguments will be matched against pkg
- attributes; if all of them match, return True
-
- possible arguments:
- name, epoch, version, release, arch
- evra, nevra
- """
- for a in ('evra', 'nevra', 'name', 'epoch', 'version', 'release', 'arch'):
- v = kwargs.get(a, None)
- if v and getattr(pkg, a) != v:
- return False
- return True
-
-class SoftwarePackage:
- """
- Just a namespace for common function related to SoftwarePackage provider.
- """
-
- @staticmethod
- def parse_group(group, env):
- try:
- res = \
- { "amusements/games" : 3
- , "amusements/graphics" : 4
- , "applications/archiving" : 5
- , "applications/communications" : 6
- , "applications/databases" : 7
- , "applications/editors" : 8
- , "applications/emulators" : 9
- , "applications/engineering" : 10
- , "applications/file" : 11
- , "applications/internet" : 12
- , "applications/multimedia" : 13
- , "applications/productivity" : 14
- , "applications/publishing" : 15
- , "applications/system" : 16
- , "applications/text" : 17
- , "development/build tools" : 18
- , "development/debug" : 19
- , "development/debuggers" : 20
- , "development/documentation" : 21
- , "development/java" : 22
- , "development/languages" : 23
- , "development/libraries" : 24
- , "development/libraries/java" : 25
- , "development/system" : 26
- , "development/tools" : 27
- , "documentation" : 28
- , "internet/www/dynamic content" : 29
- , "system/libraries" : 30
- , "system environment/base" : 31
- , "system environment/daemons" : 32
- , "system environment/kernel" : 33
- , "system environment/libraries" : 34
- , "system environment/shells" : 35
- , "text processing/markup/xml" : 36
- , "user interface/desktops" : 37
- , "user interface/x" : 38
- , "user interface/x hardware support" : 39
- , "utilities" : 40
- }[group.lower()]
- except KeyError:
- logger = env.get_logger()
- if not group or group.lower() == "unspecified":
- logger.log_info("unspecified group '{}'".format(group))
- res = 2
- else:
- logger.log_error("failed to parse group '{}'".format(group))
- res = 0
- return pywbem.Uint16(res)
-
- @staticmethod
- def object_path2pkg(env, op, package_list='installed'):
- """
- @param op must contain precise information of package,
- otherwise a CIM_ERR_NOT_FOUND error is raised
- @param package_list one of {'installed', 'all', 'available'}
- says, where to look for given package
- """
- if not isinstance(op, pywbem.CIMInstanceName):
- raise TypeError("op must be an instance of CIMInstanceName")
- if not isinstance(package_list, basestring):
- raise TypeError("package_list must be a string")
- if not package_list in ('installed', 'all', 'available'):
- raise ValueError('unsupported package list "%s"'%package_list)
-
- tos = get_target_operating_system()[0]
- if ( not op['Name'] or not op['SoftwareElementID']
- or not op['SoftwareElementID'].startswith(op['Name'])
- or op['SoftwareElementID'].find(op['Version']) == -1):
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND, "Wrong keys.")
-# if op['SoftwareElementState'] not in ("2", 2):
-# raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
-# "Only \"Executable\" software element state supported")
- if not check_target_operating_system(op['TargetOperatingSystem']):
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "Wrong target operating system.")
- if not op['Name'] or not op['Version']:
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- 'Both "Name" and "Version" must be given')
- m = re_nevra.match(op['SoftwareElementID'])
- if not m:
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "Wrong SotwareElementID. Expected valid nevra"
- " (name-[epoch:]version-release.arch).")
- if op['Version'] != m.group('ver'):
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "Version does not match version part in SoftwareElementID.")
- evra = "{}:{}-{}.{}".format(*(
- (m.group(k) if k != "epoch" or m.group(k) else "0")
- for k in ("epoch", 'ver', 'rel', 'arch')))
- with YumDB.getInstance(env) as yb:
- pl = yb.doPackageLists(package_list,
- showdups=package_list != 'installed')
- if package_list != 'all':
- pl = getattr(pl, package_list)
- else:
- # NOTE: available ∩ installed = ∅
- pl = itertools.chain(pl.available, pl.installed)
- exact,_,_ = yum.packages.parsePackages(pl, [op['Name']])
- for pkg in yum.misc.unique(exact):
- if pkg.evra == evra: break
- else:
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "No matching package found.")
- return pkg
-
- @staticmethod
- def object_path2pkg_search(env, op):
- """
- similar to object_path2pkg, but tries to find best suitable
- package matching keys
-
- If any matching package is already installed, it is returned.
- Otherwise available package with highest version is returned.
-
- @param op may be object of CIMInstance or CIMInstanceName and
- must contain at least \"Name\" or \"SoftwareElementID\"
- @return instance of yum.rpmsack.RPMInstalledPackage in case of
- installed package, otherwise yum.packages.YumAvailablePackage
- """
- logger = env.get_logger()
- if isinstance(op, pywbem.CIMInstance):
- def _get_key(k):
- v = op.properties.get(k, None)
- if isinstance(v, pywbem.CIMProperty): return v.value
- if v is not None: return v
- logger.log_error('missing key "{}" in inst.props'.format(k))
- return op.path[k] if k in op.path else None
- elif isinstance(op, pywbem.CIMInstanceName):
- _get_key = lambda k: op[k] if k in op else None
- else:
- raise TypeError("op must be either CIMInstance or CIMInstanceName")
-
- # parse and check arguments
- match_props = {} # args for match_pkg
- if _get_key('SoftwareElementID'):
- m = re_nevra.match(_get_key('SoftwareElementID'))
- if not m:
- raise pywbem.CIMError(pywbem.CIM_ERR_INVALID_PARAMETER,
- "SoftwareElementID could not be parsed.")
- for k in ('name', 'version', 'release', 'arch'):
- mk = k if k not in ('version', 'release') else k[:3]
- match_props[k] = m.group(mk)
- if not m.group("epoch"):
- match_props["epoch"] = "0"
- else:
- for k in ('name', 'epoch', 'version', 'release', 'arch'):
- ik = k if k != 'arch' else "architecture"
- if _get_key(ik): match_props[k] = _get_key(ik)
-
- if not match_props:
- raise pywbem.CIMError(pywbem.CIM_ERR_FAILED,
- "Too few key values given (give at least a Name).")
- if not 'name' in match_props:
- raise pywbem.CIMError(pywbem.CIM_ERR_FAILED,
- "Missing either Name or SoftwareElementID property.")
-
- # get available packages
- pl = YumDB.getInstance(env).doPackageLists('all', showdups=True)
- # NOTE: available ∩ installed = ∅
- exact,_,_ = yum.packages.parsePackages(
- itertools.chain(pl.available, pl.installed),
- [match_props['name']])
- exact = yum.misc.unique(exact)
- exact_orig = exact
- exact = sorted( [ p for p in exact if match_pkg(p, **match_props) ]
- , key=lambda a: a.evra)
- if len(exact) == 0:
- logger.log_error('could not find any package for query: {}'
- ' in list: {}'
- .format(match_props, [p.nevra for p in exact_orig]))
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "No matching package found.")
- for pkg in exact: # check, whether package is already installed
- if isinstance(pkg, yum.rpmsack.RPMInstalledPackage):
- return pkg
- logger.log_info(('found multiple matching packages'
- ' for query: {}' if len(exact) > 1 else
- 'exact match found for query: {}')
- .format(match_props))
- return exact[-1] # select highest version
-
- @staticmethod
- def pkg2model_wrapper(namespace, classname):
- """
- @return a function that transforms YumAvailablePackage object
- to CIMInstanceName object
- """
-
- tos = pywbem.Uint16(get_target_operating_system()[0])
-
- def pkg2model(env, pkg, keys_only=True, model=None):
- """
- @param model if None, will be filled with data, otherwise
- a new instance of CIMInstance or CIMObjectPath is created
- """
- #if not isinstance(pkg, yum.rpmsack.RPMInstalledPackage):
- #if not isinstance(pkg, yum.packages.YumHeaderPackage):
- if not isinstance(pkg, yum.packages.YumAvailablePackage):
- raise TypeError(
- "pkg must be an instance of YumAvailablePackage")
- if model is None:
- model = pywbem.CIMInstanceName(classname, namespace=namespace)
- if not keys_only:
- model = pywbem.CIMInstance(classname, path=model)
- if isinstance(model, pywbem.CIMInstance):
- def _set_key(k, v):
- model[k] = v
- model.path[k] = v
- else:
- _set_key = model.__setitem__
- with YumDB.getInstance(env):
- _set_key('Name', pkg.name)
- _set_key('SoftwareElementID', pkg.nevra)
- _set_key('SoftwareElementState', pywbem.Uint16(2
- if isinstance(pkg, yum.rpmsack.RPMInstalledPackage)
- else 1))
- _set_key('TargetOperatingSystem', tos)
- _set_key('Version', pkg.version)
- if not keys_only:
- model['Caption'] = pkg.summary
- model['Description'] = pkg.description
- if isinstance(pkg, yum.rpmsack.RPMInstalledPackage):
- model['InstallDate'] = pywbem.CIMDateTime(
- datetime.fromtimestamp(pkg.installtime))
- if pkg.vendor:
- model['Manufacturer'] = pkg.vendor
- model['Release'] = pkg.release
- model['Epoch'] = pywbem.Uint16(pkg.epoch)
- model["Architecture"] = pkg.arch
- model['License'] = pkg.license
- model['Group'] = pkg.group
- model['Size'] = pywbem.Uint64(pkg.size)
- return model
-
- return pkg2model
-
-class SoftwareFileCheck:
- """
- Just a namespace for functions related to FileCheck provider.
- """
-
- passed_flags_descriptions = (
- "Existence",
- "File Type",
- "File Size",
- "File Mode",
- "File Checksum",
- "Device major/minor number",
- "Symlink Target",
- "User Ownership", "Group Ownership",
- "Modify Time")
-
- checksumtype_str2num = dict((v, k) for (k, v) in
- yum.constants.RPM_CHECKSUM_TYPES.items())
-
- @staticmethod
- def pkg_checksum_type(pkg):
- """
- @return integer representation of checksum type
- """
- if not isinstance(pkg, yum.packages.YumAvailablePackage):
- raise TypeError("pkg must be an instance of YumAvailablePackage")
- if isinstance(pkg, yum.rpmsack.RPMInstalledPackage):
- return pkg.hdr[rpm.RPMTAG_FILEDIGESTALGO]
- with self: # ensure, that _yum is inited
- return SoftwareFileCheck.checksumtype_str2pywbem(
- pkg.yumdb_info.checksum_type)
-
- @staticmethod
- def checksumtype_num2hash(csumt):
- return getattr(hashlib, yum.constants.RPM_CHECKSUM_TYPES[csumt])
-
- @staticmethod
- def checksumtype_str2pywbem(alg):
- try:
- res = SoftwareFileCheck.checksumtype_str2num[alg.lower()]
- except KeyError: res = 0
- return pywbem.Uint16(res)
-
- @staticmethod
- def filetype_str2pywbem(ft):
- try:
- return pywbem.Uint16(
- { 'file' : 1
- , 'directory' : 2
- , 'symlink' : 3
- , 'fifo' : 4
- , 'character device' : 5
- , 'block device' : 6
- }[ft])
- except KeyError:
- return pywbem.Uint16(0)
-
- @staticmethod
- def filetype_mode2pywbem(mode):
- for i, name in enumerate(
- ('REG', 'DIR', 'LNK', 'FIFO', 'CHR', 'BLK'), 1):
- if getattr(stat, 'S_IS' + name)(mode):
- return pywbem.Uint16(i)
- return pywbem.Uint16(0)
-
- @staticmethod
- def mode2pywbem_flags(mode):
- """
- @param mode if None, file does not exist
- """
- if mode is None: return None
- flags = []
- for i, c in enumerate((
- stat.S_IXOTH,
- stat.S_IWOTH,
- stat.S_IROTH,
- stat.S_IXGRP,
- stat.S_IWGRP,
- stat.S_IRGRP,
- stat.S_IXUSR,
- stat.S_IWUSR,
- stat.S_IRUSR,
- stat.S_ISVTX,
- stat.S_ISGID,
- stat.S_ISUID)):
- if c & mode:
- flags.append(pywbem.Uint8(i))
- return flags
-
- @staticmethod
- def hashfile(afile, hashers, blocksize=65536):
- """
- @param hashers is a list of hash objects
- @return list of digest strings (in hex format) for each hash object
- given in the same order
- """
- if not isinstance(hashers, (tuple, list, set, frozenset)):
- hashers = (hashers, )
- buf = afile.read(blocksize)
- while len(buf) > 0:
- for h in hashers: h.update(buf)
- buf = afile.read(blocksize)
- return [ h.hexdigest() for h in hashers ]
-
- @staticmethod
- def compute_checksums(env, checksum_type, file_type, file_path):
- """
- @param file_type is not a file, then zeroes are returned
- @param checksum_type selected hash algorithm to compute second
- checksum
- @return (md5sum, checksum)
- both checksums are computed from file_path's content
- first one is always md5, the second one depends on checksum_type
- if file does not exists, (None, None) is returned
- """
- hashers = [hashlib.md5()]
- if checksum_type != SoftwareFileCheck.checksumtype_str2num["md5"]:
- hashers.append(SoftwareFileCheck.checksumtype_num2hash(checksum_type)())
- if file_type != SoftwareFileCheck.filetype_str2pywbem('file'):
- rslts = ['0'*len(h.hexdigest()) for h in hashers]
- else:
- try:
- with open(file_path, 'rb') as f:
- rslts = SoftwareFileCheck.hashfile(f, hashers)
- except (OSError, IOError) as e:
- env.get_logger().log_error("could not open file \"%s\""
- " for reading: %s" % (file_path, e))
- return None, None
- return (rslts[0], rslts[1] if len(rslts) > 1 else rslts[0]*2)
-
- @staticmethod
- def object_path2yumcheck(env, op):
- """
- @return instance of yum.packages._RPMVerifyPackage
- this object holds RPMInstalledPackage under its po attribute
- """
- if not isinstance(op, pywbem.CIMInstanceName):
- raise TypeError("op must be instance of CIMInstanceName, "
- "not \"%s\"" % op.__class__.__name__)
- log = env.get_logger()
-
- tos = get_target_operating_system()[0]
- if ( not op['Name'] or not op['SoftwareElementID']
- or not op['CheckID']
- or not op['CheckID'].endswith('#'+op['Name'])
- or op['SoftwareElementID'].find(op['Version']) == -1):
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND, "Wrong keys.")
- if op['SoftwareElementState'] not in ("2", 2):
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "Only \"Executable\" software element state supported")
- if not check_target_operating_system(op['TargetOperatingSystem']):
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "Wrong target operating system.")
- if not op['Name'] or not op['Version']:
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- 'Both "Name" and "Version" must be given')
- m = re_nevra.match(op['SoftwareElementID'])
- if not m:
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "Wrong SotwareElementID. Expected valid nevra"
- " (name-epoch:version-release.arch).")
- if op['Version'] != m.group('ver'):
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "Version does not match version part in SoftwareElementID.")
-
- evra = "{}:{}-{}.{}".format(*(
- (m.group(k) if k != "epoch" or m.group(k) else "0")
- for k in ("epoch", 'ver', 'rel', 'arch')))
- with YumDB.getInstance(env) as yb:
- pl = yb.doPackageLists('installed')
- exact, matched, unmatched = yum.packages.parsePackages(
- pl.installed, [m.group('name')])
- exact = yum.misc.unique(exact)
- for pkg in exact:
- if pkg.evra == evra: break
- else:
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "No matching package installed.")
-
- fi = pkg.hdr.fiFromHeader()
- vpkg = yum.packages._RPMVerifyPackage(pkg, fi,
- SoftwareFileCheck.pkg_checksum_type(pkg), [], True)
- if not op['Name'] in vpkg:
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "File not found in RPM package.")
- return vpkg
-
- """
- Named tuple to store results of rpm file check as pywbem values,
- all results are in form:
- (expected, reality)
- where
- expected is value from rpm package
- reality is value obtained from installed file
- None means, that value could not be obtained
- except for "exists" and "md5_checksum" attributes, where "exists"
- is boolean and md5_checksum is a string
- for example:
- file_check.file_type == (4, 3)
- """
- FileCheck = collections.namedtuple('FileCheck',
- 'exists, md5_checksum, file_type, file_size, file_mode, '
- 'file_checksum, device, link_target, user_id, group_id, '
- 'last_modification_time')
-
- @staticmethod
- def test_file(env, checksum_type, vpf):
- """
- @param checksum type is a pywbem value for ChecksumType property
- @return instance of FileCheck
- """
- if not isinstance(vpf, yum.packages._RPMVerifyPackageFile):
- raise TypeError("vpf must be an instance of _RPMVerifyPackage,"
- " not \"%s\"" % vpf.__class__.__name__)
- exists = os.path.lexists(vpf.filename)
- md5_checksum = None
- expected = {
- "file_type" : SoftwareFileCheck.filetype_str2pywbem(vpf.ftype),
- "user_id" : pywbem.Uint32(pwd.getpwnam(vpf.user).pw_uid),
- "group_id" : pywbem.Uint32(grp.getgrnam(vpf.group).gr_gid),
- "file_mode" : pywbem.Uint32(vpf.mode),
- "file_size" : pywbem.Uint64(vpf.size),
- "link_target" : vpf.readlink if vpf.readlink else None,
- "file_checksum" : vpf.digest[1],
- "device" : (pywbem.Uint64(vpf.dev)
- if vpf.ftype.endswith('device') else None),
- "last_modification_time" : pywbem.Uint64(vpf.mtime)
- }
- if not exists:
- reality = collections.defaultdict(lambda: None)
- else:
- fstat = os.lstat(vpf.filename)
- reality = {
- "file_type" : SoftwareFileCheck.filetype_mode2pywbem(fstat.st_mode),
- "user_id" : pywbem.Uint32(fstat.st_uid),
- "group_id" : pywbem.Uint32(fstat.st_gid),
- "file_mode" : pywbem.Uint32(fstat.st_mode),
- "file_size" : pywbem.Uint64(fstat.st_size),
- "last_modification_time" : pywbem.Uint64(fstat.st_mtime)
- }
- reality["device"] = (pywbem.Uint64(fstat.st_dev)
- if reality['file_type'] == SoftwareFileCheck.filetype_str2pywbem(
- "device") else None)
- reality["link_target"] = (os.readlink(vpf.filename)
- if os.path.islink(vpf.filename) else None)
- md5_checksum, checksum = SoftwareFileCheck.compute_checksums(
- env, checksum_type, reality["file_type"], vpf.filename)
- reality["file_checksum"] = checksum
- kwargs = dict(exists=exists, md5_checksum=md5_checksum,
- **dict((k, (expected[k], reality[k])) for k in expected))
- return SoftwareFileCheck.FileCheck(**kwargs)
-
- @staticmethod
- def filecheck_passed(fc):
- if not isinstance(fc, SoftwareFileCheck.FileCheck):
- raise TypeError("fc must be an instance of FileCheck")
- return ( fc.exists
- and all( v[0] == v[1]
- for k, v in fc._asdict().items() if (
- isinstance(v, tuple)
- and ( k != "last_modification_time"
- or fc.file_type[0] == \
- SoftwareFileCheck.filetype_str2pywbem("file")
- ))))
-
- @staticmethod
- def filecheck_wrapper(namespace, classname):
-
- def _filecheck2model_flags(fc):
- flags = []
- for k, v in fc._asdict().items():
- if isinstance(v, tuple):
- if ( k != "last_modification_time"
- or fc.file_type[0] == SoftwareFileCheck.filetype_str2pywbem(
- 'file')):
- # last_modification_time check is valid only for
- # regular files
- flag = fc.exists and v[0] == v[1]
- else:
- flag = True
- flags.append(flag)
- elif isinstance(v, bool):
- flags.append(v)
- return flags
-
- def filecheck2model(vpkg, fn, env, keys_only=True,
- model=None, fc=None):
- if not isinstance(vpkg, yum.packages._RPMVerifyPackage):
- raise TypeError(
- "vpkg must be an instance of _RPMVerifyPackage")
- if not fn in vpkg:
- raise pywbem.CIMError(pywbem.CIM_ERR_NOT_FOUND,
- "File \"%s\" not found among package files" % fn)
- if model is None:
- model = pywbem.CIMInstanceName(classname, namespace=namespace)
- if not keys_only:
- model = pywbem.CIMInstance(classname, path=model)
- if fc is not None:
- if not isinstance(fc, SoftwareFileCheck.FileCheck):
- raise TypeError("fc must be an instance of FileCheck")
- pkg = vpkg.po
- vpf = vpkg._files[fn]
- model['Name'] = vpf.filename
- model['SoftwareElementID'] = pkg.nevra
- model['SoftwareElementState'] = pywbem.Uint16(2)
- model['TargetOperatingSystem'] = pywbem.Uint16(
- get_target_operating_system()[0])
- model['Version'] = pkg.version
- model['CheckID'] = '%s#%s' % (pkg.name, vpf.filename)
- if not keys_only:
- #model['Caption'] = '' # TODO
- #model['CheckMode'] = bool() # TODO
- #model['CRC1'] = pywbem.Uint32() # TODO
- #model['CRC2'] = pywbem.Uint32() # TODO
- #model['CreateTimeStamp'] = pywbem.CIMDateTime() # TODO
- #model['Description'] = '' # TODO
- #model['ElementName'] = '' # TODO
- #model['InstanceID'] = '' # TODO
- model['FileName'] = os.path.basename(vpf.filename)
- model['FileChecksumType'] = csumt = \
- pywbem.Uint16(SoftwareFileCheck.pkg_checksum_type(pkg))
- if fc is None:
- fc = SoftwareFileCheck.test_file(env, csumt, vpf)
- for mattr, fattr in (
- ('FileType', 'file_type'),
- ('FileUserID', 'user_id'),
- ('FileGroupID', 'group_id'),
- ('FileMode', 'file_mode'),
- ('LastModificationTime', 'last_modification_time'),
- ('FileSize', 'file_size'),
- ('LinkTarget', 'link_target'),
- ('FileChecksum', 'file_checksum')):
- exp, rea = getattr(fc, fattr)
- if exp is not None:
- model['Expected' + mattr] = exp
- if rea is not None:
- model[mattr] = rea
- model['ExpectedFileModeFlags'] = \
- SoftwareFileCheck.mode2pywbem_flags(fc.file_mode[0])
- if fc.exists:
- model['FileModeFlags'] = SoftwareFileCheck.mode2pywbem_flags(
- fc.file_mode[1])
- model['FileExists'] = fc.exists
- if fc.md5_checksum is not None:
- model['MD5Checksum'] = fc.md5_checksum
- model['PassedFlags'] = _filecheck2model_flags(fc)
- model['PassedFlagsDescriptions'] = list(
- SoftwareFileCheck.passed_flags_descriptions)
- return model
-
- return filecheck2model
-
diff --git a/src/software/providers/util/singletonmixin.py b/src/software/providers/util/singletonmixin.py
deleted file mode 100644
index 8051695..0000000
--- a/src/software/providers/util/singletonmixin.py
+++ /dev/null
@@ -1,508 +0,0 @@
-"""
-A Python Singleton mixin class that makes use of some of the ideas
-found at http://c2.com/cgi/wiki?PythonSingleton. Just inherit
-from it and you have a singleton. No code is required in
-subclasses to create singleton behavior -- inheritance from
-Singleton is all that is needed.
-
-Singleton creation is threadsafe.
-
-USAGE:
-
-Just inherit from Singleton. If you need a constructor, include
-an __init__() method in your class as you usually would. However,
-if your class is S, you instantiate the singleton using S.getInstance()
-instead of S(). Repeated calls to S.getInstance() return the
-originally-created instance.
-
-For example:
-
-class S(Singleton):
-
- def __init__(self, a, b=1):
- pass
-
-S1 = S.getInstance(1, b=3)
-
-
-Most of the time, that's all you need to know. However, there are some
-other useful behaviors. Read on for a full description:
-
-1) Getting the singleton:
-
- S.getInstance()
-
-returns the instance of S. If none exists, it is created.
-
-2) The usual idiom to construct an instance by calling the class, i.e.
-
- S()
-
-is disabled for the sake of clarity.
-
-For one thing, the S() syntax means instantiation, but getInstance()
-usually does not cause instantiation. So the S() syntax would
-be misleading.
-
-Because of that, if S() were allowed, a programmer who didn't
-happen to notice the inheritance from Singleton (or who
-wasn't fully aware of what a Singleton pattern
-does) might think he was creating a new instance,
-which could lead to very unexpected behavior.
-
-So, overall, it is felt that it is better to make things clearer
-by requiring the call of a class method that is defined in
-Singleton. An attempt to instantiate via S() will result
-in a SingletonException being raised.
-
-3) Use __S.__init__() for instantiation processing,
-since S.getInstance() runs S.__init__(), passing it the args it has received.
-
-If no data needs to be passed in at instantiation time, you don't need S.__init__().
-
-4) If S.__init__(.) requires parameters, include them ONLY in the
-first call to S.getInstance(). If subsequent calls have arguments,
-a SingletonException is raised by default.
-
-If you find it more convenient for subsequent calls to be allowed to
-have arguments, but for those argumentsto be ignored, just include
-'ignoreSubsequent = True' in your class definition, i.e.:
-
- class S(Singleton):
-
- ignoreSubsequent = True
-
- def __init__(self, a, b=1):
- pass
-
-5) For testing, it is sometimes convenient for all existing singleton
-instances to be forgotten, so that new instantiations can occur. For that
-reason, a forgetAllSingletons() function is included. Just call
-
- forgetAllSingletons()
-
-and it is as if no earlier instantiations have occurred.
-
-6) As an implementation detail, classes that inherit
-from Singleton may not have their own __new__
-methods. To make sure this requirement is followed,
-an exception is raised if a Singleton subclass includ
-es __new__. This happens at subclass instantiation
-time (by means of the MetaSingleton metaclass.
-
-
-By Gary Robinson, grobinson@flyfi.com. No rights reserved --
-placed in the public domain -- which is only reasonable considering
-how much it owes to other people's code and ideas which are in the
-public domain. The idea of using a metaclass came from
-a comment on Gary's blog (see
-http://www.garyrobinson.net/2004/03/python_singleto.html#comments).
-Other improvements came from comments and email from other
-people who saw it online. (See the blog post and comments
-for further credits.)
-
-Not guaranteed to be fit for any particular purpose. Use at your
-own risk.
-"""
-
-import threading
-
-class SingletonException(Exception):
- pass
-
-_stSingletons = set()
-_lockForSingletons = threading.RLock()
-_lockForSingletonCreation = threading.RLock() # Ensure only one instance of each Singleton
- # class is created. This is not bound to the
- # individual Singleton class since we need to
- # ensure that there is only one mutex for each
- # Singleton class, which would require having
- # a lock when setting up the Singleton class,
- # which is what this is anyway. So, when any
- # Singleton is created, we lock this lock and
- # then we don't need to lock it again for that
- # class.
-
-def _createSingletonInstance(cls, lstArgs, dctKwArgs):
- _lockForSingletonCreation.acquire()
- try:
- if cls._isInstantiated(): # some other thread got here first
- return
-
- instance = cls.__new__(cls)
- try:
- instance.__init__(*lstArgs, **dctKwArgs)
- except TypeError, e:
- if e.message.find('__init__() takes') != -1:
- raise SingletonException, 'If the singleton requires __init__ args, supply them on first call to getInstance().'
- else:
- raise
- cls.cInstance = instance
- _addSingleton(cls)
- finally:
- _lockForSingletonCreation.release()
-
-def _addSingleton(cls):
- _lockForSingletons.acquire()
- try:
- assert cls not in _stSingletons
- _stSingletons.add(cls)
- finally:
- _lockForSingletons.release()
-
-def _removeSingleton(cls):
- _lockForSingletons.acquire()
- try:
- if cls in _stSingletons:
- _stSingletons.remove(cls)
- finally:
- _lockForSingletons.release()
-
-def forgetAllSingletons():
- '''This is useful in tests, since it is hard to know which singletons need to be cleared to make a test work.'''
- _lockForSingletons.acquire()
- try:
- for cls in _stSingletons.copy():
- cls._forgetClassInstanceReferenceForTesting()
-
- # Might have created some Singletons in the process of tearing down.
- # Try one more time - there should be a limit to this.
- iNumSingletons = len(_stSingletons)
- if len(_stSingletons) > 0:
- for cls in _stSingletons.copy():
- cls._forgetClassInstanceReferenceForTesting()
- iNumSingletons -= 1
- assert iNumSingletons == len(_stSingletons), 'Added a singleton while destroying ' + str(cls)
- assert len(_stSingletons) == 0, _stSingletons
- finally:
- _lockForSingletons.release()
-
-class MetaSingleton(type):
- def __new__(metaclass, strName, tupBases, dct):
- if dct.has_key('__new__'):
- raise SingletonException, 'Can not override __new__ in a Singleton'
- return super(MetaSingleton, metaclass).__new__(metaclass, strName, tupBases, dct)
-
- def __call__(cls, *lstArgs, **dictArgs):
- raise SingletonException, 'Singletons may only be instantiated through getInstance()'
-
-class Singleton(object):
- __metaclass__ = MetaSingleton
-
- def getInstance(cls, *lstArgs, **dctKwArgs):
- """
- Call this to instantiate an instance or retrieve the existing instance.
- If the singleton requires args to be instantiated, include them the first
- time you call getInstance.
- """
- if cls._isInstantiated():
- if (lstArgs or dctKwArgs) and not hasattr(cls, 'ignoreSubsequent'):
- raise SingletonException, 'Singleton already instantiated, but getInstance() called with args.'
- else:
- _createSingletonInstance(cls, lstArgs, dctKwArgs)
-
- return cls.cInstance
- getInstance = classmethod(getInstance)
-
- def _isInstantiated(cls):
- # Don't use hasattr(cls, 'cInstance'), because that screws things up if there is a singleton that
- # extends another singleton. hasattr looks in the base class if it doesn't find in subclass.
- return 'cInstance' in cls.__dict__
- _isInstantiated = classmethod(_isInstantiated)
-
- # This can be handy for public use also
- isInstantiated = _isInstantiated
-
- def _forgetClassInstanceReferenceForTesting(cls):
- """
- This is designed for convenience in testing -- sometimes you
- want to get rid of a singleton during test code to see what
- happens when you call getInstance() under a new situation.
-
- To really delete the object, all external references to it
- also need to be deleted.
- """
- try:
- if hasattr(cls.cInstance, '_prepareToForgetSingleton'):
- # tell instance to release anything it might be holding onto.
- cls.cInstance._prepareToForgetSingleton()
- del cls.cInstance
- _removeSingleton(cls)
- except AttributeError:
- # run up the chain of base classes until we find the one that has the instance
- # and then delete it there
- for baseClass in cls.__bases__:
- if issubclass(baseClass, Singleton):
- baseClass._forgetClassInstanceReferenceForTesting()
- _forgetClassInstanceReferenceForTesting = classmethod(_forgetClassInstanceReferenceForTesting)
-
-
-if __name__ == '__main__':
-
- import unittest
- import time
-
- class singletonmixin_Public_TestCase(unittest.TestCase):
- def testReturnsSameObject(self):
- """
- Demonstrates normal use -- just call getInstance and it returns a singleton instance
- """
-
- class A(Singleton):
- def __init__(self):
- super(A, self).__init__()
-
- a1 = A.getInstance()
- a2 = A.getInstance()
- self.assertEquals(id(a1), id(a2))
-
- def testInstantiateWithMultiArgConstructor(self):
- """
- If the singleton needs args to construct, include them in the first
- call to get instances.
- """
-
- class B(Singleton):
-
- def __init__(self, arg1, arg2):
- super(B, self).__init__()
- self.arg1 = arg1
- self.arg2 = arg2
-
- b1 = B.getInstance('arg1 value', 'arg2 value')
- b2 = B.getInstance()
- self.assertEquals(b1.arg1, 'arg1 value')
- self.assertEquals(b1.arg2, 'arg2 value')
- self.assertEquals(id(b1), id(b2))
-
- def testInstantiateWithKeywordArg(self):
-
- class B(Singleton):
-
- def __init__(self, arg1=5):
- super(B, self).__init__()
- self.arg1 = arg1
-
- b1 = B.getInstance('arg1 value')
- b2 = B.getInstance()
- self.assertEquals(b1.arg1, 'arg1 value')
- self.assertEquals(id(b1), id(b2))
-
- def testTryToInstantiateWithoutNeededArgs(self):
-
- class B(Singleton):
-
- def __init__(self, arg1, arg2):
- super(B, self).__init__()
- self.arg1 = arg1
- self.arg2 = arg2
-
- self.assertRaises(SingletonException, B.getInstance)
-
- def testPassTypeErrorIfAllArgsThere(self):
- """
- Make sure the test for capturing missing args doesn't interfere with a normal TypeError.
- """
- class B(Singleton):
-
- def __init__(self, arg1, arg2):
- super(B, self).__init__()
- self.arg1 = arg1
- self.arg2 = arg2
- raise TypeError, 'some type error'
-
- self.assertRaises(TypeError, B.getInstance, 1, 2)
-
- def testTryToInstantiateWithoutGetInstance(self):
- """
- Demonstrates that singletons can ONLY be instantiated through
- getInstance, as long as they call Singleton.__init__ during construction.
-
- If this check is not required, you don't need to call Singleton.__init__().
- """
-
- class A(Singleton):
- def __init__(self):
- super(A, self).__init__()
-
- self.assertRaises(SingletonException, A)
-
- def testDontAllowNew(self):
-
- def instantiatedAnIllegalClass():
- class A(Singleton):
- def __init__(self):
- super(A, self).__init__()
-
- def __new__(metaclass, strName, tupBases, dct):
- return super(MetaSingleton, metaclass).__new__(metaclass, strName, tupBases, dct)
-
- self.assertRaises(SingletonException, instantiatedAnIllegalClass)
-
-
- def testDontAllowArgsAfterConstruction(self):
- class B(Singleton):
-
- def __init__(self, arg1, arg2):
- super(B, self).__init__()
- self.arg1 = arg1
- self.arg2 = arg2
-
- B.getInstance('arg1 value', 'arg2 value')
- self.assertRaises(SingletonException, B, 'arg1 value', 'arg2 value')
-
- def test_forgetClassInstanceReferenceForTesting(self):
- class A(Singleton):
- def __init__(self):
- super(A, self).__init__()
- class B(A):
- def __init__(self):
- super(B, self).__init__()
-
- # check that changing the class after forgetting the instance produces
- # an instance of the new class
- a = A.getInstance()
- assert a.__class__.__name__ == 'A'
- A._forgetClassInstanceReferenceForTesting()
- b = B.getInstance()
- assert b.__class__.__name__ == 'B'
-
- # check that invoking the 'forget' on a subclass still deletes the instance
- B._forgetClassInstanceReferenceForTesting()
- a = A.getInstance()
- B._forgetClassInstanceReferenceForTesting()
- b = B.getInstance()
- assert b.__class__.__name__ == 'B'
-
- def test_forgetAllSingletons(self):
- # Should work if there are no singletons
- forgetAllSingletons()
-
- class A(Singleton):
- ciInitCount = 0
- def __init__(self):
- super(A, self).__init__()
- A.ciInitCount += 1
-
- A.getInstance()
- self.assertEqual(A.ciInitCount, 1)
-
- A.getInstance()
- self.assertEqual(A.ciInitCount, 1)
-
- forgetAllSingletons()
- A.getInstance()
- self.assertEqual(A.ciInitCount, 2)
-
- def test_threadedCreation(self):
- # Check that only one Singleton is created even if multiple
- # threads try at the same time. If fails, would see assert in _addSingleton
- class Test_Singleton(Singleton):
- def __init__(self):
- super(Test_Singleton, self).__init__()
-
- class Test_SingletonThread(threading.Thread):
- def __init__(self, fTargetTime):
- super(Test_SingletonThread, self).__init__()
- self._fTargetTime = fTargetTime
- self._eException = None
-
- def run(self):
- try:
- fSleepTime = self._fTargetTime - time.time()
- if fSleepTime > 0:
- time.sleep(fSleepTime)
- Test_Singleton.getInstance()
- except Exception, e:
- self._eException = e
-
- fTargetTime = time.time() + 0.1
- lstThreads = []
- for _ in xrange(100):
- t = Test_SingletonThread(fTargetTime)
- t.start()
- lstThreads.append(t)
- eException = None
- for t in lstThreads:
- t.join()
- if t._eException and not eException:
- eException = t._eException
- if eException:
- raise eException
-
- def testNoInit(self):
- """
- Demonstrates use with a class not defining __init__
- """
-
- class A(Singleton):
- pass
-
- #INTENTIONALLY UNDEFINED:
- #def __init__(self):
- # super(A, self).__init__()
-
- A.getInstance() #Make sure no exception is raised
-
- def testMultipleGetInstancesWithArgs(self):
-
- class A(Singleton):
-
- ignoreSubsequent = True
-
- def __init__(self, a, b=1):
- pass
-
- a1 = A.getInstance(1)
- a2 = A.getInstance(2) # ignores the second call because of ignoreSubsequent
-
- class B(Singleton):
-
- def __init__(self, a, b=1):
- pass
-
- b1 = B.getInstance(1)
- self.assertRaises(SingletonException, B.getInstance, 2) # No ignoreSubsequent included
-
- class C(Singleton):
-
- def __init__(self, a=1):
- pass
-
- c1 = C.getInstance(a=1)
- self.assertRaises(SingletonException, C.getInstance, a=2) # No ignoreSubsequent included
-
- def testInheritance(self):
- """
- It's sometimes said that you can't subclass a singleton (see, for instance,
- http://steve.yegge.googlepages.com/singleton-considered-stupid point e). This
- test shows that at least rudimentary subclassing works fine for us.
- """
-
- class A(Singleton):
-
- def setX(self, x):
- self.x = x
-
- def setZ(self, z):
- raise NotImplementedError
-
- class B(A):
-
- def setX(self, x):
- self.x = -x
-
- def setY(self, y):
- self.y = y
-
- a = A.getInstance()
- a.setX(5)
- b = B.getInstance()
- b.setX(5)
- b.setY(50)
- self.assertEqual((a.x, b.x, b.y), (5, -5, 50))
- self.assertRaises(AttributeError, eval, 'a.setY', {}, locals())
- self.assertRaises(NotImplementedError, b.setZ, 500)
-
- unittest.main()
-