1
0
OBS User unknown 2008-11-04 16:32:36 +00:00 committed by Git OBS Bridge
commit 18be56a819
6 changed files with 523 additions and 0 deletions

23
.gitattributes vendored Normal file
View File

@ -0,0 +1,23 @@
## Default LFS
*.7z filter=lfs diff=lfs merge=lfs -text
*.bsp filter=lfs diff=lfs merge=lfs -text
*.bz2 filter=lfs diff=lfs merge=lfs -text
*.gem filter=lfs diff=lfs merge=lfs -text
*.gz filter=lfs diff=lfs merge=lfs -text
*.jar filter=lfs diff=lfs merge=lfs -text
*.lz filter=lfs diff=lfs merge=lfs -text
*.lzma filter=lfs diff=lfs merge=lfs -text
*.obscpio filter=lfs diff=lfs merge=lfs -text
*.oxt filter=lfs diff=lfs merge=lfs -text
*.pdf filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.rpm filter=lfs diff=lfs merge=lfs -text
*.tbz filter=lfs diff=lfs merge=lfs -text
*.tbz2 filter=lfs diff=lfs merge=lfs -text
*.tgz filter=lfs diff=lfs merge=lfs -text
*.ttf filter=lfs diff=lfs merge=lfs -text
*.txz filter=lfs diff=lfs merge=lfs -text
*.whl filter=lfs diff=lfs merge=lfs -text
*.xz filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.zst filter=lfs diff=lfs merge=lfs -text

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.osc

View File

@ -0,0 +1,12 @@
-------------------------------------------------------------------
Tue Oct 14 09:03:19 MDT 2008 - bwhiteley@suse.de
- Added license to script (bnc:434694)
- Don't fail if link destinations exist; only warn.
- Changes to make it work on python 2.4.
-------------------------------------------------------------------
Sat Sep 27 20:53:44 CEST 2008 - bwhiteley@suse.de
- Initial checkin

425
cmpi-provider-register.py Normal file
View File

@ -0,0 +1,425 @@
#!/usr/bin/env python
#*******************************************************************************
# Copyright (C) 2008 Novell, Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# - Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# - Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# - Neither the name of Novell, Inc. nor the names of its
# contributors may be used to endorse or promote products derived from this
# software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL Novell, Inc. OR THE CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
#*****************************************************************************/
from pywbem.mof_compiler import MOFCompiler, MOFWBEMConnection, MOFParseError
from optparse import OptionParser
import os
import errno
import sys
from subprocess import call, PIPE, STDOUT, Popen
import pywbem
sfcb_init_script = '/etc/init.d/sfcb'
pegasus_init_script = '/etc/init.d/tog-pegasus'
pegasus_cimserver_exe = '/usr/sbin/cimserver'
pegasus_unix_socket = '/var/run/tog-pegasus/cimxml.socket'
scx_home = '/opt/microsoft/scx'
scx_init_script = '/etc/init.d/scx-cimd'
scx_cimserver_exe = scx_home + '/bin/scxcimserver'
scx_unix_socket = '/var' + scx_home + '/tmp/cim.socket'
scx_provider_dir = scx_home + '/lib/providers'
if os.path.isdir('/usr/lib64/cmpi'):
cmpi_dir = '/usr/lib64/cmpi'
elif os.path.isdir('/usr/lib/cmpi'):
cmpi_dir = '/usr/lib/cmpi'
else:
cmpi_dir = None
sfcb_regs = []
peg_regs = []
g_verbose = False
g_restart = True
g_last_output = ''
class Error(Exception):
pass
class SimpleHandle(object):
def __init__(self):
self.default_namespace = 'root/cimv2'
class InstStoringConn(pywbem.WBEMConnection):
def __init__(self, *args, **kwargs):
self.instances = {}
pywbem.WBEMConnection.__init__(self, *args, **kwargs)
def CreateInstance(self, *args, **kwargs):
inst = len(args) > 0 and args[0] or kwargs['NewInstance']
try:
self.instances[self.default_namespace].append(inst)
except KeyError:
self.instances[self.default_namespace] = [inst]
return pywbem.WBEMConnection.CreateInstance(self, *args, **kwargs)
class SimpleCompiler(MOFCompiler):
def __init__(self):
self.first_file = True
self.handle = MOFWBEMConnection()
self.handle = SimpleHandle()
MOFCompiler.__init__(self, self.handle)
def compile_file(self, filename, ns):
if self.first_file:
self.first_file = False
self.rval = []
MOFCompiler.compile_file(self, filename, ns)
return self.rval
self.rval.append((ns, filename))
def process_sfcb(mof, stage, remove=False):
mofcomp = SimpleCompiler()
files = []
files = mofcomp.compile_file(mof, None)
for file in files:
dest = stage + '/mofs/' + file[0]
src = file[1]
if not remove:
if not os.path.exists(dest):
os.makedirs(dest)
dest+= '/' + os.path.basename(src)
if remove:
try:
os.unlink(dest)
except OSError, e:
if e.errno != errno.ENOENT:
raise
else:
if os.path.islink(dest):
if not os.path.exists(os.readlink(dest)):
os.unlink(dest)
try:
os.symlink(src, dest)
except OSError, e:
if e.errno != errno.EEXIST:
raise
if os.readlink(dest) != src:
print 'Warning: %s already exists' % dest
for src in sfcb_regs:
dest = stage + '/regs/' + os.path.basename(src)
if remove:
try:
os.unlink(dest)
except OSError, e:
if e.errno != errno.ENOENT:
raise
else:
if os.path.islink(dest):
if not os.path.exists(os.readlink(dest)):
os.unlink(dest)
try:
os.symlink(src, dest)
except OSError, e:
if e.errno != errno.EEXIST:
raise
if os.readlink(dest) != src:
print 'Warning: %s already exists' % dest
if g_restart:
sfcb_running = False
if run([sfcb_init_script, 'status']) == 0:
sfcb_running = True
run([sfcb_init_script, 'stop'])
try:
run_check(['sfcbrepos','-f'])
finally:
if sfcb_running:
run([sfcb_init_script, 'start'])
def run_check(command, *args, **kwargs):
if g_verbose:
po = Popen(command, *args, **kwargs)
output = ''
else:
po = Popen(command, stdout=PIPE, stderr=STDOUT, *args, **kwargs)
output = po.communicate()[0]
rc = po.wait()
if rc != 0:
if isinstance(command, list):
command = ' '.join(command)
err = Error("Error running '%s', returned %s" %(command, rc))
err.last_output = output
raise err
return rc
def run(command, *args, **kwargs):
global g_last_output
if g_verbose:
return call(command, *args, **kwargs)
po = Popen(command, stdout=PIPE, stderr=STDOUT, *args, **kwargs)
output = po.communicate()[0]
rc = po.wait()
if rc != 0:
g_last_output = output
return rc
def process_pegasus(mof, mofcomp, init_script, cimserver_exe, remove=False,
provider_dir=None, env=None):
""" Handle Pegasus
Arguments:
mofs -- list of MOF files
mofcomp -- instance of MOFCompiler
init_script -- Init script for Pegasus
cimserver_exe -- Full path to cimserver executable
remove -- True if we're uninstalling providers / removing schema
"""
peg_running = True
if (run([init_script, 'status']) != 0):
peg_running = False
run_check([cimserver_exe,
'enableIndicationService=false',
'enableHttpsConnection=false',
'enableHttpConnection=false'], env=env)
try:
mofcomp.compile_file(mof, 'root/cimv2')
for reg in peg_regs:
mofcomp.compile_file(reg, 'root/PG_InterOp')
if remove:
mofcomp.rollback(verbose=g_verbose)
finally:
if not peg_running:
run_check([cimserver_exe, '-s'], env=env)
if provider_dir:
try:
insts = mofcomp.handle.instances['root/PG_InterOp']
except KeyError:
insts = []
providers = [inst['Location'] for inst in insts
if inst.classname.lower() == 'pg_providermodule']
providers = list(set(providers))
for provider in providers:
libname = 'lib' + provider + '.so'
src = cmpi_dir + '/' + libname
dest = provider_dir + '/' + libname
if not remove:
if os.path.exists(src) and not os.path.exists(dest):
try:
os.symlink(src, dest)
except OSError, e:
print e
# don't remove, in case the provider is shared with other
# packages (like pyCmpiProvider)
#
#else:
# if os.path.islink(dest):
# try:
# os.unlink(dest)
# except OSError, e:
# print e
def sfcb_installed():
return os.path.exists(sfcb_init_script)
def pegasus_installed():
return os.path.exists(pegasus_init_script) and \
os.path.exists(pegasus_cimserver_exe)
def scx_installed():
return os.path.exists(scx_init_script) and \
os.path.exists(scx_cimserver_exe)
if __name__ == '__main__':
usage = 'usage: %prog [options] -d <Data Dir>'
oparser = OptionParser(usage=usage)
oparser.add_option('-s', '--search', dest='search',
help='Search path to find missing schema elements. This option can be present multiple times.',
metavar='Path', action='append')
oparser.add_option('-n', '--namespace', dest='ns',
help='Specify the namespace', metavar='Namespace',
default='root/cimv2')
oparser.add_option('-u', '--url', dest='url',
help='URL to the CIM Server', metavar='URL')
oparser.add_option('-d', '--dir', dest='dir',
help='Directory containing MOF and registration files',
metavar='Dir')
oparser.add_option('-v', '--verbose',
action='store_true', dest='verbose', default=False,
help='Print more messages to stdout')
oparser.add_option('-r', '--remove',
action='store_true', dest='remove', default=False,
help='Remove elements found in MOF, instead of create them')
oparser.add_option('-x', '--no-restart',
action='store_true', dest='no_restart', default=False,
help="Don't run 'sfcbrepos', don't restart sfcbd")
oparser.add_option('-l', '--username',
dest='username', metavar='Username',
help='Specify the username')
oparser.add_option('-p', '--password',
dest='password', metavar='Password',
help='Specify the password')
oparser.add_option('-g', '--stage',
dest='stage', metavar='SFCB stage',
help='Specify the SFCB stage directory',
default='/var/lib/sfcb/stage')
(options, args) = oparser.parse_args()
try:
if options.dir is None:
oparser.error('No directory given')
options.dir = os.path.abspath(options.dir)
if not os.path.isdir(options.dir):
print 'Error: %s is not a directory' % options.dir
sys.exit(1)
moffile = options.dir + '/deploy.mof'
if not os.path.exists(moffile):
print 'Error: missing file:', moffile
sys.exit(1)
elems = os.listdir(options.dir)
for elem in elems:
if elem.endswith('.sfcb.reg'):
sfcb_regs.append(options.dir + '/' + elem)
elif elem.endswith('.peg.reg'):
peg_regs.append(options.dir + '/' + elem)
g_verbose = options.verbose
g_restart = not options.no_restart
do_sfcb = sfcb_installed() and sfcb_regs
do_pegasus = pegasus_installed() and peg_regs
do_scx = scx_installed() and peg_regs
do_scx = do_scx and (options.url == ':scx:' or not options.url)
do_pegasus = do_pegasus and (options.url == ':tog-pegasus:' or
not options.url)
if do_sfcb:
process_sfcb(moffile, options.stage, options.remove)
search = options.search
if args:
oparser.error('Extra arguments given')
pegs = []
if not pegasus_installed() and options.url == ':tog-pegasus:':
print 'Error: tog-pegasus is not installed'
sys.exit(1)
if not scx_installed() and options.url == ':scx:':
print 'Error: SCX is not installed'
sys.exit(1)
if do_pegasus:
pegs.append({'url':pegasus_unix_socket,
'exe':pegasus_cimserver_exe,
'init':pegasus_init_script,
'provider_dir':None,
'env':None,
})
if do_scx:
env = os.environ.copy()
ldp = '%(h)s/lib:%(h)s/lib/providers:%(h)s/lib/providers/ext' % \
{'h':scx_home}
if 'LD_LIBRARY_PATH' in env:
ldp+= ':' + env['LD_LIBRARY_PATH']
env['LD_LIBRARY_PATH'] = ldp
pegs.append({'url':scx_unix_socket,
'exe':scx_cimserver_exe,
'init':scx_init_script,
'provider_dir':scx_provider_dir,
'env':env,
})
if not pegs and options.url:
pegs = [{'url':options.url,
'exe':None,
'init':None,
}]
passwd = options.password
if options.username and not passwd:
passwd = getpass('Enter password for %s: ' % options.username)
if options.username:
creds = (options.username, passwd)
else:
creds = None
if search is None:
search = ['/usr/share/mof/cim-current']
search.append(os.path.abspath(options.dir))
# if removing, we'll be verbose later when we actually remove stuff.
# We don't want MOFCompiler to be verbose, as that would be confusing.
verbose = options.verbose and not options.remove
for peg in pegs:
if options.remove:
conn = pywbem.WBEMConnection(peg['url'], creds)
conn = MOFWBEMConnection(conn=conn)
else:
conn = InstStoringConn(peg['url'], creds)
#conn.debug = True
conn.default_namespace = options.ns
mofcomp = MOFCompiler(handle=conn, search_paths=search, verbose=verbose)
try:
process_pegasus(moffile, mofcomp, peg['init'], peg['exe'],
remove=options.remove, provider_dir=peg['provider_dir'],
env=peg['env'])
except MOFParseError, pe:
sys.exit(1)
except pywbem.CIMError, ce:
sys.exit(1)
except Error, e:
print str(e)
if hasattr(e, 'last_output'):
print e.last_output
sys.exit(1)

View File

@ -0,0 +1,62 @@
#
# spec file for package cmpi-provider-register (Version 1.0)
#
# Copyright (c) 2008 SUSE LINUX Products GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
# Please submit bugfixes or comments via http://bugs.opensuse.org/
#
Name: cmpi-provider-register
Version: 1.0
Release: 1
License: BSD 3-Clause
BuildRoot: %{_tmppath}/%{name}-%{version}-build
Group: System/Management
Summary: CIMOM neutral provider registration utility
Requires: python-pywbem cim-schema
BuildRequires: cim-schema python-pywbem
BuildArch: noarch
Source0: %{name}.py
%description
A utility allowing CMPI provider packages to register with whatever
CIMOM(s) happens to be present on the system.
Authors:
--------
Bart Whiteley
%prep
%build
%install
%{__mkdir} -p $RPM_BUILD_ROOT/usr/sbin
install -m 744 %{S:0} $RPM_BUILD_ROOT/usr/sbin/%{name}
%clean
rm -rf "$RPM_BUILD_ROOT"
%files
%defattr(-,root,root)
/usr/sbin/*
%changelog
* Tue Oct 14 2008 bwhiteley@suse.de
- Added license to script (bnc:434694)
- Don't fail if link destinations exist; only warn.
- Changes to make it work on python 2.4.
* Sat Sep 27 2008 bwhiteley@suse.de
- Initial checkin

0
ready Normal file
View File