You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1341 lines
50 KiB
1341 lines
50 KiB
diff --git a/Makefile.defs b/Makefile.defs
|
|
index 94e4c2c..bce7a2c 100644
|
|
--- a/Makefile.defs
|
|
+++ b/Makefile.defs
|
|
@@ -1,6 +1,5 @@
|
|
-# Common pathnames and programs for the RHN project
|
|
+# Common pathnames and programs for the Spacewalk project
|
|
#
|
|
-# $Id$
|
|
|
|
# if not defined, definit as a noop
|
|
TOP ?= .
|
|
@@ -26,18 +25,15 @@ INSTALL_DIR = $(INSTALL) -m 755 -d
|
|
|
|
# This is for the subdir part
|
|
PYFILES = $(addsuffix .py,$(FILES))
|
|
-PYCFILES = $(addsuffix .pyc,$(FILES))
|
|
|
|
# This is for the subdir part
|
|
VIRT_PYFILES = $(addsuffix .py,$(VIRT_FILES))
|
|
-VIRT_PYCFILES = $(addsuffix .pyc,$(VIRT_FILES))
|
|
-VIRT_PYOFILES = $(addsuffix .pyo,$(VIRT_FILES))
|
|
|
|
# what do we need to install and where
|
|
-INSTALL_FILES += $(PYFILES) $(PYCFILES)
|
|
+INSTALL_FILES += $(PYFILES)
|
|
INSTALL_DEST ?= $(ROOT)/$(SUBDIR)
|
|
|
|
-VIRT_INSTALL_FILES = $(VIRT_PYFILES) $(VIRT_PYCFILES) $(VIRT_PYOFILES)
|
|
+VIRT_INSTALL_FILES = $(VIRT_PYFILES)
|
|
|
|
DIRS += $(addprefix $(PREFIX), \
|
|
$(sort $(EXTRA_DIRS)) $(INSTALL_DEST))
|
|
@@ -57,12 +53,6 @@ clean ::
|
|
@rm -fv .\#*
|
|
@rm -fv core
|
|
|
|
-# default compile rules
|
|
-%.pyc : %.py
|
|
- $(TOP)/compile.py $< $@
|
|
-%.pyo : %.py
|
|
- python -OO $(TOP)/compile.py $< $@
|
|
-
|
|
# useful macro
|
|
descend-subdirs = @$(foreach d,$(SUBDIRS), $(MAKE) -C $(d) $@ || exit 1; )
|
|
|
|
@@ -85,7 +75,7 @@ pychecker :: $(PYFILES)
|
|
$(descend-subdirs)
|
|
|
|
db-checker :: $(PYFILES)
|
|
- @PYTHONPATH=$(PYTHONPATH) $(TOP)/$(DBCHECKER) $(DBCHECKEROPTS) --db $(DB) $(PYFILES) || :
|
|
+ @PYTHONPATH=$(PYTHONPATH) $(TOP)/$(DBCHECKER) $(DBCHECKEROPTS) $(PYFILES) || :
|
|
$(descend-subdirs)
|
|
|
|
graphviz ::
|
|
diff --git a/PYTHON-LICENSES.txt b/PYTHON-LICENSES.txt
|
|
deleted file mode 100644
|
|
index cbb5205..0000000
|
|
--- a/PYTHON-LICENSES.txt
|
|
+++ /dev/null
|
|
@@ -1,195 +0,0 @@
|
|
-Some portions of this software incorporate material derived from one
|
|
-or more releases of Python and covered by the following copyright
|
|
-notices and licensing terms.
|
|
-
|
|
-
|
|
-
|
|
-Copyright (c) 2001, 2002, 2003 Python Software Foundation; All Rights
|
|
-Reserved
|
|
-
|
|
-1. This LICENSE AGREEMENT is between the Python Software Foundation
|
|
-("PSF"), and the Individual or Organization ("Licensee") accessing and
|
|
-otherwise using Python 2.2.3 software in source or binary form and its
|
|
-associated documentation.
|
|
-
|
|
-2. Subject to the terms and conditions of this License Agreement, PSF
|
|
-hereby grants Licensee a nonexclusive, royalty-free, world-wide
|
|
-license to reproduce, analyze, test, perform and/or display publicly,
|
|
-prepare derivative works, distribute, and otherwise use Python 2.2.3
|
|
-alone or in any derivative version, provided, however, that PSF's
|
|
-License Agreement and PSF's notice of copyright, i.e., "Copyright (c)
|
|
-2001, 2002, 2003 Python Software Foundation; All Rights Reserved" are
|
|
-retained in Python 2.2.3 alone or in any derivative version prepared
|
|
-by Licensee.
|
|
-
|
|
-3. In the event Licensee prepares a derivative work that is based on
|
|
-or incorporates Python 2.2.3 or any part thereof, and wants to make
|
|
-the derivative work available to others as provided herein, then
|
|
-Licensee hereby agrees to include in any such work a brief summary of
|
|
-the changes made to Python 2.2.3.
|
|
-
|
|
-4. PSF is making Python 2.2.3 available to Licensee on an "AS IS"
|
|
-basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
|
|
-IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
|
|
-DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
|
|
-FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 2.2.3 WILL NOT
|
|
-INFRINGE ANY THIRD PARTY RIGHTS.
|
|
-
|
|
-5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
|
|
-2.2.3 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
|
|
-A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 2.2.3,
|
|
-OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
|
|
-
|
|
-6. This License Agreement will automatically terminate upon a material
|
|
-breach of its terms and conditions.
|
|
-
|
|
-7. Nothing in this License Agreement shall be deemed to create any
|
|
-relationship of agency, partnership, or joint venture between PSF and
|
|
-Licensee. This License Agreement does not grant permission to use PSF
|
|
-trademarks or trade name in a trademark sense to endorse or promote
|
|
-products or services of Licensee, or any third party.
|
|
-
|
|
-8. By copying, installing or otherwise using Python 2.2.3, Licensee
|
|
-agrees to be bound by the terms and conditions of this License
|
|
-Agreement.
|
|
-
|
|
-
|
|
-
|
|
-BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
|
|
-
|
|
-1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
|
|
-office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
|
|
-Individual or Organization ("Licensee") accessing and otherwise using
|
|
-this software in source or binary form and its associated
|
|
-documentation ("the Software").
|
|
-
|
|
-2. Subject to the terms and conditions of this BeOpen Python License
|
|
-Agreement, BeOpen hereby grants Licensee a non-exclusive,
|
|
-royalty-free, world-wide license to reproduce, analyze, test, perform
|
|
-and/or display publicly, prepare derivative works, distribute, and
|
|
-otherwise use the Software alone or in any derivative version,
|
|
-provided, however, that the BeOpen Python License is retained in the
|
|
-Software, alone or in any derivative version prepared by Licensee.
|
|
-
|
|
-3. BeOpen is making the Software available to Licensee on an "AS IS"
|
|
-basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
|
|
-IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
|
|
-DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
|
|
-FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
|
|
-INFRINGE ANY THIRD PARTY RIGHTS.
|
|
-
|
|
-4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
|
|
-SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
|
|
-AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
|
|
-DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
|
|
-
|
|
-5. This License Agreement will automatically terminate upon a material
|
|
-breach of its terms and conditions.
|
|
-
|
|
-6. This License Agreement shall be governed by and interpreted in all
|
|
-respects by the law of the State of California, excluding conflict of
|
|
-law provisions. Nothing in this License Agreement shall be deemed to
|
|
-create any relationship of agency, partnership, or joint venture
|
|
-between BeOpen and Licensee. This License Agreement does not grant
|
|
-permission to use BeOpen trademarks or trade names in a trademark
|
|
-sense to endorse or promote products or services of Licensee, or any
|
|
-third party. As an exception, the "BeOpen Python" logos available at
|
|
-http://www.pythonlabs.com/logos.html may be used according to the
|
|
-permissions granted on that web page.
|
|
-
|
|
-7. By copying, installing or otherwise using the software, Licensee
|
|
-agrees to be bound by the terms and conditions of this License
|
|
-Agreement.
|
|
-
|
|
-
|
|
-
|
|
-Copyright (c) 1995-2001 Corporation for National Research Initiatives;
|
|
-All Rights Reserved
|
|
-
|
|
-1. This LICENSE AGREEMENT is between the Corporation for National
|
|
-Research Initiatives, having an office at 1895 Preston White Drive,
|
|
-Reston, VA 20191 ("CNRI"), and the Individual or Organization
|
|
-("Licensee") accessing and otherwise using Python 1.6.1 software in
|
|
-source or binary form and its associated documentation.
|
|
-
|
|
-2. Subject to the terms and conditions of this License Agreement, CNRI
|
|
-hereby grants Licensee a nonexclusive, royalty-free, world-wide
|
|
-license to reproduce, analyze, test, perform and/or display publicly,
|
|
-prepare derivative works, distribute, and otherwise use Python 1.6.1
|
|
-alone or in any derivative version, provided, however, that CNRI's
|
|
-License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
|
|
-1995-2001 Corporation for National Research Initiatives; All Rights
|
|
-Reserved" are retained in Python 1.6.1 alone or in any derivative
|
|
-version prepared by Licensee. Alternately, in lieu of CNRI's License
|
|
-Agreement, Licensee may substitute the following text (omitting the
|
|
-quotes): "Python 1.6.1 is made available subject to the terms and
|
|
-conditions in CNRI's License Agreement. This Agreement together with
|
|
-Python 1.6.1 may be located on the Internet using the following
|
|
-unique, persistent identifier (known as a handle): 1895.22/1013. This
|
|
-Agreement may also be obtained from a proxy server on the Internet
|
|
-using the following URL: http://hdl.handle.net/1895.22/1013".
|
|
-
|
|
-3. In the event Licensee prepares a derivative work that is based on
|
|
-or incorporates Python 1.6.1 or any part thereof, and wants to make
|
|
-the derivative work available to others as provided herein, then
|
|
-Licensee hereby agrees to include in any such work a brief summary of
|
|
-the changes made to Python 1.6.1.
|
|
-
|
|
-4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
|
|
-basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
|
|
-IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
|
|
-DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
|
|
-FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
|
|
-INFRINGE ANY THIRD PARTY RIGHTS.
|
|
-
|
|
-5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
|
|
-1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
|
|
-A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
|
|
-OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
|
|
-
|
|
-6. This License Agreement will automatically terminate upon a material
|
|
-breach of its terms and conditions.
|
|
-
|
|
-7. This License Agreement shall be governed by the federal
|
|
-intellectual property law of the United States, including without
|
|
-limitation the federal copyright law, and, to the extent such
|
|
-U.S. federal law does not apply, by the law of the Commonwealth of
|
|
-Virginia, excluding Virginia's conflict of law provisions.
|
|
-Notwithstanding the foregoing, with regard to derivative works based
|
|
-on Python 1.6.1 that incorporate non-separable material that was
|
|
-previously distributed under the GNU General Public License (GPL), the
|
|
-law of the Commonwealth of Virginia shall govern this License
|
|
-Agreement only as to issues arising under or with respect to
|
|
-Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this
|
|
-License Agreement shall be deemed to create any relationship of
|
|
-agency, partnership, or joint venture between CNRI and Licensee. This
|
|
-License Agreement does not grant permission to use CNRI trademarks or
|
|
-trade name in a trademark sense to endorse or promote products or
|
|
-services of Licensee, or any third party.
|
|
-
|
|
-8. By clicking on the "ACCEPT" button where indicated, or by copying,
|
|
-installing or otherwise using Python 1.6.1, Licensee agrees to be
|
|
-bound by the terms and conditions of this License Agreement.
|
|
-
|
|
-
|
|
-
|
|
-Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
|
|
-The Netherlands. All rights reserved.
|
|
-
|
|
-Permission to use, copy, modify, and distribute this software and its
|
|
-documentation for any purpose and without fee is hereby granted,
|
|
-provided that the above copyright notice appear in all copies and that
|
|
-both that copyright notice and this permission notice appear in
|
|
-supporting documentation, and that the name of Stichting Mathematisch
|
|
-Centrum or CWI not be used in advertising or publicity pertaining to
|
|
-distribution of the software without specific, written prior
|
|
-permission.
|
|
-
|
|
-STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
|
|
-THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
-FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
|
|
-FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
|
-OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
-
|
|
diff --git a/actions/Makefile b/actions/Makefile
|
|
index 3ff0cdf..014933d 100644
|
|
--- a/actions/Makefile
|
|
+++ b/actions/Makefile
|
|
@@ -1,10 +1,9 @@
|
|
# Makefile for the backend directory
|
|
#
|
|
-# $Id$
|
|
|
|
TOP = ..
|
|
ROOT = /usr/share/rhn
|
|
-SUBDIR = actions
|
|
+SUBDIR = rhn/actions
|
|
FILES = kickstart
|
|
CAPS = kickstart
|
|
CAPS_DIR = /etc/sysconfig/rhn/clientCaps.d
|
|
diff --git a/actions/kickstart.py b/actions/kickstart.py
|
|
index e89f3eb..abea364 100644
|
|
--- a/actions/kickstart.py
|
|
+++ b/actions/kickstart.py
|
|
@@ -1,5 +1,5 @@
|
|
#
|
|
-# Copyright (c) 2008 Red Hat, Inc.
|
|
+# Copyright (c) 2008--2013 Red Hat, Inc.
|
|
#
|
|
# This software is licensed to you under the GNU General Public License,
|
|
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
|
|
@@ -7,10 +7,10 @@
|
|
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
|
|
# along with this software; if not, see
|
|
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
|
|
-#
|
|
+#
|
|
# Red Hat trademarks are not licensed under GPLv2. No permission is
|
|
# granted to use or replicate Red Hat trademarks that are incorporated
|
|
-# in this software or its documentation.
|
|
+# in this software or its documentation.
|
|
#
|
|
|
|
import sys
|
|
@@ -26,8 +26,8 @@ __rhnexport__ = [
|
|
'initiate',
|
|
]
|
|
|
|
-def initiate(kickstart_host, base, extra_append, static_device="", system_record="", preserve_files=[]):
|
|
- log = up2dateLog.initLog()
|
|
+def initiate(kickstart_host, base, extra_append, static_device="", system_record="", preserve_files=[], cache_only=False):
|
|
+ log = up2dateLog.initLog()
|
|
log.log_me("initiating spacewalkkoan kickstart")
|
|
return spacewalkkoan.initiate(kickstart_host, base, extra_append=extra_append,
|
|
static_device=static_device, system_record=system_record, preserve_files=preserve_files)
|
|
diff --git a/actions/kickstart_guest.py b/actions/kickstart_guest.py
|
|
index 168ee42..aa718cb 100644
|
|
--- a/actions/kickstart_guest.py
|
|
+++ b/actions/kickstart_guest.py
|
|
@@ -1,5 +1,5 @@
|
|
#
|
|
-# Copyright (c) 2008 Red Hat, Inc.
|
|
+# Copyright (c) 2008--2014 Red Hat, Inc.
|
|
#
|
|
# This software is licensed to you under the GNU General Public License,
|
|
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
|
|
@@ -7,10 +7,10 @@
|
|
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
|
|
# along with this software; if not, see
|
|
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
|
|
-#
|
|
+#
|
|
# Red Hat trademarks are not licensed under GPLv2. No permission is
|
|
# granted to use or replicate Red Hat trademarks that are incorporated
|
|
-# in this software or its documentation.
|
|
+# in this software or its documentation.
|
|
#
|
|
|
|
import sys
|
|
@@ -19,12 +19,8 @@ rhnpath="/usr/share/rhn"
|
|
if rhnpath not in sys.path:
|
|
sys.path.append(rhnpath)
|
|
|
|
-#from rhnkickstart import kickstart_guest
|
|
from spacewalkkoan import spacewalkkoan
|
|
|
|
-#from rhnkickstart.virtualization_kickstart_exceptions \
|
|
-# import VirtualizationKickstartException
|
|
-
|
|
from virtualization.batching_log_notifier import BatchNotifyHandler
|
|
from virtualization.constants import PropertyType
|
|
from virtualization.notification import Plan, \
|
|
@@ -39,7 +35,9 @@ __rhnexport__ = [
|
|
# Public Interface
|
|
###############################################################################
|
|
|
|
-def initiate(kickstart_host, cobbler_system_name, virt_type, ks_session_id, name, mem_kb, vcpus, disk_gb, virt_bridge, disk_path, extra_append):
|
|
+def initiate(kickstart_host, cobbler_system_name, virt_type, ks_session_id, name, mem_kb, vcpus, disk_gb, virt_bridge, disk_path, extra_append, cache_only=None):
|
|
+ if cache_only:
|
|
+ return (0, "no-ops for caching", {})
|
|
error_code = 0
|
|
status_message = 'Guest kickstart initiated successfully.'
|
|
error_messages = {}
|
|
@@ -54,7 +52,7 @@ def initiate(kickstart_host, cobbler_system_name, virt_type, ks_session_id, name
|
|
###############################################################################
|
|
|
|
class KickstartLogNotifyHandler(BatchNotifyHandler):
|
|
-
|
|
+
|
|
def __init__(self, ks_session_id):
|
|
self.__ks_session_id = ks_session_id
|
|
self.__plan = None
|
|
diff --git a/compile.py b/compile.py
|
|
deleted file mode 100755
|
|
index 09bb23c..0000000
|
|
--- a/compile.py
|
|
+++ /dev/null
|
|
@@ -1,105 +0,0 @@
|
|
-#!/usr/bin/python
|
|
-#
|
|
-# Copyright (c) 2008 Red Hat, Inc.
|
|
-#
|
|
-# This software is licensed to you under the GNU General Public License,
|
|
-# version 2 (GPLv2). There is NO WARRANTY for this software, express or
|
|
-# implied, including the implied warranties of MERCHANTABILITY or FITNESS
|
|
-# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
|
|
-# along with this software; if not, see
|
|
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
|
|
-#
|
|
-# Red Hat trademarks are not licensed under GPLv2. No permission is
|
|
-# granted to use or replicate Red Hat trademarks that are incorporated
|
|
-# in this software or its documentation.
|
|
-#
|
|
-#
|
|
-# python compiler. "Borrowed" from Python's py_compile module. As
|
|
-# opposed to the Python one, this script returns error codes when a
|
|
-# compile fails, so it can be used from Makefiles
|
|
-#
|
|
-# $Id$
|
|
-
|
|
-import os
|
|
-import sys
|
|
-import marshal
|
|
-import traceback
|
|
-import string
|
|
-import __builtin__
|
|
-
|
|
-import imp
|
|
-MAGIC = imp.get_magic()
|
|
-
|
|
-if len(sys.argv) != 3:
|
|
- print "Usage:", sys.argv[0], "infile outfile"
|
|
- sys.exit(-1)
|
|
-infile = sys.argv[1]
|
|
-outfile = sys.argv[2]
|
|
-
|
|
-def wr_long(f, x):
|
|
- "Internal; write a 32-bit int to a file in little-endian order."
|
|
- f.write(chr( x & 0xff))
|
|
- f.write(chr((x >> 8) & 0xff))
|
|
- f.write(chr((x >> 16) & 0xff))
|
|
- f.write(chr((x >> 24) & 0xff))
|
|
-
|
|
-def compile(file, cfile=None, dfile=None):
|
|
- """Byte-compile one Python source file to Python bytecode.
|
|
-
|
|
- Arguments:
|
|
-
|
|
- file: source filename
|
|
- cfile: target filename; defaults to source with 'c' or 'o' appended
|
|
- ('c' normally, 'o' in optimizing mode, giving .pyc or .pyo)
|
|
- dfile: purported filename; defaults to source (this is the filename
|
|
- that will show up in error messages)
|
|
-
|
|
- Note that it isn't necessary to byte-compile Python modules for
|
|
- execution efficiency -- Python itself byte-compiles a module when
|
|
- it is loaded, and if it can, writes out the bytecode to the
|
|
- corresponding .pyc (or .pyo) file.
|
|
-
|
|
- However, if a Python installation is shared between users, it is a
|
|
- good idea to byte-compile all modules upon installation, since
|
|
- other users may not be able to write in the source directories,
|
|
- and thus they won't be able to write the .pyc/.pyo file, and then
|
|
- they would be byte-compiling every module each time it is loaded.
|
|
- This can slow down program start-up considerably.
|
|
-
|
|
- See compileall.py for a script/module that uses this module to
|
|
- byte-compile all installed files (or all files in selected
|
|
- directories).
|
|
- """
|
|
-
|
|
- f = open(file)
|
|
- try:
|
|
- timestamp = long(os.fstat(f.fileno())[8])
|
|
- except AttributeError:
|
|
- timestamp = long(os.stat(file)[8])
|
|
- codestring = f.read()
|
|
- f.close()
|
|
- if codestring and codestring[-1] != '\n':
|
|
- codestring = codestring + '\n'
|
|
- try:
|
|
- codeobject = __builtin__.compile(codestring, dfile or file, 'exec')
|
|
- except SyntaxError, detail:
|
|
- lines = traceback.format_exception_only(SyntaxError, detail)
|
|
- sys.stderr.write("%s: Error compiling\n" % file)
|
|
- for line in lines:
|
|
- sys.stderr.write(string.replace(line, 'File "<string>"',
|
|
- 'File "%s"' % (dfile or file)))
|
|
- return -1
|
|
- if not cfile:
|
|
- cfile = file + (__debug__ and 'c' or 'o')
|
|
- fc = open(cfile, 'wb')
|
|
- fc.write('\0\0\0\0')
|
|
- wr_long(fc, timestamp)
|
|
- marshal.dump(codeobject, fc)
|
|
- fc.flush()
|
|
- fc.seek(0, 0)
|
|
- fc.write(MAGIC)
|
|
- fc.close()
|
|
- return 0
|
|
-
|
|
-if compile(infile, outfile) != 0:
|
|
- sys.exit(-1)
|
|
diff --git a/merge-rd.sh b/merge-rd.sh
|
|
index cd104fb..a141e13 100644
|
|
--- a/merge-rd.sh
|
|
+++ b/merge-rd.sh
|
|
@@ -1,10 +1,12 @@
|
|
-#!/bin/sh
|
|
+#!/bin/bash
|
|
|
|
# a fairly simple script to merge a given tree into an existing,
|
|
# bootable ramdisk. a new ramdisk is created since space may be an
|
|
# issue (especially if we start letting people put their own files in
|
|
# here to preserve across the install).
|
|
|
|
+set -e
|
|
+
|
|
unset LANG
|
|
|
|
unset PATH
|
|
@@ -14,14 +16,8 @@ SOURCE_INITRD=$1
|
|
DEST_INITRD=$2
|
|
USER_TREE=$3
|
|
|
|
-# Make sure we get the full pathnames.
|
|
-
|
|
-SOURCE_INITRD=`(cd \`dirname $SOURCE_INITRD\` ; pwd)`/`basename $SOURCE_INITRD`
|
|
-DEST_INITRD=`(cd \`dirname $DEST_INITRD\` ; pwd)`/`basename $DEST_INITRD`
|
|
-USER_TREE=`(cd $USER_TREE ; pwd)`
|
|
-
|
|
fatal() {
|
|
- err=$1; shift; echo "$*"; exit $err
|
|
+ err=$1; shift; >&2 echo "$*"; exit $err
|
|
}
|
|
|
|
usage() {
|
|
@@ -49,15 +45,21 @@ get_initrd_type() {
|
|
INITRD_TYPE=$INITRD_TYPE_CPIO
|
|
elif file $UNCOMPRESSED_INITRD | grep ext2 > /dev/null 2>&1 ; then
|
|
INITRD_TYPE=$INITRD_TYPE_EXT2
|
|
+ else
|
|
+ fatal 9 "Cannot get initrd type"
|
|
fi
|
|
|
|
- return $INITRD_TYPE
|
|
+ echo $INITRD_TYPE
|
|
}
|
|
|
|
uncompress_rd() {
|
|
local COMPRESSED_INITRD=$1
|
|
local UNCOMPRESSED_INITRD=$2
|
|
- zcat $COMPRESSED_INITRD > $UNCOMPRESSED_INITRD
|
|
+ if ! zcat $COMPRESSED_INITRD > $UNCOMPRESSED_INITRD 2> /dev/null; then
|
|
+ if ! xzcat $COMPRESSED_INITRD > $UNCOMPRESSED_INITRD 2> /dev/null; then
|
|
+ fatal 9 "Error uncompressing $COMPRESSED_INITRD"
|
|
+ fi
|
|
+ fi
|
|
}
|
|
|
|
# Expands the provided initrd file into the specified directory. Returns the
|
|
@@ -66,8 +68,7 @@ expand_rd() {
|
|
local UNCOMPRESSED_INITRD=$1
|
|
local TARGET_TREE=$2
|
|
|
|
- get_initrd_type $UNCOMPRESSED_SOURCE_INITRD
|
|
- local INITRD_TYPE=$?
|
|
+ local INITRD_TYPE=$(get_initrd_type $UNCOMPRESSED_SOURCE_INITRD)
|
|
|
|
mkdir -p $TARGET_TREE
|
|
|
|
@@ -109,7 +110,7 @@ create_rd() {
|
|
mkdir $TARGET_MOUNTED
|
|
mount -o loop $TARGET_INITRD $TARGET_MOUNTED || \
|
|
fatal 6 "mount of dest image"
|
|
- tarcp $EXISTING_TREE $TARGET_MOUNTED
|
|
+ tarcp $EXISTING_TREE $TARGET_MOUNTED || fatal 9 "Error while extracting archive to final destination"
|
|
umount $TARGET_MOUNTED
|
|
|
|
elif [ $INITRD_TYPE -eq $INITRD_TYPE_CPIO ] ; then
|
|
@@ -143,7 +144,11 @@ estimate_merged_rd_size() {
|
|
local ORIG_SIZE=$(du -s -b $SOURCE_TREE | cut -f 1)
|
|
local MERGED_SIZE=$(du -s -b $MERGED_TREE | cut -f 1)
|
|
local DELTA="$(($MERGED_SIZE - $ORIG_SIZE))"
|
|
- local ORIG_RD_SIZE=$(zcat $SOURCE_INITRD | wc -c)
|
|
+ if ! zcat $SOURCE_INITRD >& /dev/null && local ORIG_RD_SIZE=$(zcat $SOURCE_INITRD | wc -c); then
|
|
+ if ! xzcat $SOURCE_INITRD >& /dev/null && local ORIG_RD_SIZE=$(xzcat $SOURCE_INITRD | wc -c); then
|
|
+ fatal 9 "Unable to estimate merge size"
|
|
+ fi
|
|
+ fi
|
|
local MERGED_RD_SIZE="$(( 12 * ($ORIG_RD_SIZE + $DELTA) / 10 ))"
|
|
|
|
eval "$RESULT_ASSN=\"$MERGED_RD_SIZE\""
|
|
@@ -155,15 +160,25 @@ remove_tree() {
|
|
# The tree may or may not be mounted, depending on the type of initrd
|
|
# that was used to create it.
|
|
|
|
- umount $TREE_TO_REMOVE > /dev/null 2>&1
|
|
+ # Force 'true' even when umount exits with an error to not block the
|
|
+ # execution of the script (see set -e at the top of the file).
|
|
+ # The script forces the umount even when mount has not been used.
|
|
+ umount $TREE_TO_REMOVE > /dev/null 2>&1 || true
|
|
rm -rf $TREE_TO_REMOVE
|
|
}
|
|
|
|
################################ Main #########################################
|
|
|
|
-[ -e "$SOURCE_INITRD" ] || usage
|
|
+[ -e "$SOURCE_INITRD" ] || fatal 1 "Cannot find initrd $SOURCE_INITRD"
|
|
+[ -d "$(dirname $DEST_INITRD)" ] || fatal 1 "Cannot find final destination dir: $(dirname $DEST_INITRD)"
|
|
+[ -d "$USER_TREE" ] || fatal 1 "Cannot find user tree: $USER_TREE"
|
|
+
|
|
+# Make sure we get the full pathnames.
|
|
+
|
|
+SOURCE_INITRD=`(cd \`dirname $SOURCE_INITRD\` ; pwd)`/`basename $SOURCE_INITRD`
|
|
+DEST_INITRD=`(cd \`dirname $DEST_INITRD\` ; pwd)`/`basename $DEST_INITRD`
|
|
+USER_TREE=`(cd $USER_TREE ; pwd)`
|
|
|
|
-[ -d "$USER_TREE" ] || usage
|
|
|
|
TEMP_DIR=$(mktemp -d /tmp/mergerd.XXXXXX)
|
|
[ -d $TEMP_DIR ] || fatal 2 "mktemp failed"
|
|
@@ -189,8 +204,7 @@ tarcp $USER_TREE $MERGED_TREE || fatal 5 "copy of merge tree into rd"
|
|
# Determine the type of the initrd and create a new one.
|
|
|
|
estimate_merged_rd_size $SOURCE_TREE $MERGED_TREE ESTIMATED_SIZE
|
|
-get_initrd_type $UNCOMPRESSED_SOURCE_INITRD
|
|
-SOURCE_INITRD_TYPE=$?
|
|
+SOURCE_INITRD_TYPE=$(get_initrd_type $UNCOMPRESSED_SOURCE_INITRD)
|
|
create_rd $SOURCE_INITRD_TYPE \
|
|
$UNCOMPRESSED_MERGED_INITRD \
|
|
$MERGED_TREE \
|
|
diff --git a/spacewalk-koan.spec b/spacewalk-koan.spec
|
|
index 9016d9f..471926a 100644
|
|
--- a/spacewalk-koan.spec
|
|
+++ b/spacewalk-koan.spec
|
|
@@ -1,32 +1,53 @@
|
|
+%if 0%{?fedora} || 0%{?suse_version} > 1320
|
|
+%global build_py3 1
|
|
+%global default_py3 1
|
|
+%endif
|
|
+
|
|
+%define pythonX %{?default_py3: python3}%{!?default_py3: python2}
|
|
+
|
|
Summary: Support package for spacewalk koan interaction
|
|
Name: spacewalk-koan
|
|
-Group: System Environment/Kernel
|
|
+Version: 2.8.6
|
|
+Release: 2%{?dist}
|
|
License: GPLv2
|
|
-Source0: https://fedorahosted.org/releases/s/p/spacewalk/%{name}-%{version}.tar.gz
|
|
-Version: 0.1.11
|
|
-Release: 13%{?dist}
|
|
-BuildArch : noarch
|
|
-URL: https://fedorahosted.org/spacewalk
|
|
-BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
|
|
+Source0: https://github.com/spacewalkproject/spacewalk/archive/%{name}-%{version}.tar.gz
|
|
+URL: https://github.com/spacewalkproject/spacewalk
|
|
BuildArch: noarch
|
|
-BuildRequires: python
|
|
-Requires: python >= 1.5
|
|
-Requires: koan >= 1.4.3
|
|
+Requires: %{pythonX}-%{name} = %{version}-%{release}
|
|
+Requires: koan20
|
|
+Requires: xz
|
|
+Conflicts: rhn-kickstart
|
|
+Conflicts: rhn-kickstart-common
|
|
+Conflicts: rhn-kickstart-virtualization
|
|
|
|
-Provides: rhn.kickstart.boot_image = 5.3.0
|
|
-Provides: rhn-kickstart = 5.3.0
|
|
-Conflicts: rhn-kickstart < 5.3.0
|
|
-
|
|
-# If this is rhel 4 or less we need up2date.
|
|
-%if 0%{?rhel} < 5
|
|
-Requires: up2date
|
|
-%else
|
|
Requires: rhn-check
|
|
-%endif
|
|
|
|
%description
|
|
Support package for spacewalk koan interaction.
|
|
|
|
+%package -n python2-%{name}
|
|
+Summary: Support package for spacewalk koan interaction
|
|
+%{?python_provide:%python_provide python2-%{name}}
|
|
+BuildRequires: python
|
|
+Requires: python
|
|
+%if 0%{?suse_version}
|
|
+# provide directories for filelist check in OBS
|
|
+BuildRequires: rhn-client-tools
|
|
+%endif
|
|
+%description -n python2-%{name}
|
|
+Python 2 specific files for %{name}.
|
|
+
|
|
+%if 0%{?build_py3}
|
|
+%package -n python3-%{name}
|
|
+Summary: Support package for spacewalk koan interaction
|
|
+%{?python_provide:%python_provide python3-%{name}}
|
|
+BuildRequires: python3
|
|
+BuildRequires: python3-rpm-macros
|
|
+Requires: python3
|
|
+%description -n python3-%{name}
|
|
+Python 3 specific files for %{name}.
|
|
+%endif
|
|
+
|
|
%prep
|
|
%setup -q
|
|
|
|
@@ -34,94 +55,129 @@ Support package for spacewalk koan interaction.
|
|
make -f Makefile.spacewalk-koan all
|
|
|
|
%install
|
|
-rm -rf $RPM_BUILD_ROOT
|
|
-make -f Makefile.spacewalk-koan install PREFIX=$RPM_BUILD_ROOT ROOT=%{_datadir}/rhn/ \
|
|
+make -f Makefile.spacewalk-koan install PREFIX=$RPM_BUILD_ROOT ROOT=%{python_sitelib} \
|
|
+ MANDIR=%{_mandir}
|
|
+
|
|
+%if 0%{?build_py3}
|
|
+make -f Makefile.spacewalk-koan install PREFIX=$RPM_BUILD_ROOT ROOT=%{python3_sitelib} \
|
|
MANDIR=%{_mandir}
|
|
+%endif
|
|
+
|
|
+%if 0%{?suse_version}
|
|
+%py_compile -O %{buildroot}/%{python_sitelib}
|
|
+%if 0%{?build_py3}
|
|
+%py3_compile -O %{buildroot}/%{python3_sitelib}
|
|
+%endif
|
|
+%endif
|
|
+
|
|
|
|
%clean
|
|
-rm -rf $RPM_BUILD_ROOT
|
|
|
|
%files
|
|
-%defattr(-,root,root,-)
|
|
%config(noreplace) %{_sysconfdir}/sysconfig/rhn/clientCaps.d/kickstart
|
|
%{_sbindir}/*
|
|
-%{_datadir}/rhn/spacewalkkoan/
|
|
-%{_datadir}/rhn/actions/
|
|
+
|
|
+%files -n python2-%{name}
|
|
+%{python_sitelib}/spacewalkkoan/
|
|
+%{python_sitelib}/rhn/actions/
|
|
+%if 0%{?suse_version}
|
|
+%dir %{python_sitelib}/rhn
|
|
+%endif
|
|
+
|
|
+%if 0%{?build_py3}
|
|
+%files -n python3-%{name}
|
|
+%{python3_sitelib}/spacewalkkoan/
|
|
+%{python3_sitelib}/rhn/actions/
|
|
+%if 0%{?suse_version}
|
|
+%dir %{python3_sitelib}/rhn
|
|
+%endif
|
|
+%endif
|
|
|
|
%changelog
|
|
-* Tue Nov 03 2009 Milan Zazrivec <mzazrivec@redhat.com> 0.1.11-13
|
|
-- fixes for bugs 532429, 530553
|
|
+* Thu Mar 08 2018 Tomas Kasparek <tkasparek@redhat.com> 2.8.6-2
|
|
+- rebuild for rhel8
|
|
+
|
|
+* Fri Feb 09 2018 Michael Mraka <michael.mraka@redhat.com> 2.8.6-1
|
|
+- remove install/clean section initial cleanup
|
|
+- removed Group from specfile
|
|
+- removed BuildRoot from specfiles
|
|
+
|
|
+* Mon Oct 23 2017 Michael Mraka <michael.mraka@redhat.com> 2.8.5-1
|
|
+- spacewalk-koan: add missing directories to filelist on SUSE and build py3 on
|
|
+ Tumbleweed
|
|
+
|
|
+* Wed Oct 18 2017 Jan Dobes 2.8.4-1
|
|
+- spacewalk-koan - removing usage of string module not available in Python 3
|
|
+
|
|
+* Mon Oct 16 2017 Jan Dobes 2.8.3-1
|
|
+- upstream koan is not compatible with cobbler20, require our build for now
|
|
+
|
|
+* Tue Oct 10 2017 Michael Mraka <michael.mraka@redhat.com> 2.8.2-1
|
|
+- install files into python_sitelib/python3_sitelib
|
|
+- split spacewalk-koan into python2/python3 specific packages
|
|
|
|
-* Thu Jul 16 2009 Brad Buckingham <bbuckingham@redhat.com> 0.1.11-12
|
|
-- 510299 - static ks fix. (paji@redhat.com)
|
|
+* Wed Sep 06 2017 Michael Mraka <michael.mraka@redhat.com> 2.8.1-1
|
|
+- purged changelog entries for Spacewalk 2.0 and older
|
|
+- use standard brp-python-bytecompile
|
|
+- Bumping package versions for 2.8.
|
|
|
|
-* Tue Jul 14 2009 Brad Buckingham <bbuckingham@redhat.com> 0.1.11-11
|
|
-- 510299 - Big commit to get static networking to work (paji@redhat.com)
|
|
+* Tue Jul 18 2017 Michael Mraka <michael.mraka@redhat.com> 2.7.2-1
|
|
+- move version and release before sources
|
|
|
|
-* Thu Jul 02 2009 Brad Buckingham <bbuckingham@redhat.com> 0.1.11-10
|
|
-- 508956 - fixing file preservation to actually use updated initrd.img
|
|
- (mmccune@gibson.pdx.redhat.com)
|
|
+* Mon Jul 17 2017 Jan Dobes 2.7.1-1
|
|
+- Updated links to github in spec files
|
|
+- Migrating Fedorahosted to GitHub
|
|
+- Bumping package versions for 2.7.
|
|
|
|
-* Thu Jun 11 2009 Brad Buckingham <bbuckingham@redhat.com> 0.1.11-9
|
|
-- fixing spacewalk-koan spec file to build for 2.1 properly
|
|
- (jsherril@redhat.com)
|
|
-- 497571 - switching to python 1.5 requires since we have to support 2.1
|
|
- (mmccune@gmail.com)
|
|
-- 497571 - switch from True/False to 0/1 to support rhel 2.1 and
|
|
- (mmccune@gmail.com)
|
|
-- 503996 - Added some information on the error message to the status returned
|
|
- to the server. (jason.dobies@redhat.com)
|
|
+* Mon Sep 26 2016 Jan Dobes 2.6.1-1
|
|
+- embed_kickstart was renamed to embed_autoinst in koan upstream
|
|
+- Bumping package versions for 2.6.
|
|
|
|
-* Tue May 19 2009 Brad Buckingham <bbuckingham@redhat.com> 0.1.11-8
|
|
-- Package rebuild
|
|
+* Wed May 25 2016 Tomas Kasparek <tkasparek@redhat.com> 2.5.2-1
|
|
+- updating copyright years
|
|
|
|
-* Thu May 14 2009 Brad Buckingham <bbuckingham@redhat.com> 0.1.11-7
|
|
-- 497424 - Slight redesign of the KS Virt UI to deal with duplicate virt paths
|
|
- (paji@redhat.com)
|
|
+* Tue Apr 26 2016 Gennadii Altukhov <galt@redhat.com> 2.5.1-1
|
|
+- Adapt spacewalk-koan for Python 2/3 compatibility
|
|
+- Bumping package versions for 2.5.
|
|
|
|
-* Wed May 06 2009 Devan Goodwin <dgoodwin@redhat.com> 0.1.11-6
|
|
-- 497871 - fixing issue where guest provisioning would show as succesfull even
|
|
- when it had failed (jsherril@redhat.com)
|
|
+* Wed Sep 16 2015 Jan Dobes 2.4.2-1
|
|
+- 1253464 - switch to KVM if possible
|
|
|
|
-* Thu Apr 23 2009 jesus m. rodriguez <jesusr@redhat.com> 0.1.11-5
|
|
-- 494976 - adding cobbler systme record name usage to reprovisioning (jsherril@redhat.com)
|
|
+* Fri May 29 2015 Jan Dobes 2.4.1-1
|
|
+- fixing duplicate BuildArch
|
|
+- Bumping package versions for 2.4.
|
|
|
|
-* Fri Apr 03 2009 Devan Goodwin <dgoodwin@redhat.com> 0.1.11-4
|
|
-- Rebuild for missing Satellite patch.
|
|
+* Thu Mar 19 2015 Grant Gainey 2.3.2-1
|
|
+- Updating copyright info for 2015
|
|
|
|
-* Thu Apr 02 2009 jesus m. rodriguez <jesusr@redhat.com> 0.1.11-3
|
|
-- update copyright and licenses (jesusr@redhat.com)
|
|
+* Fri Jan 30 2015 Stephen Herr <sherr@redhat.com> 2.3.1-1
|
|
+- 1187482 - make file preservation work again with new upstream koan
|
|
+- spacewalk-koan: improved merge-rd
|
|
+- Bumping package versions for 2.3.
|
|
|
|
-* Thu Mar 26 2009 jesus m. rodriguez <jesusr@redhat.com> 0.1.11-2
|
|
-- rebuild
|
|
+* Fri Jul 11 2014 Milan Zazrivec <mzazrivec@redhat.com> 2.2.4-1
|
|
+- fix copyright years
|
|
|
|
-* Wed Mar 18 2009 Mike McCune <mmccune@gmail.com> 0.1.11-1
|
|
-- 486186 - Update spacewalk spec files to require koan >= 1.4.3
|
|
+* Fri Jun 13 2014 Stephen Herr <sherr@redhat.com> 2.2.3-1
|
|
+- 1109276 - make cobbler20 guest kickstart work with new koan
|
|
|
|
-* Thu Feb 26 2009 jesus m. rodriguez <jesusr@redhat.com> 0.1.10-1
|
|
-- 486638- Updated spec to have it conflict with rhn-kickstart rpm instead of obsoleting it.
|
|
+* Wed Mar 26 2014 Stephen Herr <sherr@redhat.com> 2.2.2-1
|
|
+- 1063409 - guest provisioned on RHEL 7 host have no graphical console
|
|
+- Merge pull request #9 from dyordano/1071657
|
|
|
|
-* Wed Feb 18 2009 Dave Parker <dparker@redhat.com> 0.1.9-1
|
|
-- 486186 - Update spacewalk spec files to require cobbler >= 1.4.2
|
|
+* Fri Mar 14 2014 Michael Mraka <michael.mraka@redhat.com> 2.2.1-1
|
|
+- remove unneded imports
|
|
|
|
-* Tue Feb 10 2009 Mike McCune <mmccune@gmail.com> 0.1.8-1
|
|
-- 484793: Adde a basic setter to get rid of embed_kickstart check on koan
|
|
+* Fri Dec 20 2013 Milan Zazrivec <mzazrivec@redhat.com> 2.1.4-1
|
|
+- 967503 - use new Koan attribute
|
|
|
|
-* Mon Jan 26 2009 Mike McCune <mmccune@gmail.com> 0.1.7-1
|
|
-- spec file cleanups
|
|
+* Mon Oct 14 2013 Michael Mraka <michael.mraka@redhat.com> 2.1.3-1
|
|
+- cleaning up old svn Ids
|
|
|
|
-* Tue Jan 13 2009 Mike McCune <mmccune@gmail.com> 0.1.6-1
|
|
-- 461162 - missing var for koan
|
|
+* Mon Sep 30 2013 Michael Mraka <michael.mraka@redhat.com> 2.1.2-1
|
|
+- removed trailing whitespaces
|
|
|
|
-* Mon Jan 12 2009 Mike McCune <mmccune@gmail.com> 0.1.5-1
|
|
-- 461162 - get the virtualization provisioning tracking system to work with a :virt system record.
|
|
-- 461162 - Quick fix to get spacewalk koan going with a ks....
|
|
+* Thu Jul 25 2013 Stephen Herr <sherr@redhat.com> 2.1.1-1
|
|
+- 988428 - Mark spacewalk-koan as correctly requiring the xz package
|
|
+- Bumping package versions for 2.1.
|
|
|
|
-* Thu Jan 08 2009 Mike McCune <mmccune@gmail.com> 0.1.3-1
|
|
-- minor virt fixes
|
|
-* Tue Dec 23 2008 Mike McCune <mmccune@gmail.com> 0.1.2-1
|
|
-- tagging release with support for virt
|
|
-* Tue Nov 25 2008 Mike McCune - 0.1.1-1
|
|
-- tagging release
|
|
-* Tue Oct 28 2008 Mike McCune - 1.0.0-1
|
|
-- Initial creation.
|
|
diff --git a/spacewalkkoan/__init__.py b/spacewalkkoan/__init__.py
|
|
index fb3600e..6ad3240 100644
|
|
--- a/spacewalkkoan/__init__.py
|
|
+++ b/spacewalkkoan/__init__.py
|
|
@@ -1,5 +1,5 @@
|
|
#
|
|
-# Copyright (c) 2008 Red Hat, Inc.
|
|
+# Copyright (c) 2008--2013 Red Hat, Inc.
|
|
#
|
|
# This software is licensed to you under the GNU General Public License,
|
|
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
|
|
@@ -7,9 +7,9 @@
|
|
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
|
|
# along with this software; if not, see
|
|
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
|
|
-#
|
|
+#
|
|
# Red Hat trademarks are not licensed under GPLv2. No permission is
|
|
# granted to use or replicate Red Hat trademarks that are incorporated
|
|
-# in this software or its documentation.
|
|
+# in this software or its documentation.
|
|
#
|
|
|
|
diff --git a/spacewalkkoan/spacewalkkoan.py b/spacewalkkoan/spacewalkkoan.py
|
|
index 6193617..51621e5 100644
|
|
--- a/spacewalkkoan/spacewalkkoan.py
|
|
+++ b/spacewalkkoan/spacewalkkoan.py
|
|
@@ -1,5 +1,5 @@
|
|
#
|
|
-# Copyright (c) 2008 Red Hat, Inc.
|
|
+# Copyright (c) 2008--2016 Red Hat, Inc.
|
|
#
|
|
# This software is licensed to you under the GNU General Public License,
|
|
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
|
|
@@ -7,26 +7,27 @@
|
|
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
|
|
# along with this software; if not, see
|
|
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
|
|
-#
|
|
+#
|
|
# Red Hat trademarks are not licensed under GPLv2. No permission is
|
|
# granted to use or replicate Red Hat trademarks that are incorporated
|
|
-# in this software or its documentation.
|
|
+# in this software or its documentation.
|
|
#
|
|
# Kickstart a system using koan.
|
|
#
|
|
|
|
import traceback
|
|
import stat
|
|
-import string
|
|
import shutil
|
|
import sys
|
|
-import types
|
|
import os
|
|
-import subprocess
|
|
import os.path
|
|
import tempfile
|
|
-import xmlrpclib
|
|
-import pprint
|
|
+
|
|
+if sys.version_info[0] == 3:
|
|
+ import xmlrpc.client as xmlrpclib
|
|
+else:
|
|
+ import xmlrpclib
|
|
+
|
|
from koan.app import Koan
|
|
|
|
SHADOW = "/tmp/ks-tree-shadow"
|
|
@@ -36,33 +37,64 @@ def execute(cmd):
|
|
status = os.system(cmd + " > " + tmp)
|
|
data = open(tmp).readlines()
|
|
ret = []
|
|
- for l in data:
|
|
- ret.append(string.strip(l))
|
|
+ for l in data:
|
|
+ ret.append(l.strip())
|
|
if status == 0:
|
|
return ret
|
|
- msg = """Error executing command:\n %s\noutput:\n%s"""
|
|
- raise Exception(msg % (cmd, string.join(response,"\n")))
|
|
+ raise Exception('Error executing command:\n %s\noutput:\n%s' % (cmd, '\n'.join(ret)))
|
|
|
|
def find_host_name():
|
|
return execute("hostname")[0]
|
|
|
|
def find_netmask(device):
|
|
- return execute("ifconfig %s | perl -lne '/Mask:([\d.]+)/ and print $1'" % device)[0]
|
|
+ nm = execute("LANG=C ipcalc -4ms $(ip -4 -o addr show dev %s | awk '{print $4}')|awk -F= '{print $2}'" % device)
|
|
+ if nm:
|
|
+ return nm[0]
|
|
+ else:
|
|
+ return ""
|
|
+
|
|
+def find_netmask6(device):
|
|
+ nm6 = execute("LANG=C ip -6 -o addr show dev %s | perl -lne 'print $1 if m!/(.+) scope global!'" % device)
|
|
+ if nm6:
|
|
+ return nm6[0]
|
|
+ else:
|
|
+ return ""
|
|
|
|
def find_ip(device):
|
|
- return execute("ifconfig %s | perl -lne '/inet addr:([\d.]+)/ and print $1'" % device)[0]
|
|
+ ip = execute("LANG=C ip -4 -o addr show dev %s | perl -lne 'print $1 if m!.+\s(.+)/.+ scope global!'" % device)
|
|
+ if ip:
|
|
+ return ip[0]
|
|
+ else:
|
|
+ return ""
|
|
+
|
|
+def find_ip6(device):
|
|
+ ip6 = execute("LANG=C ip -6 -o addr show dev %s | perl -lne 'print $1 if m!.+\s(.+)/.+ scope global!'" % device)
|
|
+ if ip6:
|
|
+ return ip6[0]
|
|
+ else:
|
|
+ return ""
|
|
|
|
def find_name_servers():
|
|
- servers = execute("cat /etc/resolv.conf | perl -lne '/^nameserver\s+(\S+)$/ and print $1'")
|
|
+ servers = execute("cat /etc/resolv.conf | perl -lne '/^nameserver\s+(\S+)/ and print $1'")
|
|
ret = []
|
|
for s in servers:
|
|
- if s != "127.0.0.1":
|
|
+ if s not in ("127.0.0.1", "::1"):
|
|
ret.append(s)
|
|
return ret
|
|
|
|
-def find_gateway():
|
|
- response = execute("route -n | grep '^0.0.0.0' | awk '{print $2}'")
|
|
- return response[0]
|
|
+def find_gateway(device):
|
|
+ response = execute("ip -f inet route list dev %s|awk '/^default/ {print $3}'" % device)
|
|
+ if response:
|
|
+ return response[0]
|
|
+ else:
|
|
+ return ""
|
|
+
|
|
+def find_gateway6(device):
|
|
+ response = execute("ip -f inet6 route list dev %s|awk '/^default/ {print $3}'" % device)
|
|
+ if response:
|
|
+ return response[0]
|
|
+ else:
|
|
+ return ""
|
|
|
|
def getSystemId():
|
|
path = "/etc/sysconfig/rhn/systemid"
|
|
@@ -70,34 +102,47 @@ def getSystemId():
|
|
return None
|
|
return open(path, "r").read()
|
|
|
|
+def getInitrdPath():
|
|
+ path = '/boot/initrd.img'
|
|
+ if os.access(path + "_koan", os.R_OK):
|
|
+ return path + "_koan"
|
|
+ return path
|
|
+
|
|
def update_static_device_records(kickstart_host, static_device):
|
|
client = xmlrpclib.Server("https://" + kickstart_host + "/rpc/api")
|
|
- data = {"gateway": find_gateway(),\
|
|
+ data = {"gateway" : find_gateway(static_device),\
|
|
"nameservers": find_name_servers(),\
|
|
- "hostname": find_host_name(),\
|
|
+ "hostname" : find_host_name(),\
|
|
"device" : static_device,\
|
|
"ip": find_ip(static_device),\
|
|
- "netmask": find_netmask(static_device)}
|
|
- msg = """Unable to retrieve the '%s' information needed to update static network configuration information.
|
|
- Details:\n %s"""
|
|
- for key, value in data.items():
|
|
- if not value:
|
|
- raise Exception(msg % (key, pprint.pformat(data)))
|
|
- client.system.setup_static_network(getSystemId(), data)
|
|
+ "netmask" : find_netmask(static_device)}
|
|
+
|
|
+ data6 = {"gateway" : find_gateway6(static_device), \
|
|
+ "device" : static_device, \
|
|
+ "ip" : find_ip6(static_device), \
|
|
+ "netmask" : find_netmask6(static_device)}
|
|
+
|
|
+ api_version = client.api.get_version()
|
|
+
|
|
+ # Since api_version >= 11.1 we support setup_static_network with IPv6 data
|
|
+ if float(api_version) <= 11.00:
|
|
+ client.system.setup_static_network(getSystemId(), data)
|
|
+ else:
|
|
+ client.system.setup_static_network(getSystemId(), data, data6)
|
|
|
|
def initiate(kickstart_host, base, extra_append, static_device=None, system_record="", preserve_files=[]):
|
|
|
|
error_messages = {}
|
|
success = 0
|
|
-
|
|
+
|
|
# cleanup previous attempt
|
|
rm_rf(SHADOW)
|
|
os.mkdir(SHADOW)
|
|
-
|
|
- print "Preserve files! : %s" % preserve_files
|
|
-
|
|
+
|
|
+ print("Preserve files! : %s" % preserve_files)
|
|
+
|
|
try:
|
|
- if static_device:
|
|
+ if static_device:
|
|
update_static_device_records(kickstart_host, static_device)
|
|
|
|
k = Koan()
|
|
@@ -122,35 +167,39 @@ def initiate(kickstart_host, base, extra_append, static_device=None, system_reco
|
|
k.add_reinstall_entry = None
|
|
k.kopts_override = None
|
|
k.use_kexec = None
|
|
- k.embed_kickstart = None
|
|
+ k.embed_kickstart = k.embed_autoinst = None
|
|
+ if hasattr(k, 'no_copy_default'):
|
|
+ k.no_copy_default = 1
|
|
+ else: # older koan
|
|
+ k.grubby_copy_default = 0
|
|
if static_device:
|
|
- k.embed_kickstart = 1
|
|
+ k.embed_kickstart = k.embed_autoinst = 1
|
|
k.run()
|
|
|
|
- except Exception, e:
|
|
+ except Exception:
|
|
(xa, xb, tb) = sys.exc_info()
|
|
try:
|
|
- getattr(e,"from_koan")
|
|
- error_messages['koan'] = str(e)[1:-1]
|
|
- print str(e)[1:-1] # nice exception, no traceback needed
|
|
+ getattr(xb, "from_koan")
|
|
+ error_messages['koan'] = str(xb)[1:-1]
|
|
+ print(str(xb)[1:-1]) # nice exception, no traceback needed
|
|
except:
|
|
- print xa
|
|
- print xb
|
|
- print string.join(traceback.format_list(traceback.extract_tb(tb)))
|
|
- error_messages['koan'] = string.join(traceback.format_list(traceback.extract_tb(tb)))
|
|
+ print(xa)
|
|
+ print(xb)
|
|
+ print(" ".join(traceback.format_list(traceback.extract_tb(tb))))
|
|
+ error_messages['koan'] = " ".join(traceback.format_list(traceback.extract_tb(tb)))
|
|
return (1, "Kickstart failed. Koan error.", error_messages)
|
|
|
|
# Now process preserve_files if there are any
|
|
- initrd = '/boot/initrd.img'
|
|
+ initrd = getInitrdPath()
|
|
if preserve_files:
|
|
ret = create_new_rd(initrd, preserve_files)
|
|
if ret:
|
|
# Error
|
|
return ret
|
|
initrd = initrd + ".merged"
|
|
-
|
|
-
|
|
-
|
|
+
|
|
+
|
|
+
|
|
return (0, "Kickstart initiate succeeded", error_messages)
|
|
|
|
|
|
@@ -161,14 +210,31 @@ class VirtDiskPathExistsError(Exception):
|
|
return "Virt Disk Path %s already exists on the host system. Please provide another disk path for the virt guest and reschedule your guest kickstart." % self.value
|
|
|
|
|
|
+class BlockDeviceNonexistentError(Exception):
|
|
+ def __init__(self, device_path):
|
|
+ self.value = device_path
|
|
+ def __str__(self):
|
|
+ return "Block Device Path %s does not exist on the host system. Please create the device for the virtual guest and reschedule your guest kickstart." % self.value
|
|
+
|
|
+
|
|
def initiate_guest(kickstart_host, cobbler_system_name, virt_type, name, mem_kb,
|
|
vcpus, disk_gb, virt_bridge, disk_path, extra_append, log_notify_handler=None):
|
|
|
|
error_messages = {}
|
|
success = 0
|
|
try:
|
|
- if os.path.exists(disk_path):
|
|
- raise VirtDiskPathExistsError(disk_path)
|
|
+ if disk_path.startswith('/dev/'):
|
|
+ if not os.path.exists(disk_path):
|
|
+ raise BlockDeviceNonexistentError(disk_path)
|
|
+ else:
|
|
+ if os.path.exists(disk_path):
|
|
+ raise VirtDiskPathExistsError(disk_path)
|
|
+ # Switch to KVM if possible
|
|
+ if virt_type == "qemu":
|
|
+ if os.path.exists("/dev/kvm"):
|
|
+ virt_type = "kvm"
|
|
+ else:
|
|
+ print("Warning: KVM not available, using QEMU.")
|
|
k = Koan()
|
|
k.list_items = 0
|
|
k.server = kickstart_host
|
|
@@ -185,31 +251,42 @@ def initiate_guest(kickstart_host, cobbler_system_name, virt_type, name, mem_kb,
|
|
k.virt_path = disk_path
|
|
k.virt_type = virt_type
|
|
k.virt_bridge = virt_bridge
|
|
- k.no_gfx = 1
|
|
+ k.no_gfx = False
|
|
k.add_reinstall_entry = None
|
|
k.kopts_override = None
|
|
+ k.virt_auto_boot = None
|
|
+ if hasattr(k, 'no_copy_default'):
|
|
+ k.no_copy_default = 1
|
|
+ else: # older koan
|
|
+ k.grubby_copy_default = 0
|
|
+ if hasattr(k, 'virtinstall_wait'):
|
|
+ k.virtinstall_wait = 0
|
|
k.run()
|
|
|
|
# refresh current virtualization state on the server
|
|
import virtualization.support
|
|
virtualization.support.refresh()
|
|
- except Exception, e:
|
|
+ except Exception:
|
|
(xa, xb, tb) = sys.exc_info()
|
|
- if hasattr(e,"from_koan") and len(str(e)) > 1:
|
|
- error_messages['koan'] = str(e)[1:-1]
|
|
- print str(e)[1:-1] # nice exception, no traceback needed
|
|
+ if str(xb).startswith("The MAC address you entered is already in use"):
|
|
+ # I really wish there was a better way to check for this
|
|
+ error_messages['koan'] = str(xb)
|
|
+ print(str(xb))
|
|
+ elif hasattr(xb, "from_koan") and len(str(xb)) > 1:
|
|
+ error_messages['koan'] = str(xb)[1:-1]
|
|
+ print(str(xb)[1:-1]) # nice exception, no traceback needed
|
|
else:
|
|
- print xa
|
|
- print xb
|
|
- print string.join(traceback.format_list(traceback.extract_tb(tb)))
|
|
- error_messages['koan'] = xb.get_error_message() + ' ' + string.join(traceback.format_list(traceback.extract_tb(tb)))
|
|
+ print(xa)
|
|
+ print(xb)
|
|
+ print(" ".join(traceback.format_list(traceback.extract_tb(tb))))
|
|
+ error_messages['koan'] = str(xb) + ' ' + " ".join(traceback.format_list(traceback.extract_tb(tb)))
|
|
return (1, "Virtual kickstart failed. Koan error.", error_messages)
|
|
|
|
return (0, "Virtual kickstart initiate succeeded", error_messages)
|
|
|
|
def create_new_rd(initrd, preserve_files=[]):
|
|
"""
|
|
- Returns None if everything went well, or a tuple
|
|
+ Returns None if everything went well, or a tuple
|
|
(err_code, err_string, dict) if problems were found
|
|
"""
|
|
if not initrd:
|
|
@@ -221,9 +298,9 @@ def create_new_rd(initrd, preserve_files=[]):
|
|
# lame naming below to use /tmp/ks-tres-shadow 2X
|
|
# but needed to get it here the ks.cfg expects it
|
|
preserve_shadow = SHADOW + SHADOW
|
|
- # new FileCopier class handles the dirty work of getting the
|
|
+ # new FileCopier class handles the dirty work of getting the
|
|
# preserved file set copied w/ all permissions, owners, etc
|
|
- # kept intact and in the correct location
|
|
+ # kept intact and in the correct location
|
|
c = FileCopier(preserve_files, preserve_shadow, quota=quota)
|
|
try:
|
|
c.copy()
|
|
@@ -257,11 +334,11 @@ def _remove_func(path):
|
|
# Attempt to remove the file/link/etc
|
|
os.unlink(path)
|
|
return
|
|
-
|
|
+
|
|
# It's a directory!
|
|
files = os.listdir(path)
|
|
# We need to add the path since listdir only returns a relative path
|
|
- files = map(lambda x, p=path: os.path.join(p, x), files)
|
|
+ files = list(map(lambda x, p=path: os.path.join(p, x), files))
|
|
# Recursive call
|
|
map(_remove_func, files)
|
|
# After we remove everything from this directory we can also remove
|
|
@@ -270,16 +347,36 @@ def _remove_func(path):
|
|
return
|
|
|
|
def my_popen(cmd):
|
|
- print "CMD: %s " % cmd
|
|
- c = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
|
|
+ print("CMD: %s " % cmd)
|
|
+
|
|
+ subproc = 1
|
|
+ try:
|
|
+ import subprocess
|
|
+ except ImportError:
|
|
+ #RHEL 4 (python 2.3) doesn't have subprocess
|
|
+ import popen2
|
|
+ subproc = 0
|
|
+
|
|
+ if subproc:
|
|
+ c = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
|
|
stderr=subprocess.PIPE, close_fds=True, bufsize=-1)
|
|
- c.stdin.close()
|
|
- while 1:
|
|
- status = c.poll()
|
|
- if status is not None:
|
|
- # Save the exit code, we still have to read from
|
|
- # the pipes
|
|
- return status, c.stdout, c.stderr
|
|
+ c.stdin.close()
|
|
+ while 1:
|
|
+ status = c.poll()
|
|
+ if status is not None:
|
|
+ # Save the exit code, we still have to read from
|
|
+ # the pipes
|
|
+ return status, c.stdout, c.stderr
|
|
+ else:
|
|
+ c = popen2.Popen3(cmd, capturestderr=1, bufsize=-1)
|
|
+ c.tochild.close()
|
|
+
|
|
+ while 1:
|
|
+ status = c.poll()
|
|
+ if os.WIFEXITED(status):
|
|
+ # Save the exit code, we still have to read from
|
|
+ # the pipes
|
|
+ return os.WEXITSTATUS(status), c.fromchild, c.childerr
|
|
|
|
def _build_error(status, stdout, stderr):
|
|
params = {
|
|
@@ -300,13 +397,11 @@ class FileCopier:
|
|
self.quota = quota
|
|
self.current_quota = 0
|
|
|
|
-
|
|
def copy(self):
|
|
return self._copy(self.files)
|
|
|
|
-
|
|
def _copy(self, files):
|
|
- assert(isinstance(files, types.ListType))
|
|
+ assert(isinstance(files, list))
|
|
for f in files:
|
|
try:
|
|
st = os.lstat(f)
|
|
@@ -344,7 +439,7 @@ class FileCopier:
|
|
# Quota enabled
|
|
if self.current_quota + file_size > self.quota:
|
|
raise QuotaExceeded(f)
|
|
-
|
|
+
|
|
|
|
def _update_quota(self, f, file_size):
|
|
self.current_quota = self.current_quota + file_size
|
|
@@ -359,10 +454,10 @@ class FileCopier:
|
|
os.chmod(dest, st[stat.ST_MODE])
|
|
os.chown(dest, st[stat.ST_UID], st[stat.ST_GID])
|
|
os.utime(dest, (st[stat.ST_ATIME], st[stat.ST_MTIME]))
|
|
-
|
|
+
|
|
|
|
def _copy_dir(self, f, st):
|
|
- files = map(lambda x, d=f: os.path.join(d, x), os.listdir(f))
|
|
+ files = list(map(lambda x, d=f: os.path.join(d, x), os.listdir(f)))
|
|
# Create this directory since it may be empty
|
|
self._copy_dir_modes(f, self.dest)
|
|
return self._copy(files)
|
|
@@ -403,7 +498,7 @@ class FileCopier:
|
|
for d in l:
|
|
src_dir = os.path.join(src_dir, d)
|
|
src_st = os.lstat(src_dir)
|
|
- dest_dir = os.path.join(dest_dir, d)
|
|
+ dest_dir = os.path.join(dest_dir, d)
|
|
if not os.path.exists(dest_dir):
|
|
os.mkdir(dest_dir)
|
|
os.chmod(dest_dir, src_st[stat.ST_MODE])
|