Source code for pykickstart.commands.method

# Chris Lumens <>
# Copyright 2013 Red Hat, Inc.
# This copyrighted material is made available to anyone wishing to use, modify,
# copy, or redistribute it subject to the terms and conditions of the GNU
# General Public License v.2.  This program is distributed in the hope that it
# will be useful, but WITHOUT ANY WARRANTY expressed or implied, including the
# See the GNU General Public License for more details.
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc., 51
# Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  Any Red Hat
# trademarks that are incorporated in the source code or documentation are not
# subject to the GNU General Public License and may only be used or replicated
# with the express permission of Red Hat, Inc.
from pykickstart.version import FC3, F34, versionToLongString
from pykickstart.base import KickstartCommand, DeprecatedCommand
from pykickstart.options import KSOptionParser

[docs]class FC3_Method(KickstartCommand): removedKeywords = KickstartCommand.removedKeywords removedAttrs = KickstartCommand.removedAttrs # These are all set up as part of the base KickstartCommand. We want to # make sure looking them up gets redirected to the right place. internals = ["method", "writePriority", "currentCmd", "currentLine", "handler", "lineno", "seen"] _methods = ["cdrom", "harddrive", "nfs", "url"] def _clear_seen(self): """ Reset all the method's seen attributes to False""" for method in self._methods: setattr(getattr(self.handler, method), "seen", False) def _get_command(self, method): """Get a command for the given method.""" if method is None: # We use this to select the closest mirror option. # TODO: Raise an error instead. method = "url" if method not in self._methods: raise AttributeError("Unknown method: {}".format(method)) return getattr(self.handler, method) @property def method(self): """Return the seen method or None.""" for method in self._methods: if getattr(self.handler, method).seen: return method return None @method.setter def method(self, value): """Set which method is seen.""" self._clear_seen() if value is None: return self._get_command(value).seen = True def __getattr__(self, name): """Get the attribute in the seen command. Called when an attribute lookup has not found the attribute in the usual places. """ # Prevent recursion in copy and deepcopy. # See commit f5dbcfb for explanation. if name in ["handler", "method", "_methods"]: raise AttributeError() command = self._get_command(self.method) return getattr(command, name) def __setattr__(self, name, value): """Set the attribute in the seen command. Called when an attribute assignment is attempted. """ if name in self.internals: super(FC3_Method, self).__setattr__(name, value) return command = self._get_command(self.method) # Check if the kickstart command has the attribute. # Instead of using hasattr, that calls getattr and catches the exception # that we would have to raise again, we call getattr directly. getattr(command, name) # Set the attribute of the kickstart command. command.__setattr__(name, value) def _getParser(self): """Return a parser.""" description = "Proxy to the actual installation method. Valid installation methods are:\n\n" for method in self._methods: description += "* ``%s``\n" % method return KSOptionParser(prog="method", description=description, version=FC3)
# These are all just for compat. Calling into the appropriate version-specific # method command will deal with making sure the right options are used.
[docs]class FC6_Method(FC3_Method): pass
[docs]class F13_Method(FC6_Method): pass
[docs]class F14_Method(F13_Method): pass
[docs]class RHEL6_Method(F14_Method): pass
[docs]class F18_Method(F14_Method): pass
[docs]class F19_Method(FC3_Method): removedKeywords = FC3_Method.removedKeywords removedAttrs = FC3_Method.removedAttrs _methods = FC3_Method._methods + ["liveimg"]
[docs]class RHEL7_Method(F19_Method): removedKeywords = F19_Method.removedKeywords removedAttrs = F19_Method.removedAttrs _methods = F19_Method._methods + ["hmc"]
[docs]class F28_Method(RHEL7_Method): pass
[docs]class F34_Method(DeprecatedCommand, F19_Method): def __init__(self): # pylint: disable=super-init-not-called DeprecatedCommand.__init__(self) def _getParser(self): op = F19_Method._getParser(self) op.description += "\n\n.. deprecated:: %s" % versionToLongString(F34) return op