Currently this work is done by firstboot. Now we move to anaconda addon
to configurate in the system installation process.
Signed-off-by: Arthur Zou <zzou(a)redhat.com>
---
kdump-anaconda-addon/Makefile | 81 ++++++
kdump-anaconda-addon/README | 29 +++
kdump-anaconda-addon/com_redhat_kdump/__init__.py | 0
kdump-anaconda-addon/com_redhat_kdump/common.py | 88 +++++++
kdump-anaconda-addon/com_redhat_kdump/constants.py | 22 ++
.../com_redhat_kdump/gui/__init__.py | 0
.../com_redhat_kdump/gui/spokes/RHEL.glade | 274 +++++++++++++++++++++
.../com_redhat_kdump/gui/spokes/__init__.py | 0
.../com_redhat_kdump/gui/spokes/fedora.glade | 218 ++++++++++++++++
.../com_redhat_kdump/gui/spokes/kdump.py | 192 +++++++++++++++
kdump-anaconda-addon/com_redhat_kdump/i18n.py | 27 ++
.../com_redhat_kdump/ks/__init__.py | 0
kdump-anaconda-addon/com_redhat_kdump/ks/kdump.py | 128 ++++++++++
.../com_redhat_kdump/tui/__init__.py | 0
.../com_redhat_kdump/tui/spokes/__init__.py | 0
.../com_redhat_kdump/tui/spokes/kdump.py | 87 +++++++
kdump-anaconda-addon/po/Makefile | 75 ++++++
kdump-anaconda-addon/po/kdump-anaconda-addon.pot | 81 ++++++
18 files changed, 1302 insertions(+)
create mode 100644 kdump-anaconda-addon/Makefile
create mode 100644 kdump-anaconda-addon/README
create mode 100644 kdump-anaconda-addon/com_redhat_kdump/__init__.py
create mode 100644 kdump-anaconda-addon/com_redhat_kdump/common.py
create mode 100644 kdump-anaconda-addon/com_redhat_kdump/constants.py
create mode 100644 kdump-anaconda-addon/com_redhat_kdump/gui/__init__.py
create mode 100644 kdump-anaconda-addon/com_redhat_kdump/gui/spokes/RHEL.glade
create mode 100644 kdump-anaconda-addon/com_redhat_kdump/gui/spokes/__init__.py
create mode 100644 kdump-anaconda-addon/com_redhat_kdump/gui/spokes/fedora.glade
create mode 100644 kdump-anaconda-addon/com_redhat_kdump/gui/spokes/kdump.py
create mode 100644 kdump-anaconda-addon/com_redhat_kdump/i18n.py
create mode 100644 kdump-anaconda-addon/com_redhat_kdump/ks/__init__.py
create mode 100644 kdump-anaconda-addon/com_redhat_kdump/ks/kdump.py
create mode 100644 kdump-anaconda-addon/com_redhat_kdump/tui/__init__.py
create mode 100644 kdump-anaconda-addon/com_redhat_kdump/tui/spokes/__init__.py
create mode 100644 kdump-anaconda-addon/com_redhat_kdump/tui/spokes/kdump.py
create mode 100644 kdump-anaconda-addon/po/Makefile
create mode 100644 kdump-anaconda-addon/po/kdump-anaconda-addon.pot
diff --git a/kdump-anaconda-addon/Makefile b/kdump-anaconda-addon/Makefile
new file mode 100644
index 0000000..7fd5ac4
--- /dev/null
+++ b/kdump-anaconda-addon/Makefile
@@ -0,0 +1,81 @@
+NAME = kdump-anaconda-addon
+
+VERSION = 0.1
+
+ADDON = com_redhat_kdump
+TESTS = test
+
+FILES = $(ADDON) \
+ $(TESTS) \
+ po \
+ Makefile \
+ README
+
+EXCLUDES = \
+ *~ \
+ *.pyc
+
+all:
+ @echo "usage: make dist"
+ @echo " make test"
+ @echo " make install"
+ @echo " make uninstall"
+
+DISTNAME = $(NAME)-$(VERSION)
+ADDONDIR = /usr/share/anaconda/addons/
+DISTBALL = $(DISTNAME).tar.gz
+NUM_PROCS = $$(getconf _NPROCESSORS_ONLN)
+
+install:
+ mkdir -p $(DESTDIR)$(ADDONDIR)
+ cp -rv $(ADDON) $(DESTDIR)$(ADDONDIR)
+
+uninstall:
+ rm -rfv $(DESTDIR)$(ADDONDIR)
+
+dist:
+ rm -rf $(DISTNAME)
+ mkdir -p $(DISTNAME)
+ @if test -d ".git"; \
+ then \
+ echo Creating ChangeLog && \
+ ( cd "$(top_srcdir)" && \
+ echo '# Generate automatically. Do not edit.'; echo; \
+ git log --stat --date=short ) > ChangeLog.tmp \
+ && mv -f ChangeLog.tmp $(DISTNAME)/ChangeLog \
+ || ( rm -f ChangeLog.tmp ; \
+ echo Failed to generate ChangeLog >&2 ); \
+ else \
+ echo A git clone is required to generate a ChangeLog >&2; \
+ fi
+ for file in $(FILES); do \
+ cp -rpv $$file $(DISTNAME)/$$file; \
+ done
+ for excl in $(EXCLUDES); do \
+ find $(DISTNAME) -name "$$excl" -delete; \
+ done
+ tar -czvf $(DISTBALL) $(DISTNAME)
+ rm -rf $(DISTNAME)
+
+potfile:
+ $(MAKE) DESTDIR=$(DESTDIR) -C po potfile
+
+po-pull:
+ tx pull -a --disable-overwrite
+
+install-po-files:
+ $(MAKE) -C po install
+
+test:
+ @echo "***Running pylint checks***"
+ @find . -name '*.py' -print|xargs -n1 --max-procs=$(NUM_PROCS) pylint -E 2>
/dev/null
+ @echo "[ OK ]"
+ @echo "***Running unittests checks***"
+ @PYTHONPATH=. nosetests --processes=-1 -vw tests/
+
+runpylint:
+ @find . -name '*.py' -print|xargs -n1 --max-procs=$(NUM_PROCS) pylint -E 2>
/dev/null
+ @echo "[ OK ]"
+
+unittest:
+ PYTHONPATH=. nosetests --processes=-1 -vw tests/
diff --git a/kdump-anaconda-addon/README b/kdump-anaconda-addon/README
new file mode 100644
index 0000000..50a7c97
--- /dev/null
+++ b/kdump-anaconda-addon/README
@@ -0,0 +1,29 @@
+This is an anaconda addon for configuring kdump. To use, copy the
+com_redhat_kdump directory into /usr/share/anaconda/addons on your
+installation media.
+
+The syntax of the addon's kickstart section is:
+
+%addon com_redhat_kdump (--enable|--disable)
--reserve-mb=("auto"|<amount>)
+%end
+
+Note that support for arguments on the %addon line was added in
+anaconda-21.23. See anaconda commit 3a512e4f9e15977f0ce2d0bbe39e841b881398f3,
+https://bugzilla.redhat.com/show_bug.cgi?id=1065674
+
+How to test the kdump-anaconda-addon?
+You can provide an updates image in the kernel boot arguments as updates=,
+and the contents will be added to the stage2 filesystem.
+https://fedoraproject.org/wiki/Anaconda/Updates has more details, but usually
+the easiest is to make it available via HTTP or FTP and provide a url to updates=.
+
+The file is a gzip-compressed cpio archive, and the files need to be put into
+stage2 in /usr/share/anaconda/addons, so something like this will work to create
+an updates.img:
+
+mkdir -p updates/usr/share/anaconda/addons
+cp -r com_redhat_kdump updates/usr/share/anaconda/addons/
+( cd updates; find . | cpio -oc | gzip -c9 ) > updates.img
+
+then you can upload the updates.img to some http or ftp server so the anaconda
+can get it by boot parameter as
updates=http://some.website.com/path/to/updates.img.
diff --git a/kdump-anaconda-addon/com_redhat_kdump/__init__.py
b/kdump-anaconda-addon/com_redhat_kdump/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/kdump-anaconda-addon/com_redhat_kdump/common.py
b/kdump-anaconda-addon/com_redhat_kdump/common.py
new file mode 100644
index 0000000..cd37131
--- /dev/null
+++ b/kdump-anaconda-addon/com_redhat_kdump/common.py
@@ -0,0 +1,88 @@
+# Kdump configuration common methods
+#
+# 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(a)redhat.com>
+#
+import os
+__all__ = ["getReservedMemory", "getTotalMemory",
"getMemoryBounds", "getOS"]
+
+from pyanaconda.isys import total_memory
+from pyanaconda.flags import flags
+from com_redhat_kdump.constants import OS_RELEASE
+
+_reservedMemory = None
+def getReservedMemory():
+ """Return the amount of memory currently reserved for kdump in
MB."""
+ global _reservedMemory
+
+ # Check if the value has already been read
+ if _reservedMemory is not None:
+ return _reservedMemory
+
+ try:
+ with open("/sys/kernel/kexec_crash_size", "r") as fobj:
+ _reservedMemory = int(fobj.read()) / (1024*1024)
+ return _reservedMemory
+ except (ValueError, IOError):
+ return 0
+
+def getTotalMemory():
+ """Return the total amount of system memory in MB
+
+ This is the amount reported by /proc/meminfo plus the aount
+ currently reserved for kdump.
+ """
+
+ # total_memory return memory in KB, convert to MB
+ availMem = total_memory() / 1024
+
+ return availMem + getReservedMemory()
+
+def getMemoryBounds():
+ """Return a tuple of (lower, upper, step) for kdump reservation
limits.
+
+ If there is not enough memory available to use kdump, both lower and
+ upper will be 0.
+ """
+
+ totalMemory = getTotalMemory()
+
+ if flags.targetarch == 'ppc64':
+ lowerBound = 256
+ minUsable = 1024
+ step = 1
+ else:
+ lowerBound = 128
+ minUsable = 256
+ step = 1
+
+ upperBound = (totalMemory - minUsable) - (totalMemory % step)
+
+ if upperBound < lowerBound:
+ upperBound = lowerBound = 0
+
+ return (lowerBound, upperBound, step)
+
+def getOS():
+ with open(os.path.normpath(OS_RELEASE), "r") as fobj:
+ line = fobj.readline()
+
+ if not "Fedora" in line:
+ return "redhat"
+ else:
+ return "fedora"
diff --git a/kdump-anaconda-addon/com_redhat_kdump/constants.py
b/kdump-anaconda-addon/com_redhat_kdump/constants.py
new file mode 100644
index 0000000..c6bafcc
--- /dev/null
+++ b/kdump-anaconda-addon/com_redhat_kdump/constants.py
@@ -0,0 +1,22 @@
+# Kdump configuration constants
+#
+# 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(a)redhat.com>
+#
+
+OS_RELEASE = "/etc/os-release"
diff --git a/kdump-anaconda-addon/com_redhat_kdump/gui/__init__.py
b/kdump-anaconda-addon/com_redhat_kdump/gui/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/kdump-anaconda-addon/com_redhat_kdump/gui/spokes/RHEL.glade
b/kdump-anaconda-addon/com_redhat_kdump/gui/spokes/RHEL.glade
new file mode 100644
index 0000000..272f745
--- /dev/null
+++ b/kdump-anaconda-addon/com_redhat_kdump/gui/spokes/RHEL.glade
@@ -0,0 +1,274 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.16.1 -->
+<interface domain="kdump-anaconda-addon">
+ <requires lib="gtk+" version="3.6"/>
+ <!-- interface-requires AnacondaWidgets 1.0 -->
+ <object class="AnacondaSpokeWindow" id="KdumpWindow">
+ <property name="startup_id">filler</property>
+ <property name="can_focus">False</property>
+ <property name="startup_id">filler</property>
+ <property name="window_name"
translatable="yes">KDUMP</property>
+ <signal name="button-clicked" handler="on_back_clicked"
swapped="no"/>
+ <child internal-child="main_box">
+ <object class="GtkBox"
id="AnacondaSpokeWindow-main_box1">
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child internal-child="nav_box">
+ <object class="GtkEventBox"
id="AnacondaSpokeWindow-nav_box1">
+ <property name="app_paintable">True</property>
+ <property name="can_focus">False</property>
+ <child internal-child="nav_area">
+ <object class="GtkGrid"
id="AnacondaSpokeWindow-nav_area1">
+ <property name="can_focus">False</property>
+ <property name="margin_left">6</property>
+ <property name="margin_right">6</property>
+ <property name="margin_top">6</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child internal-child="alignment">
+ <object class="GtkAlignment"
id="AnacondaSpokeWindow-alignment1">
+ <property name="can_focus">False</property>
+ <property name="yalign">0</property>
+ <child internal-child="action_area">
+ <object class="GtkBox"
id="AnacondaSpokeWindow-action_area1">
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">10</property>
+ <property
name="orientation">vertical</property>
+ <property name="spacing">10</property>
+ <child>
+ <object class="GtkLabel"
id="summaryLabel">
+ <property name="visible">True</property>
+ <property
name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label"
translatable="yes">Kdump is a kernel crash dumping mechanism. In the event of
a system crash, kdump will capture information from your system that can be invaluable in
determining the cause of the crash. Note that kdump does require reserving a portion of
system memory that will be unavailable for other uses.</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property
name="can_focus">False</property>
+ <child>
+ <object class="GtkCheckButton"
id="enableKdumpCheck">
+ <property name="label"
translatable="yes">_Enable kdump?</property>
+ <property
name="visible">True</property>
+ <property
name="can_focus">True</property>
+ <property
name="receives_default">False</property>
+ <property
name="use_underline">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property
name="draw_indicator">True</property>
+ <signal name="toggled"
handler="on_enable_kdump_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property
name="left_attach">0</property>
+ <property
name="top_attach">0</property>
+ <property name="width">3</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel"
id="reservationTypeLabel">
+ <property
name="visible">True</property>
+ <property
name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label"
translatable="yes">Kdump Memory Reservation:</property>
+ </object>
+ <packing>
+ <property
name="left_attach">0</property>
+ <property
name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton"
id="autoButton">
+ <property name="label"
translatable="yes">_Automatic</property>
+ <property
name="visible">True</property>
+ <property
name="can_focus">True</property>
+ <property
name="receives_default">False</property>
+ <property
name="use_underline">True</property>
+ <property name="xalign">0</property>
+ <property
name="active">True</property>
+ <property
name="draw_indicator">True</property>
+ <signal name="toggled"
handler="on_reservation_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property
name="left_attach">1</property>
+ <property
name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton"
id="manualButton">
+ <property name="label"
translatable="yes">_Manual</property>
+ <property
name="visible">True</property>
+ <property
name="can_focus">True</property>
+ <property
name="receives_default">False</property>
+ <property
name="use_underline">True</property>
+ <property name="xalign">0</property>
+ <property
name="active">True</property>
+ <property
name="draw_indicator">True</property>
+ <property
name="group">autoButton</property>
+ <signal name="toggled"
handler="on_reservation_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property
name="left_attach">2</property>
+ <property
name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel"
id="toBeReservedLabel">
+ <property
name="visible">True</property>
+ <property
name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label"
translatable="yes">Memory To Be _Reserved (MB):</property>
+ <property
name="use_underline">True</property>
+ <property
name="mnemonic_widget">toBeReservedSpin</property>
+ </object>
+ <packing>
+ <property
name="left_attach">0</property>
+ <property
name="top_attach">3</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton"
id="toBeReservedSpin">
+ <property
name="visible">True</property>
+ <property
name="can_focus">True</property>
+ <property
name="input_purpose">digits</property>
+ <property
name="update_policy">if-valid</property>
+ <signal name="value-changed"
handler="on_reserved_value_changed" swapped="no"/>
+ </object>
+ <packing>
+ <property
name="left_attach">1</property>
+ <property
name="top_attach">3</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel"
id="totalMemLabel">
+ <property
name="visible">True</property>
+ <property
name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label"
translatable="yes">Total System Memory (MB):</property>
+ </object>
+ <packing>
+ <property
name="left_attach">0</property>
+ <property
name="top_attach">4</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel"
id="totalMemMB">
+ <property
name="visible">True</property>
+ <property
name="can_focus">False</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property
name="left_attach">1</property>
+ <property
name="top_attach">4</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel"
id="usableMemLabel">
+ <property
name="visible">True</property>
+ <property
name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label"
translatable="yes">Usable System Memory (MB):</property>
+ </object>
+ <packing>
+ <property
name="left_attach">0</property>
+ <property
name="top_attach">5</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel"
id="usableMemMB">
+ <property
name="visible">True</property>
+ <property
name="can_focus">False</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property
name="left_attach">1</property>
+ <property
name="top_attach">5</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/kdump-anaconda-addon/com_redhat_kdump/gui/spokes/__init__.py
b/kdump-anaconda-addon/com_redhat_kdump/gui/spokes/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/kdump-anaconda-addon/com_redhat_kdump/gui/spokes/fedora.glade
b/kdump-anaconda-addon/com_redhat_kdump/gui/spokes/fedora.glade
new file mode 100644
index 0000000..55442a8
--- /dev/null
+++ b/kdump-anaconda-addon/com_redhat_kdump/gui/spokes/fedora.glade
@@ -0,0 +1,218 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.16.1 -->
+<interface domain="kdump-anaconda-addon">
+ <requires lib="gtk+" version="3.6"/>
+ <!-- interface-requires AnacondaWidgets 1.0 -->
+ <object class="AnacondaSpokeWindow" id="KdumpWindow">
+ <property name="startup_id">filler</property>
+ <property name="can_focus">False</property>
+ <property name="startup_id">filler</property>
+ <property name="window_name"
translatable="yes">KDUMP</property>
+ <signal name="button-clicked" handler="on_back_clicked"
swapped="no"/>
+ <child internal-child="main_box">
+ <object class="GtkBox"
id="AnacondaSpokeWindow-main_box1">
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child internal-child="nav_box">
+ <object class="GtkEventBox"
id="AnacondaSpokeWindow-nav_box1">
+ <property name="app_paintable">True</property>
+ <property name="can_focus">False</property>
+ <child internal-child="nav_area">
+ <object class="GtkGrid"
id="AnacondaSpokeWindow-nav_area1">
+ <property name="can_focus">False</property>
+ <property name="margin_left">6</property>
+ <property name="margin_right">6</property>
+ <property name="margin_top">6</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child internal-child="alignment">
+ <object class="GtkAlignment"
id="AnacondaSpokeWindow-alignment1">
+ <property name="can_focus">False</property>
+ <property name="yalign">0</property>
+ <child internal-child="action_area">
+ <object class="GtkBox"
id="AnacondaSpokeWindow-action_area1">
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">10</property>
+ <property
name="orientation">vertical</property>
+ <property name="spacing">10</property>
+ <child>
+ <object class="GtkLabel"
id="summaryLabel">
+ <property name="visible">True</property>
+ <property
name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label"
translatable="yes">Kdump is a kernel crash dumping mechanism. In the event of
a system crash, kdump will capture information from your system that can be invaluable in
determining the cause of the crash. Note that kdump does require reserving a portion of
system memory that will be unavailable for other uses.</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property
name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel"
id="toBeReservedLabel">
+ <property
name="visible">True</property>
+ <property
name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label"
translatable="yes">Memory To Be _Reserved (MB):</property>
+ <property
name="use_underline">True</property>
+ <property
name="mnemonic_widget">toBeReservedSpin</property>
+ </object>
+ <packing>
+ <property
name="left_attach">0</property>
+ <property
name="top_attach">3</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton"
id="toBeReservedSpin">
+ <property
name="visible">True</property>
+ <property
name="can_focus">True</property>
+ <property
name="input_purpose">digits</property>
+ <property
name="update_policy">if-valid</property>
+ <signal name="value-changed"
handler="on_reserved_value_changed" swapped="no"/>
+ </object>
+ <packing>
+ <property
name="left_attach">1</property>
+ <property
name="top_attach">3</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel"
id="totalMemLabel">
+ <property
name="visible">True</property>
+ <property
name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label"
translatable="yes">Total System Memory (MB):</property>
+ </object>
+ <packing>
+ <property
name="left_attach">0</property>
+ <property
name="top_attach">4</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel"
id="totalMemMB">
+ <property
name="visible">True</property>
+ <property
name="can_focus">False</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property
name="left_attach">1</property>
+ <property
name="top_attach">4</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel"
id="usableMemLabel">
+ <property
name="visible">True</property>
+ <property
name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label"
translatable="yes">Usable System Memory (MB):</property>
+ </object>
+ <packing>
+ <property
name="left_attach">0</property>
+ <property
name="top_attach">5</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel"
id="usableMemMB">
+ <property
name="visible">True</property>
+ <property
name="can_focus">False</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property
name="left_attach">1</property>
+ <property
name="top_attach">5</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton"
id="enableKdumpCheck">
+ <property name="label"
translatable="yes">_Enable kdump?</property>
+ <property
name="visible">True</property>
+ <property
name="can_focus">True</property>
+ <property
name="receives_default">False</property>
+ <property
name="use_underline">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property
name="draw_indicator">True</property>
+ <signal name="toggled"
handler="on_enable_kdump_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property
name="left_attach">0</property>
+ <property
name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/kdump-anaconda-addon/com_redhat_kdump/gui/spokes/kdump.py
b/kdump-anaconda-addon/com_redhat_kdump/gui/spokes/kdump.py
new file mode 100644
index 0000000..cec6b06
--- /dev/null
+++ b/kdump-anaconda-addon/com_redhat_kdump/gui/spokes/kdump.py
@@ -0,0 +1,192 @@
+# 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(a)redhat.com>
+#
+
+"""Kdump anaconda GUI configuration"""
+
+from gi.repository import Gtk
+
+from pyanaconda.ui.gui.categories.system import SystemCategory
+from pyanaconda.ui.gui.spokes import NormalSpoke
+from pyanaconda.ui.gui.utils import fancy_set_sensitive
+
+from com_redhat_kdump.i18n import _, N_
+from com_redhat_kdump.common import getReservedMemory, getTotalMemory, getMemoryBounds,
getOS
+
+__all__ = ["KdumpSpoke"]
+
+class KdumpSpoke(NormalSpoke):
+ """Kdump configuration spoke"""
+
+ builderObjects = ["KdumpWindow", "advancedConfigBuffer"]
+ mainWidgetName = "KdumpWindow"
+ uiFile = "RHEL.glade"
+ translationDomain = "kdump-anaconda-addon"
+
+ icon = "computer-fail-symbolic"
+ title = N_("KDUMP")
+ category = SystemCategory
+ OS = "redhat"
+ def __init__(self, data, storage, payload, instclass):
+ KdumpSpoke.OS = getOS()
+ if KdumpSpoke.OS == "fedora":
+ KdumpSpoke.uiFile = "fedora.glade"
+ NormalSpoke.__init__(self, data, storage, payload, instclass)
+ self._reserveMem = 0
+
+ def initialize(self):
+ NormalSpoke.initialize(self)
+ self._enableButton = self.builder.get_object("enableKdumpCheck")
+ KdumpSpoke.OS = getOS()
+ if KdumpSpoke.OS == "redhat":
+ self._reservationTypeLabel =
self.builder.get_object("reservationTypeLabel")
+ self._autoButton = self.builder.get_object("autoButton")
+ self._manualButton = self.builder.get_object("manualButton")
+
+ self._toBeReservedLabel = self.builder.get_object("toBeReservedLabel")
+ self._toBeReservedSpin = self.builder.get_object("toBeReservedSpin")
+ self._totalMemLabel = self.builder.get_object("totalMemLabel")
+ self._totalMemMB = self.builder.get_object("totalMemMB")
+ self._usableMemLabel = self.builder.get_object("usableMemLabel")
+ self._usableMemMB = self.builder.get_object("usableMemMB")
+
+ # Set an initial value and adjustment on the spin button
+ lower, upper, step = getMemoryBounds()
+ adjustment = Gtk.Adjustment(lower, lower, upper, step, step, 0)
+ self._toBeReservedSpin.set_adjustment(adjustment)
+ self._toBeReservedSpin.set_value(lower)
+
+ def refresh(self):
+ # If a reserve amount is requested, set it in the spin button
+ if self.data.addons.com_redhat_kdump.reserveMB != "auto":
+ # Strip the trailing 'M'
+ reserveMB = self.data.addons.com_redhat_kdump.reserveMB
+ if reserveMB and reserveMB[-1] == 'M':
+ reserveMB = reserveMB[:-1]
+ if reserveMB:
+ self._toBeReservedSpin.set_value(int(reserveMB))
+
+ # Set the various labels. Use the spin button signal handler to set the
+ # usable memory label once the other two have been set.
+ self._totalMemMB.set_text("%d" % getTotalMemory())
+ self._toBeReservedSpin.emit("value-changed")
+
+ # Set the states on the toggle buttons and let the signal handlers set
+ # the sensitivities on the related widgets. Set the radio button first,
+ # since the radio buttons' bailiwick is a subset of that of the
+ # enable/disable checkbox.
+ if KdumpSpoke.OS == "redhat":
+ if self.data.addons.com_redhat_kdump.reserveMB == "auto":
+ self._autoButton.set_active(True)
+ self._manualButton.set_active(False)
+ else:
+ self._autoButton.set_active(False)
+ self._manualButton.set_active(True)
+
+ if self.data.addons.com_redhat_kdump.enabled:
+ self._enableButton.set_active(True)
+ else:
+ self._enableButton.set_active(False)
+
+ # Force a toggled signal on the button in case it's state has not changed
+ self._enableButton.emit("toggled")
+
+ def apply(self):
+ # Copy the GUI state into the AddonData object
+ self.data.addons.com_redhat_kdump.enabled = self._enableButton.get_active()
+
+ if KdumpSpoke.OS == "redhat" and self._autoButton.get_active():
+ reserveMem = "auto"
+ else:
+ reserveMem = "%dM" % self._toBeReservedSpin.get_value_as_int()
+
+ self.data.addons.com_redhat_kdump.reserveMB = reserveMem
+
+
+ @property
+ def ready(self):
+ return True
+
+ @property
+ def completed(self):
+ # Always treat as completed
+ return True
+
+ @property
+ def mandatory(self):
+ return False
+
+ @property
+ def status(self):
+ if self.data.addons.com_redhat_kdump.enabled:
+ state = _("Kdump is enabled")
+ else:
+ state = _("Kdump is disabled")
+
+ return state
+
+ # SIGNAL HANDLERS
+
+ def on_enable_kdump_toggled(self, checkbutton, user_data=None):
+ status = checkbutton.get_active()
+
+ # If disabling, set everything to insensitve. Otherwise, only set the radio
+ # button and currently reserved widgets to sensitive and then fake a
+ # toggle event on the radio button to set the state on the reserve
+ # amount spin button and total/usable mem display.
+ if KdumpSpoke.OS == "redhat":
+ self._autoButton.set_sensitive(status)
+ self._manualButton.set_sensitive(status)
+ self._reservationTypeLabel.set_sensitive(status)
+
+ if not status:
+ fancy_set_sensitive(self._toBeReservedSpin, status)
+ self._totalMemLabel.set_sensitive(status)
+ self._totalMemMB.set_sensitive(status)
+ self._usableMemLabel.set_sensitive(status)
+ self._usableMemMB.set_sensitive(status)
+ elif KdumpSpoke.OS == "redhat":
+ self._autoButton.emit("toggled")
+ else:
+ fancy_set_sensitive(self._toBeReservedSpin, True)
+ self._totalMemLabel.set_sensitive(True)
+ self._totalMemMB.set_sensitive(True)
+ self._usableMemLabel.set_sensitive(True)
+ self._usableMemMB.set_sensitive(True)
+
+ def on_reservation_toggled(self, radiobutton, user_data=None):
+ status = self._manualButton.get_active()
+
+ # If setting to auto, disable the manual config spinner and
+ # the total/usable memory labels
+ fancy_set_sensitive(self._toBeReservedSpin, status)
+ self._totalMemLabel.set_sensitive(status)
+ self._totalMemMB.set_sensitive(status)
+ self._usableMemLabel.set_sensitive(status)
+ self._usableMemMB.set_sensitive(status)
+
+ def on_reserved_value_changed(self, spinbutton, user_data=None):
+ reserveMem = spinbutton.get_value_as_int()
+ totalMemText = self._totalMemMB.get_text()
+
+ # If no total memory is available yet, do nothing
+ if totalMemText:
+ totalMem = int(self._totalMemMB.get_text())
+ self._usableMemMB.set_text("%d" % (totalMem - reserveMem))
diff --git a/kdump-anaconda-addon/com_redhat_kdump/i18n.py
b/kdump-anaconda-addon/com_redhat_kdump/i18n.py
new file mode 100644
index 0000000..a8cd27a
--- /dev/null
+++ b/kdump-anaconda-addon/com_redhat_kdump/i18n.py
@@ -0,0 +1,27 @@
+# Kdump configuration translation functions
+#
+# 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(a)redhat.com>
+#
+
+__all__ = ["_", "N_"]
+
+import gettext
+
+_ = lambda x: gettext.ldgettext("kdump-anaconda-addon", x)
+N_ = lambda x: x
diff --git a/kdump-anaconda-addon/com_redhat_kdump/ks/__init__.py
b/kdump-anaconda-addon/com_redhat_kdump/ks/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/kdump-anaconda-addon/com_redhat_kdump/ks/kdump.py
b/kdump-anaconda-addon/com_redhat_kdump/ks/kdump.py
new file mode 100644
index 0000000..b4b346c
--- /dev/null
+++ b/kdump-anaconda-addon/com_redhat_kdump/ks/kdump.py
@@ -0,0 +1,128 @@
+# 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(a)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)
diff --git a/kdump-anaconda-addon/com_redhat_kdump/tui/__init__.py
b/kdump-anaconda-addon/com_redhat_kdump/tui/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/kdump-anaconda-addon/com_redhat_kdump/tui/spokes/__init__.py
b/kdump-anaconda-addon/com_redhat_kdump/tui/spokes/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/kdump-anaconda-addon/com_redhat_kdump/tui/spokes/kdump.py
b/kdump-anaconda-addon/com_redhat_kdump/tui/spokes/kdump.py
new file mode 100644
index 0000000..23e8040
--- /dev/null
+++ b/kdump-anaconda-addon/com_redhat_kdump/tui/spokes/kdump.py
@@ -0,0 +1,87 @@
+# Kdump anaconda configuration
+#
+# Copyright (C) 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, 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(a)redhat.com>
+#
+
+"""Kdump anaconda TUI configuration"""
+
+import re
+
+from pyanaconda.ui.tui.spokes import EditTUISpoke
+from pyanaconda.ui.tui.spokes import EditTUISpokeEntry as Entry
+from com_redhat_kdump.common import getOS, getMemoryBounds
+from com_redhat_kdump.i18n import N_, _
+
+__all__ = ["KdumpSpoke"]
+
+class _re:
+ def __init__(self, patten, low, up):
+ self.re = re.compile(patten)
+ self.low = low
+ self.up = up
+
+ def match(self, key):
+ if self.re.match(key):
+ if key == "auto":
+ return True
+ if key[-1] == 'M':
+ key = key[:-1]
+ key = int(key)
+ if key <= self.up and key >= self.low :
+ return True
+ return False
+
+lower, upper ,step = getMemoryBounds()
+# Allow either "auto" or a string of digits optionally followed by 'M'
+RESERVE_VALID = _re(r'^((auto)|(\d+M?))$', lower, upper)
+FEDORA_RESERVE_VALID = _re(r'^(\d+M?)$', lower, upper)
+
+class KdumpSpoke(EditTUISpoke):
+ title = N_("Kdump")
+ category = "system"
+
+ edit_fields = [
+ Entry("Enable kdump", "enabled", EditTUISpoke.CHECK, True),
+ Entry("Reserve amount", "reserveMB", RESERVE_VALID, lambda
self,args: args.enabled)
+ ]
+
+ def __init__(self, app, data, storage, payload, instclass):
+ if getOS() == "fedora":
+ KdumpSpoke.edit_fields = [
+ Entry("Enable kdump", "enabled", EditTUISpoke.CHECK,
True),
+ Entry("Reserve amount", "reserveMB",
FEDORA_RESERVE_VALID, lambda self,args: args.enabled)
+ ]
+
+ EditTUISpoke.__init__(self, app, data, storage, payload, instclass)
+ self.args = self.data.addons.com_redhat_kdump
+
+ def apply(self):
+ pass
+
+ @property
+ def completed(self):
+ return True
+
+ @property
+ def status(self):
+ if self.args.enabled:
+ state = _("Kdump is enabled")
+ else:
+ state = _("Kdump is disabled")
+ return state
diff --git a/kdump-anaconda-addon/po/Makefile b/kdump-anaconda-addon/po/Makefile
new file mode 100644
index 0000000..2fab84d
--- /dev/null
+++ b/kdump-anaconda-addon/po/Makefile
@@ -0,0 +1,75 @@
+#
+# Makefile for the PO files (translation) catalog
+#
+# $Id$
+
+TOP = ../..
+
+# What is this package?
+NLSPACKAGE = kdump-anaconda-addon
+POTFILE = $(NLSPACKAGE).pot
+INSTALL = /usr/bin/install -c
+INSTALL_DATA = $(INSTALL) -m 644
+INSTALL_DIR = /usr/bin/install -d
+
+# destination directory
+INSTALL_NLS_DIR = $(DESTDIR)/usr/share/locale
+# PO catalog handling
+MSGMERGE = msgmerge -v
+XGETTEXT = xgettext --default-domain=$(NLSPACKAGE) \
+ --add-comments
+MSGFMT = msgfmt --statistics --verbose
+
+# What do we need to do
+POFILES = $(wildcard ./kexec-tools-po/*.po)
+MOFILES = $(patsubst %.po,%.mo,$(POFILES))
+PYSRC = $(wildcard ../com_redhat_kdump/*.py ../com_redhat_kdump/*/*.py
../com_redhat_kdump/*/*/*.py)
+GLADEFILES = $(wildcard ../com_redhat_kdump/gui/spokes/*.glade)
+
+all:: update-po $(MOFILES)
+
+potfile: $(PYSRC) glade-po
+ $(XGETTEXT) -L Python --keyword=_ --keyword=N_ $(PYSRC) tmp/*.h
+ @if cmp -s $(NLSPACKAGE).po $(POTFILE); then \
+ rm -f $(NLSPACKAGE).po; \
+ else \
+ mv -f $(NLSPACKAGE).po $(POTFILE); \
+ fi; \
+ rm -rf tmp/
+
+glade-po: $(GLADEFILES)
+ rm -rf tmp/
+ for f in $(GLADEFILES); do \
+ intltool-extract --type=gettext/glade -l $$f ;\
+ done
+
+update-po: Makefile refresh-po
+
+refresh-po: Makefile
+ for cat in $(POFILES); do \
+ if $(MSGMERGE) $$cat $(POTFILE) --out=$$cat ; then \
+ echo "$(MSGMERGE) of $$cat succeeded" ; \
+ else \
+ echo "$(MSGMERGE) of $$cat failed" ; \
+ fi \
+ done
+
+clean:
+ @rm -fv *mo *~ .depend
+ @rm -rf tmp
+
+install: $(MOFILES)
+ @for n in $(MOFILES); do \
+ l=`basename $$n .mo`; \
+ $(INSTALL_DIR) $(INSTALL_NLS_DIR)/$$l/LC_MESSAGES; \
+ $(INSTALL_DATA) --verbose $$n $(INSTALL_NLS_DIR)/$$l/LC_MESSAGES/$(NLSPACKAGE).mo;
\
+ done
+
+uninstall:
+ rm -rfv $(INSTALL_NLS_DIR)/*/LC_MESSAGES/$(NLSPACKAGE).mo
+
+%.mo: %.po
+ $(MSGFMT) -o $@ $<
+
+.PHONY: missing depend
+
diff --git a/kdump-anaconda-addon/po/kdump-anaconda-addon.pot
b/kdump-anaconda-addon/po/kdump-anaconda-addon.pot
new file mode 100644
index 0000000..3b9b641
--- /dev/null
+++ b/kdump-anaconda-addon/po/kdump-anaconda-addon.pot
@@ -0,0 +1,81 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-04-09 15:07+0800\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL(a)li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../com_redhat_kdump/ks/kdump.py:112
+#, python-format
+msgid "Invalid value %s for --reserve-mb"
+msgstr ""
+
+#: ../com_redhat_kdump/tui/spokes/kdump.py:56
+msgid "Kdump"
+msgstr ""
+
+#: ../com_redhat_kdump/tui/spokes/kdump.py:84
+#: ../com_redhat_kdump/gui/spokes/kdump.py:138
+msgid "Kdump is enabled"
+msgstr ""
+
+#: ../com_redhat_kdump/tui/spokes/kdump.py:86
+#: ../com_redhat_kdump/gui/spokes/kdump.py:140
+msgid "Kdump is disabled"
+msgstr ""
+
+#: ../com_redhat_kdump/gui/spokes/kdump.py:43
+msgid "_KDUMP"
+msgstr ""
+
+#: tmp/fedora.glade.h:1 tmp/kdump.glade.h:1
+msgid "KDUMP"
+msgstr ""
+
+#: tmp/fedora.glade.h:2 tmp/kdump.glade.h:2
+msgid ""
+"Kdump is a kernel crash dumping mechanism. In the event of a system crash, "
+"kdump will capture information from your system that can be invaluable in "
+"determining the cause of the crash. Note that kdump does require reserving a
"
+"portion of system memory that will be unavailable for other uses."
+msgstr ""
+
+#: tmp/fedora.glade.h:3 tmp/kdump.glade.h:7
+msgid "Memory To Be Reserved (MB):"
+msgstr ""
+
+#: tmp/fedora.glade.h:4 tmp/kdump.glade.h:8
+msgid "Total System Memory (MB):"
+msgstr ""
+
+#: tmp/fedora.glade.h:5 tmp/kdump.glade.h:9
+msgid "Usable System Memory (MB):"
+msgstr ""
+
+#: tmp/fedora.glade.h:6 tmp/kdump.glade.h:3
+msgid "_Enable kdump?"
+msgstr ""
+
+#: tmp/kdump.glade.h:4
+msgid "Kdump Memory Reservation:"
+msgstr ""
+
+#: tmp/kdump.glade.h:5
+msgid "_Automatic"
+msgstr ""
+
+#: tmp/kdump.glade.h:6
+msgid "_Manual"
+msgstr ""
--
1.8.4.2