kexec-tools/anaconda-addon/com_redhat_kdump/ks/kdump.py

129 lines
4.9 KiB
Python
Raw Normal View History

# Kdump anaconda configuration
#
# Copyright (C) 2014 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, or (at your option) any later version.
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY expressed or implied, including the implied warranties of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details. You should have received a copy of the
# GNU General Public License along with this program; if not, 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.
#
# Red Hat Author(s): David Shea <dshea@redhat.com>
#
import os
from pyanaconda.addons import AddonData
from pyanaconda.constants import ROOT_PATH
from pyanaconda import iutil
from pykickstart.options import KSOptionParser
from pykickstart.errors import KickstartParseError, formatErrorMsg
from com_redhat_kdump.common import getOS, getMemoryBounds
from com_redhat_kdump.i18n import _
__all__ = ["KdumpData"]
class KdumpData(AddonData):
"""Addon data for the kdump configuration"""
def __init__(self, name):
AddonData.__init__(self, name)
self.enabled = True
self.reserveMB = "auto"
if getOS() == "fedora":
self.enabled = False
lower, upper, step = getMemoryBounds()
self.reserveMB = "%d" % lower
def __str__(self):
addon_str = "%%addon %s" % self.name
if self.enabled:
addon_str += " --enable"
else:
addon_str += " --disable"
if self.reserveMB:
addon_str += " --reserve-mb='%s'" % self.reserveMB
addon_str += "\n%s\n%%end\n" % self.content.strip()
return addon_str
def setup(self, storage, ksdata, instClass):
# Clear any existing crashkernel bootloader arguments
if ksdata.bootloader.appendLine:
ksdata.bootloader.appendLine = ' '.join(
(arg for arg in ksdata.bootloader.appendLine.split() \
if not arg.startswith('crashkernel=')))
# Copy our reserved amount to the bootloader arguments
if self.enabled:
# Ensure that the amount is "auto" or an amount in MB
if self.reserveMB != "auto" and self.reserveMB[-1] != 'M':
self.reserveMB += 'M'
ksdata.bootloader.appendLine += ' crashkernel=%s' % self.reserveMB
# Do the same thing with the storage.bootloader.boot_args set
if storage.bootloader.boot_args:
crashargs = [arg for arg in storage.bootloader.boot_args \
if arg.startswith('crashkernel=')]
storage.bootloader.boot_args -= set(crashargs)
if self.enabled:
storage.bootloader.boot_args.add('crashkernel=%s' % self.reserveMB)
ksdata.packages.packageList.append("kexec-tools")
def handle_header(self, lineno, args):
op = KSOptionParser()
op.add_option("--enable", action="store_true", default=True,
dest="enabled", help="Enable kdump")
op.add_option("--disable", action="store_false",
dest="enabled", help="Disable kdump")
op.add_option("--reserve-mb", type="string", dest="reserveMB",
default="auto", help="Amount of memory in MB to reserve for kdump, or auto")
(opts, extra) = op.parse_args(args=args, lineno=lineno)
# Reject any additional arguments
if extra:
AddonData.handle_header(self, lineno, extra)
# Validate the reserve-mb argument
if opts.reserveMB != "auto":
# Allow a final 'M' for consistency with the crashkernel kernel
# parameter. Strip it if found.
if opts.reserveMB and opts.reserveMB[-1] == 'M':
opts.reserveMB = opts.reserveMB[:-1]
try:
_test = int(opts.reserveMB)
except ValueError:
msg = _("Invalid value %s for --reserve-mb") % opts.reserveMB
if lineno != None:
raise KickstartParseError(formatErrorMsg(lineno, msg=msg))
else:
raise KickstartParseError(msg)
# Store the parsed arguments
self.enabled = opts.enabled
self.reserveMB =opts.reserveMB
def execute(self, storage, ksdata, instClass, users):
if self.enabled:
action = "enable"
else:
action = "disable"
iutil.execWithRedirect("systemctl", [action, "kdump.service"], root=ROOT_PATH)