Merge branch 'fedora-25'

pull/9/merge
Marek Marczykowski-Górecki 7 years ago
commit d78bec7bcb
No known key found for this signature in database
GPG Key ID: 063938BA42CFA724

@ -58,10 +58,10 @@ iso-installer: iso-prepare
mkdir -p work
pushd work && pungi --name=Qubes $(PUNGI_OPTS) -c $(INSTALLER_KICKSTART) && popd
# Move result files to known-named directories
mkdir -p build/ISO/qubes-x86_64/iso build/work
mkdir -p build/ISO/qubes-x86_64/iso
mv work/$(ISO_VERSION)/x86_64/iso/*-DVD*.iso build/ISO/qubes-x86_64/iso/
rm -rf build/work/$(ISO_VERSION)
mv work/$(ISO_VERSION)/x86_64/os build/work/$(ISO_VERSION)
rm -rf build/work
mv work build/work
chown --reference=Makefile -R build yum
rm -rf work

@ -4,7 +4,6 @@ RPM_SPEC_FILES.dom0 := \
lorax-templates-qubes/lorax-templates-qubes.spec \
pungi/pungi.spec \
anaconda/anaconda.spec \
initial-setup-launcher/initial-setup-launcher.spec \
qubes-anaconda-addon/qubes-anaconda-addon.spec \
qubes-release/qubes-release.spec \
qubes-release/qubes-dom0-dist-upgrade.spec

@ -0,0 +1,14 @@
# http://nedbatchelder.com/code/coverage/config.html
[run]
branch = True
parallel = True
source = ..
# used by coverage combine
# when combining Jenkins and kickstart_tests data
# doesn't affect combination of pyanaconda tests data
[paths]
source = .
/usr/lib*/python*/site-packages/
/usr/sbin/

@ -0,0 +1,161 @@
How to Contribute to the Anaconda Installer (the short version)
----------------------------------------------------------------
a) I want to contribute to the upstream Anaconda Installer (used in Fedora):
- open a pull request for the ``<next Fedora number>-devel`` branch (f25-devel, etc.)
- check the *Commit Messages* section below for how to format your commit messages
b) I want to contribute to the RHEL Anaconda installer:
- open a pull request for the ``<RHEL number>-branch`` branch (rhel7-branch, etc.)
- check the *Commits for RHEL Branches* section below for how to format your commit messages
If you want to contribute a change to both the upstream and RHEL Anaconda then follow both a) and b) separately.
Anaconda Installer Branching Policy (the long version)
-------------------------------------------------------
The basic premise is that there are the following branches:
- master
- unstable
- <next fedora number>-release
- <next fedora number>-devel
``Master`` branch never waits for any release-related processes to take place. The spec file will remain there to track dependencies. ``Master`` branch is *not* associated with Fedora Rawhide builds anymore. Its purpose is to function purely as an upstream branch.
The ``unstable`` branch is used for making periodic Anaconda releases for Rawhide (or possibly anyone else wanting to taste the cutting edge).
Concerning current RHEL branches, they are too divergent to integrate into this scheme. Thus, commits are merged onto, and builds are done on the RHEL branches.
In this case, two pull requests will very likely be needed:
- one for the ``rhel<number>-branch``
- one for the ``master`` or ``<fedora number>-devel`` branch (if the change is not RHEL only)
Releases
---------
For specific Fedora version, the release process is as follows:
- ``<next Fedora number>-devel`` is merged onto ``<next Fedora number>-release``
- a release commit is made (which bumps version in spec file) & tagged
Concerning Fedora Rawhide, the release process is (very) slightly different:
- master is merged onto the unstable branch
- a release commit is made (which bumps version in spec file) & tagged
Concerning the ``<next Fedora number>`` branches (which could also be called ``next stable release`` if we wanted to decouple our versioning from Fedora in the future):
- work which goes into the next Fedora goes to ``<next Fedora number>-devel``, which is periodically merged back to ``master``
- this way we can easily see what was developed in which Fedora timeframe and possibly due to given Fedora testing phase feedback (bugfixes, etc.)
- stuff we *don't* want to go to the next Fedora (too cutting edge, etc.) goes only to ``master`` branch
- commits specific to a given Fedora release (temporary fixes, etc.) go only to the ``<next Fedora number>-release`` branch
- the ``<next Fedora number>-release`` branch also contains release commits
Example for the F25 cycle
--------------------------
- master
- unstable
- f25-devel
- f25-release
This would continue until F25 is released, after which we:
- drop the f25-devel branch
- keep f25-release as an inactive record of the f25 cycle
- branch f26-devel and f26-release from the master branch
This will result in the following branches for the F26 cycle:
- master
- unstable
- f26-devel
- f26-release
Guidelines for Commits
-----------------------
Commit Messages
^^^^^^^^^^^^^^^^
The first line should be a succinct description of what the commit does. If your commit is fixing a bug in Red Hat's bugzilla instance, you should add `` (#123456)`` to the end of the first line of the commit message. The next line should be blank, followed (optionally) by a more in-depth description of your changes. Here's an example:
Stop kickstart when space check fails
Text mode kickstart behavior was inconsistent, it would allow an
installation to continue even though the space check failed. Every other
install method stops, letting the user add more space before continuing.
Commits for RHEL Branches
^^^^^^^^^^^^^^^^^^^^^^^^^^
If you are submitting a patch for any rhel-branch, the last line of your commit must identify the bugzilla bug id it fixes, using the ``Resolves`` or ``Related`` keyword, e.g.:
``Resolves: rhbz#111111``
or
``Related: rhbz#1234567``
Use ``Resolves`` if the patch fixes the core issue which caused the bug.
Use ``Related`` if the patch fixes an ancillary issue that is related to, but might not actually fix the bug.
Pull Request Review
^^^^^^^^^^^^^^^^^^^^
Please note that there is a minimum review period of 24 hours for any patch. The purpose of this rule is to ensure that all interested parties have an opportunity to review every patch. When posting a patch before or after a holiday break it is important to extend this period as appropriate.
All subsequent changes made to patches must be force-pushed to the PR branch before merging it into the main branch.
Merging examples
----------------
Merging the Fedora ``devel`` branch back to the ``master`` branch
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
(Fedora 25 is used as an example, don't forget to use appropriate Fedora version.)
Checkout and pull the master branch:
``git checkout master``
``git pull``
Merge the Fedora devel branch to the master branch:
``git merge --no-ff f25-devel``
Push the merge to the remote:
``git push origin master``
Merging a GitHub pull request
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
(Fedora 25 is used as an example, don't forget to use appropriate Fedora version.)
Press the green *Merge pull request* button on the pull request page.
If the pull request has been opened for:
- master
- f25-release
- rhel7-branch
Then you are done.
If the pull request has been opened for the ``f25-devel`` branch, then you also need to merge the ``f25-devel``
branch back to ``master`` once you merge your pull request (see "Merging the Fedora devel branch back to the master branch" above).
Merging a topic branch manually
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
(Fedora 25 is used as an example, don't forget to use appropriate Fedora version.)
Let's say that there is a topic branch called "fix_foo_with_bar" that should be merged to a given Anaconda non-topic branch.
Checkout the given target branch, pull it and merge your topic branch into it:
``git checkout <target branch>``
``git pull``
``git merge --no-ff fix_foo_with_bar``
Then push the merge to the remote:
``git push origin <target branch>``
If the <target branch> was one of:
- master
- f25-release
- rhel7-branch
Then you are done.
If the pull request has been opened for the ``f25-devel`` branch, then you also need to merge the ``f25-devel``
branch back to ``master`` once you merge your pull request (see "Merging the Fedora devel branch back to the master branch" above).

@ -14,39 +14,58 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author: David Cantrell <dcantrell@redhat.com>
ACLOCAL_AMFLAGS = -I m4
SUBDIRS = data docs dracut po pyanaconda scripts tests widgets utils
EXTRA_DIST = config.rpath COPYING
EXTRA_DIST = COPYING .coveragerc
# Files generated for gettext need to be included in the distribution
EXTRA_DIST += $(srcdir)/anaconda.po
$(srcdir)/anaconda.po: $(srcdir)/anaconda
@$(MAKE) -C $(top_builddir)/po $(abs_top_srcdir)/$(subdir)/$$(basename $@)
# Include the xgettext wrapper so pot-update can be run from the source distribution
# This is needed for make distcheck.
EXTRA_DIST += $(srcdir)/translation-canary/xgettext_werror.sh
MAINTAINERCLEANFILES = Makefile.in config.guess config.h.in config.sub \
depcomp install-sh ltmain.sh missing ABOUT-NLS \
INSTALL aclocal.m4 configure *.pyc py-compile \
m4/* config.rpath po/Makefile.in.in po/Rules-quot \
m4/* po/Makefile.in.in po/Rules-quot \
test-driver
CLEANFILES = *~
dist_noinst_DATA = $(PACKAGE_NAME).spec
dist_sbin_SCRIPTS = anaconda
dist_sbin_SCRIPTS = anaconda.py
install-exec-hook:
cd $(DESTDIR)$(sbindir) && mv anaconda.py anaconda
uninstall-hook:
-cd $(DESTDIR)$(sbindir) && rm -f anaconda
ARCHIVE_TAG = $(PACKAGE_NAME)-$(PACKAGE_VERSION)-$(PACKAGE_RELEASE)
ZANATA_PULL_ARGS = --transdir $(srcdir)/po/
ZANATA_PUSH_ARGS = --srcdir $(srcdir)/po/ --push-type source --force
ZANATA_PUSH_ARGS = --srcfile $(srcdir)/po/anaconda.pot --push-type source --force
RC_RELEASE ?= $(shell date -u +0.1.%Y%m%d%H%M%S)
MOCKCHROOT ?= fedora-rawhide-$(shell uname -m)
MOCKCHROOT ?= fedora-25-$(shell uname -m)
COVERAGE ?= coverage3
USER_SITE_BASE ?= $(abs_top_builddir)/python-site
USER_SITE_PACKAGES ?= $(shell PYTHONUSERBASE=$(USER_SITE_BASE) $(PYTHON) -m site --user-site)
# If translations are present, run tests on the .po files before tarring them
# up. Use a weird looking loop because shell doesn't have a good way to test
# for a wildcard
dist-hook:
for p in $(distdir)/po/*.po ; do \
if [ -e "$$p" ]; then \
PYTHONPATH=$(srcdir)/translation-canary python3 -m translation_canary.translated \
--release $(distdir)/po ; \
fi ; \
break ; \
done
tag:
@git tag -s -a -m "Tag as $(ARCHIVE_TAG)" $(ARCHIVE_TAG)
@ -54,20 +73,16 @@ tag:
po-pull:
rpm -q zanata-python-client &>/dev/null || ( echo "need to run: dnf install zanata-python-client"; exit 1 )
zanata pull $(ZANATA_PULL_ARGS)
( cd $(srcdir) && zanata pull $(ZANATA_PULL_ARGS) )
po-empty:
for lingua in $$(grep -v '^#' $(srcdir)/po/LINGUAS) ; do \
[ -f $(srcdir)/po/$$lingua.po ] || \
msginit -i $(srcdir)/po/$(PACKAGE_NAME).pot -o $(srcdir)/po/$$lingua.po --no-translator || \
exit 1 ; \
done
# Try to fetch translations, but if that fails just keep going
po-fallback:
-$(MAKE) po-pull
scratch: po-empty
scratch:
$(MAKE) ARCHIVE_TAG=HEAD dist
git checkout -- $(srcdir)/po/$(PACKAGE_NAME).pot
scratch-bumpver: po-empty
scratch-bumpver:
@opts="-S -n $(PACKAGE_NAME) -v $(PACKAGE_VERSION) -r $(PACKAGE_RELEASE) -b $(PACKAGE_BUGREPORT) --newrelease $(RC_RELEASE)" ; \
if [ ! -z "$(IGNORE)" ]; then \
opts="$${opts} -i $(IGNORE)" ; \
@ -82,7 +97,7 @@ scratch-bumpver: po-empty
$(MAKE) -C po $(PACKAGE_NAME).pot-update
release:
$(MAKE) dist && $(MAKE) tag && git checkout -- $(srcdir)/po/$(PACKAGE_NAME).pot
$(MAKE) dist && $(MAKE) tag
rc-release: scratch-bumpver scratch
mock -r $(MOCKCHROOT) --scrub all || exit 1
@ -105,6 +120,7 @@ bumpver: po-pull
fi ; \
( cd $(srcdir) && scripts/makebumpver $${opts} ) || exit 1 ; \
$(MAKE) -C po $(PACKAGE_NAME).pot-update && \
rm $(srcdir)/po/{main,extra}.pot
zanata push $(ZANATA_PUSH_ARGS)
# Install all packages specified as BuildRequires in the Anaconda specfile
@ -117,7 +133,8 @@ install-buildrequires:
if ! [[ $$(uname -m) =~ s390x? ]]; then \
pkglist=$$(echo "$$pkglist" | grep -v s390utils) ; \
fi ; \
dnf install $$pkglist
extra_pkgs="gettext-devel libtool glibc-langpack-en python3-pocketlint" ; \
dnf install $$pkglist $$extra_pkgs
# Install all packages specified as Requires in the Anaconda specfile
# -> installs packages needed to run Anaconda and the Anaconda unit tests
@ -127,6 +144,14 @@ install-requires:
: $${srcdir:=.} && \
dnf install $$(grep ^Requires: $${srcdir}/anaconda.spec.in | grep -v %{name} | cut -d ' ' -f 2 | grep -v ^anaconda)
# Install all packages required for running the tests
install-test-requires: install-buildrequires install-requires
dnf install bzip2 cppcheck \
lorax mock parallel rpm-ostree virt-install pykickstart spin-kickstarts \
python3-rpmfluff python3-mock python3-pocketlint python3-nose-testconfig \
python3-sphinx_rtd_theme libvirt-python3 python3-lxml python3-dogtail \
qemu-img
# Generate an updates.img based on the changed files since the release
# was tagged. Updates are copied to ./updates-img and then the image is
# created. By default, the updates subdirectory is removed after the
@ -144,7 +169,6 @@ updates:
runglade:
ANACONDA_DATA=$(srcdir)/data \
ANACONDA_WIDGETS_OVERRIDES=$(srcdir)/widgets/python \
ANACONDA_WIDGETS_DATA=$(srcdir)/widgets/data \
ANACONDA_INSTALL_CLASSES=$(srcdir)/pyanaconda/installclasses \
PYTHONPATH=$(srcdir):$(builddir)/pyanaconda/isys/.libs:$(srcdir)/widgets/python/:$(builddir)/widgets/src/.libs/ \
LD_LIBRARY_PATH=$(builddir)/widgets/src/.libs \
@ -155,10 +179,43 @@ runglade:
glade ${GLADE_FILE}
ci: rc-release
$(MAKE) -C utils/dd
$(MAKE) TMPDIR=/var/tmp check
@sudo $(MAKE) TMPDIR=/var/tmp TESTS=nosetests_root.sh check
@rm -f tests/test-suite.log.*
@mkdir -p $(USER_SITE_PACKAGES)
@cp $(abs_builddir)/tests/usercustomize.py $(USER_SITE_PACKAGES)
$(MAKE)
$(MAKE) TMPDIR=/var/tmp COVERAGE_PROCESS_START=$(abs_builddir)/.coveragerc \
TEST_SUITE_LOG=test-suite.log.$$$$ PYTHONUSERBASE=$(USER_SITE_BASE) check
@tail -n 1 tests/gettext_tests/*.log > tests/gettext_tests/gettext_tests.log
@sudo $(MAKE) TMPDIR=/var/tmp COVERAGE_PROCESS_START=$(abs_builddir)/.coveragerc \
TEST_SUITE_LOG=test-suite.log.$$$$ TESTS=nosetests_root.sh \
PYTHONUSERBASE=$(USER_SITE_BASE) check
@mkdir -p repo
@mv *rpm repo
@createrepo -p repo
@sudo $(MAKE) TMPDIR=/var/tmp TESTS=install/run_install_test.sh TEST_ANACONDA_REPO=file://$(abs_builddir)/repo/ check
@createrepo_c -p repo
@sudo $(MAKE) TMPDIR=/var/tmp COVERAGE_PROCESS_START=$(abs_builddir)/.coveragerc \
TEST_SUITE_LOG=test-suite.log.$$$$ TESTS=install/run_install_test.sh \
TEST_ANACONDA_REPO=file://$(abs_builddir)/repo/ PYTHONUSERBASE=$(USER_SITE_BASE) check
@cat tests/test-suite.log.* > tests/test-suite.log
@rm -f tests/test-suite.log.*
@rm -rf $(USER_SITE_BASE)
$(MAKE) coverage-report
test-gui:
@rm -f tests/test-suite.log
@rm -rf tests/autogui-results-*/
@mkdir -p $(USER_SITE_PACKAGES)
@cp $(abs_builddir)/tests/usercustomize.py $(USER_SITE_PACKAGES)
$(MAKE) -C pyanaconda/isys
sudo COVERAGE_PROCESS_START=$(abs_builddir)/.coveragerc \
PYTHONPATH=$(builddir)/pyanaconda/isys/.libs \
PYTHONUSERBASE=$(USER_SITE_BASE) \
$(abs_builddir)/tests/run_gui_tests.sh >tests/test-suite.log 2>&1
@rm -rf $(USER_SITE_BASE)
@cat tests/test-suite.log
@mv .coverage.* tests/
$(MAKE) coverage-report
coverage-report:
$(COVERAGE) combine tests/.coverage.*
$(COVERAGE) report --omit "tests/*" > tests/coverage-report.log
@cat tests/coverage-report.log

@ -14,8 +14,6 @@ dnl GNU Lesser General Public License for more details.
dnl
dnl You should have received a copy of the GNU Lesser General Public License
dnl along with this program. If not, see <http://www.gnu.org/licenses/>.
dnl
dnl Author: David Shea <dshea@redhat.com>
dnl ANACONDA_SOFT_FAILURE(MESSAGE)
dnl

@ -18,34 +18,33 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author(s): Brent Fox <bfox@redhat.com>
# Mike Fulbright <msf@redhat.com>
# Jakub Jelinek <jakub@redhat.com>
# Jeremy Katz <katzj@redhat.com>
# Chris Lumens <clumens@redhat.com>
# Paul Nasrat <pnasrat@redhat.com>
# Erik Troan <ewt@rpath.com>
# Matt Wilson <msw@rpath.com>
#
# This toplevel file is a little messy at the moment... (2001-06-22)
# ...still messy (2013-07-12)
import os
import site
coverage = None
# If we get a signal immediately after starting that would be pretty messed up
proc_cmdline = open("/proc/cmdline", "r").read() # pylint: disable=interruptible-system-call
proc_cmdline = open("/proc/cmdline", "r").read()
proc_cmdline = proc_cmdline.split()
if ("debug=1" in proc_cmdline) or ("debug" in proc_cmdline):
if ("inst.debug=1" in proc_cmdline) or ("inst.debug" in proc_cmdline):
import coverage
pyanaconda_dir = "pyanaconda"
for sitepkg in site.getsitepackages():
possible_dir = os.path.join(sitepkg, "pyanaconda")
if os.path.isdir(possible_dir):
pyanaconda_dir = possible_dir
break
cov = coverage.coverage(data_file="/mnt/sysimage/root/anaconda.coverage",
branch=True,
source=["/usr/sbin/anaconda", "pyanaconda"]
source=["/usr/sbin/anaconda", pyanaconda_dir]
)
cov.start()
import atexit, sys, os, time, signal
import atexit, sys, time, signal
import pid
def exitHandler(rebootData, storage):
@ -68,16 +67,6 @@ def exitHandler(rebootData, storage):
while True:
time.sleep(10000)
if image_count or flags.dirInstall:
anaconda.storage.umountFilesystems(swapoff=False)
devicetree = anaconda.storage.devicetree
devicetree.teardownAll()
for imageName in devicetree.diskImages:
dev = devicetree.getDeviceByName(imageName)
for loop in dev.parents:
loop.controllable = True
dev.deactivate(recursive=True)
if anaconda.dbus_inhibit_id:
from pyanaconda.screensaver import uninhibit_screensaver
uninhibit_screensaver(anaconda.dbus_session_connection, anaconda.dbus_inhibit_id)
@ -87,6 +76,16 @@ def exitHandler(rebootData, storage):
if anaconda.payload:
anaconda.payload.unsetup()
if image_count or flags.dirInstall:
anaconda.storage.umount_filesystems(swapoff=False)
devicetree = anaconda.storage.devicetree
devicetree.teardown_all()
for imageName in devicetree.disk_images:
dev = devicetree.get_device_by_name(imageName)
for loop in dev.parents:
loop.controllable = True
dev.deactivate(recursive=True)
# Clean up the PID file
if pidfile:
pidfile.close()
@ -94,23 +93,22 @@ def exitHandler(rebootData, storage):
if not flags.imageInstall and not flags.livecdInstall \
and not flags.dirInstall:
from pykickstart.constants import KS_SHUTDOWN, KS_WAIT
from pyanaconda.iutil import dracut_eject, get_mount_paths, execWithRedirect
if flags.eject or rebootData.eject:
for cdrom in storage.devicetree.getDevicesByType("cdrom"):
if get_mount_paths(cdrom.path):
dracut_eject(cdrom.path)
for cdrom in (d for d in storage.devices if d.type == "cdrom"):
if iutil.get_mount_paths(cdrom.path):
iutil.dracut_eject(cdrom.path)
if flags.kexec:
execWithRedirect("systemctl", ["--no-wall", "kexec"])
iutil.execWithRedirect("systemctl", ["--no-wall", "kexec"])
while True:
time.sleep(10000)
elif rebootData.action == KS_SHUTDOWN:
execWithRedirect("systemctl", ["--no-wall", "poweroff"])
iutil.execWithRedirect("systemctl", ["--no-wall", "poweroff"])
elif rebootData.action == KS_WAIT:
execWithRedirect("systemctl", ["--no-wall", "halt"])
iutil.execWithRedirect("systemctl", ["--no-wall", "halt"])
else: # reboot action is KS_REBOOT or None
execWithRedirect("systemctl", ["--no-wall", "reboot"])
iutil.execWithRedirect("systemctl", ["--no-wall", "reboot"])
def startSpiceVDAgent():
status = iutil.execWithRedirect("spice-vdagent", [])
@ -139,10 +137,11 @@ def doStartupX11Actions():
# fingers crossed.
# Add XDG_DATA_DIRS to the environment to pull in our overridden schema
# files.
datadir = os.environ.get('ANACONDA_DATADIR', '/usr/share/anaconda')
if 'XDG_DATA_DIRS' in os.environ:
xdg_data_dirs = '/usr/share/anaconda/window-manager:' + os.environ['XDG_DATA_DIRS']
xdg_data_dirs = datadir + '/window-manager:' + os.environ['XDG_DATA_DIRS']
else:
xdg_data_dirs = '/usr/share/anaconda/window-manager:/usr/share'
xdg_data_dirs = datadir + '/window-manager:/usr/share'
childproc = iutil.startProgram(["metacity", "--display", ":1", "--sm-disable"],
env_add={'XDG_DATA_DIRS': xdg_data_dirs})
@ -164,12 +163,20 @@ def doExtraX11Actions(runres):
set_x_resolution(runres)
# Load the system-wide Xresources
iutil.execWithRedirect("xrdb",
["-nocpp", "-merge", "/etc/X11/Xresources"])
startSpiceVDAgent()
def setupPythonUpdates():
from distutils.sysconfig import get_python_lib
import gi.overrides
if "ANACONDA_WIDGETS_OVERRIDES" in os.environ:
for p in os.environ["ANACONDA_WIDGETS_OVERRIDES"].split(":"):
gi.overrides.__path__.insert(0, os.path.abspath(p))
# Temporary hack for F18 alpha to symlink updates and product directories
# into tmpfs. To be removed after beta in order to directly use content
# from /run/install/ -- JLK
@ -234,145 +241,8 @@ def getAnacondaVersionString():
def parseArguments(argv=None, boot_cmdline=None):
from pyanaconda.anaconda_argparse import AnacondaArgumentParser
from pyanaconda.anaconda_argparse import HelpTextParser
datadir = os.environ.get("ANACONDA_DATADIR", "/usr/share/anaconda")
# NOTE: for each long option (like '--repo'), AnacondaOptionParser
# checks the boot arguments for bootarg_prefix+option ('inst.repo').
# If require_prefix is False, it also accepts the option without the
# bootarg_prefix ('repo').
# See anaconda_optparse.py and BootArgs (in flags.py) for details.
ap = AnacondaArgumentParser(bootarg_prefix="inst.", require_prefix=False)
help_parser = HelpTextParser(os.path.join(datadir, "anaconda_options.txt"))
# NOTE: store_false options will *not* get negated when the user does
# "option=0" on the boot commandline (store_true options do, though).
# Basically, don't use store_false unless the option starts with "no".
# YET ANOTHER NOTE: If you change anything here:
# a) document its usage in docs/boot-options.txt
# b) be prepared to maintain it for a very long time
# If this seems like too much trouble, *don't add a new option*!
# Version
ap.add_argument('--version', action='version', version="%(prog)s " + getAnacondaVersionString())
# Interface
ap.add_argument("-C", "--cmdline", dest="display_mode", action="store_const", const="c",
default="g", help=help_parser.help_text("cmdline"))
ap.add_argument("-G", "--graphical", dest="display_mode", action="store_const", const="g",
help=help_parser.help_text("graphical"))
ap.add_argument("-T", "--text", dest="display_mode", action="store_const", const="t",
help=help_parser.help_text("text"))
# Network
ap.add_argument("--proxy", metavar='PROXY_URL', help=help_parser.help_text("proxy"))
# Method of operation
ap.add_argument("-d", "--debug", dest="debug", action="store_true",
default=False, help=help_parser.help_text("debug"))
ap.add_argument("--ks", dest="ksfile", action="store_const",
metavar="KICKSTART_URL", const="/run/install/ks.cfg",
help=help_parser.help_text("ks"))
ap.add_argument("--kickstart", dest="ksfile", metavar="KICKSTART_PATH",
help=help_parser.help_text("kickstart"))
ap.add_argument("--rescue", dest="rescue", action="store_true", default=False,
help=help_parser.help_text("rescue"))
ap.add_argument("--armplatform", dest="armPlatform", type=str, metavar="PLATFORM_ID",
help=help_parser.help_text("armplatform"))
ap.add_argument("--multilib", dest="multiLib", action="store_true", default=False,
help=help_parser.help_text("multilib"))
ap.add_argument("-m", "--method", dest="method", default=None, metavar="METHOD",
help=help_parser.help_text("method"))
ap.add_argument("--askmethod", dest="askmethod", action="store_true", default=False,
help=help_parser.help_text("askmethod"))
ap.add_argument("--repo", dest="method", default=None, metavar="REPO_URL",
help=help_parser.help_text("repo"))
ap.add_argument("--stage2", dest="stage2", default=None, metavar="STAGE2_URL",
help=help_parser.help_text("stage2"))
ap.add_argument("--noverifyssl", action="store_true", default=False,
help=help_parser.help_text("noverifyssl"))
ap.add_argument("--liveinst", action="store_true", default=False,
help=help_parser.help_text("liveinst"))
# Display
ap.add_argument("--resolution", dest="runres", default=None, metavar="WIDTHxHEIGHT",
help=help_parser.help_text("resolution"))
ap.add_argument("--usefbx", dest="xdriver", action="store_const", const="fbdev",
help=help_parser.help_text("usefbx"))
ap.add_argument("--vnc", action="store_true", default=False,
help=help_parser.help_text("vnc"))
ap.add_argument("--vncconnect", metavar="HOST:PORT", help=help_parser.help_text("vncconnect"))
ap.add_argument("--vncpassword", default="", metavar="PASSWORD",
help=help_parser.help_text("vncpassword"))
ap.add_argument("--xdriver", dest="xdriver", action="store", type=str,
default=None, metavar="DRIVER", help=help_parser.help_text("xdriver"))
# Language
ap.add_argument("--keymap", metavar="KEYMAP", help=help_parser.help_text("keymap"))
ap.add_argument("--lang", metavar="LANG", help=help_parser.help_text("lang"))
# Obvious
ap.add_argument("--loglevel", metavar="LEVEL", help=help_parser.help_text("loglevel"))
ap.add_argument("--syslog", metavar="HOST[:PORT]", help=help_parser.help_text("syslog"))
ap.add_argument("--remotelog", metavar="HOST:PORT", help=help_parser.help_text("remotelog"))
from pykickstart.constants import SELINUX_DISABLED, SELINUX_ENFORCING
from pyanaconda.constants import SELINUX_DEFAULT
ap.add_argument("--noselinux", dest="selinux", action="store_const",
const=SELINUX_DISABLED, default=SELINUX_DEFAULT,
help=help_parser.help_text("noselinux"))
ap.add_argument("--selinux", action="store_const",
const=SELINUX_ENFORCING, help=help_parser.help_text("selinux"))
ap.add_argument("--nompath", dest="mpath", action="store_false", default=True,
help=help_parser.help_text("nompath"))
ap.add_argument("--mpath", action="store_true", help=help_parser.help_text("mpath"))
ap.add_argument("--nodmraid", dest="dmraid", action="store_false", default=True,
help=help_parser.help_text("nodmraid"))
ap.add_argument("--dmraid", action="store_true", help=help_parser.help_text("dmraid"))
ap.add_argument("--noibft", dest="ibft", action="store_false", default=True,
help=help_parser.help_text("noibft"))
ap.add_argument("--ibft", action="store_true", help=help_parser.help_text("ibft"))
# Geolocation
ap.add_argument("--geoloc", metavar="PROVIDER_ID", help=help_parser.help_text("geoloc"))
# Miscellaneous
ap.add_argument("--nomount", dest="rescue_nomount", action="store_true", default=False,
help=help_parser.help_text("nomount"))
ap.add_argument("--updates", dest="updateSrc", action="store", type=str,
metavar="UPDATES_URL", help=help_parser.help_text("updates"))
ap.add_argument("--image", action="append", dest="images", default=[],
metavar="IMAGE_SPEC", help=help_parser.help_text("image"))
ap.add_argument("--dirinstall", nargs="?", const=True, default=False,
help=help_parser.help_text("dirinstall"))
ap.add_argument("--memcheck", action="store_true", default=True,
help=help_parser.help_text("memcheck"))
ap.add_argument("--nomemcheck", action="store_false", dest="memcheck",
help=help_parser.help_text("nomemcheck"))
ap.add_argument("--leavebootorder", action="store_true", default=False,
help=help_parser.help_text("leavebootorder"))
ap.add_argument("--noeject", action="store_false", dest="eject", default=True,
help=help_parser.help_text("noeject"))
ap.add_argument("--extlinux", action="store_true", default=False,
help=help_parser.help_text("extlinux"))
ap.add_argument("--nombr", action="store_true", default=False,
help=help_parser.help_text("nombr"))
ap.add_argument("--mpathfriendlynames", action="store_true", default=True,
help=help_parser.help_text("mpathfriendlynames"))
ap.add_argument("--kexec", action="store_true", default=False,
help=help_parser.help_text("kexec"))
# some defaults change based on cmdline flags
if boot_cmdline is not None:
if "console" in boot_cmdline:
ap.set_defaults(display_mode="t")
from pyanaconda.anaconda_argparse import getArgumentParser
ap = getArgumentParser(getAnacondaVersionString(), boot_cmdline)
namespace = ap.parse_args(argv, boot_cmdline=boot_cmdline)
return (namespace, ap.deprecated_bootargs)
@ -456,7 +326,6 @@ def gtk_warning(title, reason):
# pylint: disable=redefined-outer-name
def check_memory(anaconda, options, display_mode=None):
from pyanaconda import isys
from pyanaconda.iutil import persistent_root_image
reason_strict = _("%(product_name)s requires %(needed_ram)s MB of memory to "
"install, but you only have %(total_ram)s MB on this machine.\n")
@ -464,7 +333,7 @@ def check_memory(anaconda, options, display_mode=None):
"MB of memory, but you only have %(total_ram)s MB\n.")
reboot_extra = _('\n'
'Press <return> to reboot your system.\n')
'Press [Enter] to reboot your system.\n')
livecd_title = _("Not enough RAM")
livecd_extra = _(" Try the text mode installer by running:\n\n"
"'/usr/bin/liveinst -T'\n\n from a root "
@ -478,12 +347,12 @@ def check_memory(anaconda, options, display_mode=None):
display_mode = anaconda.displayMode
reason = reason_strict
total_ram = int(isys.total_memory())
total_ram = int(isys.total_memory() / 1024)
needed_ram = int(isys.MIN_RAM)
graphical_ram = int(isys.MIN_GUI_RAM)
# count the squashfs.img in if it is kept in RAM
if not persistent_root_image():
if not iutil.persistent_root_image():
needed_ram += isys.SQUASHFS_EXTRA_RAM
graphical_ram += isys.SQUASHFS_EXTRA_RAM
@ -552,7 +421,7 @@ def setupDisplay(anaconda, options, addons=None):
vncS.anaconda = anaconda
anaconda.displayMode = options.display_mode
anaconda.isHeadless = arch.isS390()
anaconda.isHeadless = arch.is_s390()
if options.vnc:
flags.usevnc = True
@ -743,7 +612,7 @@ def prompt_for_ssh():
if connxinfo:
stdoutLog.info(_("Please ssh install@%s to begin the install."), connxinfo)
else:
stdoutLog.info(_("Please ssh install@<host> to continue installation."))
stdoutLog.info(_("Please ssh install@HOSTNAME to continue installation."))
def cleanPStore():
"""remove files stored in nonvolatile ram created by the pstore subsystem"""
@ -753,8 +622,7 @@ def cleanPStore():
# is sufficient free space on the flash part. On some machines this will
# take effect immediately, which is the best case. Unfortunately on some,
# an intervening reboot is needed."""
from pyanaconda.iutil import dir_tree_map
dir_tree_map("/sys/fs/pstore", os.unlink, files=True, dirs=False)
iutil.dir_tree_map("/sys/fs/pstore", os.unlink, files=True, dirs=False)
if __name__ == "__main__":
# check if the CLI help is requested and return it at once,
@ -792,6 +660,7 @@ if __name__ == "__main__":
from pyanaconda import constants
from pyanaconda.addons import collect_addon_paths
from pyanaconda import geoloc
from pyanaconda import iutil
# do this early so we can set flags before initializing logging
from pyanaconda.flags import flags, can_touch_runtime_system
@ -818,6 +687,16 @@ if __name__ == "__main__":
stdoutLog.error("anaconda must be run as root.")
sys.exit(1)
# check if input kickstart should be saved
if flags.nosave_input_ks:
log.warning("Input kickstart will not be saved to the installed system due to the nosave option.")
iutil.touch('/tmp/NOSAVE_INPUT_KS')
# check if logs should be saved
if flags.nosave_logs:
log.warning("Installation logs will not be saved to the installed system due to the nosave option.")
iutil.touch('/tmp/NOSAVE_LOGS')
# see if we're on s390x and if we've got an ssh connection
uname = os.uname()
if uname[4] == 's390x':
@ -840,19 +719,19 @@ if __name__ == "__main__":
from pyanaconda import isys
from pyanaconda import iutil
iutil.ipmi_report(constants.IPMI_STARTED)
if (opts.images or opts.dirinstall) and opts.liveinst:
stdoutLog.error("--liveinst cannot be used with --images or --dirinstall")
iutil.ipmi_report(constants.IPMI_ABORTED)
sys.exit(1)
if opts.images and opts.dirinstall:
stdoutLog.error("--images and --dirinstall cannot be used at the same time")
iutil.ipmi_report(constants.IPMI_ABORTED)
sys.exit(1)
elif opts.dirinstall:
if opts.dirinstall is True:
root_path = os.environ.get("ANACONDA_ROOT_PATH", "/mnt/sysimage")
else:
root_path = opts.dirinstall
root_path = opts.dirinstall
iutil.setTargetPhysicalRoot(root_path)
iutil.setSysroot(root_path)
@ -861,7 +740,6 @@ if __name__ == "__main__":
from pyanaconda import ntp
from pyanaconda import keyboard
from pyanaconda.iutil import ProxyString, ProxyStringError
from pyanaconda.iutil import open # pylint: disable=redefined-builtin
verdesc = "%s for %s %s" % (getAnacondaVersionString(),
product.productName, product.productVersion)
@ -888,7 +766,7 @@ if __name__ == "__main__":
if not opts.images and not opts.dirinstall:
print(logs_note)
# no fancy stuff like TTYs on a s390...
if not arch.isS390():
if not arch.is_s390():
if "TMUX" in os.environ and os.environ.get("TERM") == "screen":
print(shell_and_tmux_note)
else:
@ -997,6 +875,7 @@ if __name__ == "__main__":
flags.selinux = opts.selinux
flags.eject = opts.eject
flags.kexec = opts.kexec
flags.singlelang = opts.singlelang
# Switch to tty1 on exception in case something goes wrong during X start.
# This way if, for example, metacity doesn't start, we switch back to a
@ -1030,8 +909,6 @@ if __name__ == "__main__":
log.info("anaconda called with cmdline = %s", sys.argv)
log.info("Default encoding = %s ", sys.getdefaultencoding())
iutil.execWithRedirect("udevadm", ["control", "--env=ANACONDA=1"])
# Collect all addon paths
addon_paths = collect_addon_paths(constants.ADDON_PATHS)
@ -1048,6 +925,12 @@ if __name__ == "__main__":
flags.automatedInstall = True
flags.eject = False
ksFiles = [opts.ksfile]
elif os.path.exists("/run/install/ks.cfg") and not opts.liveinst:
# this is to handle such cases where a user has pre-loaded a
# ks.cfg onto an OEMDRV labeled device
flags.automatedInstall = True
flags.eject = False
ksFiles = ["/run/install/ks.cfg"]
else:
ksFiles = ["/tmp/updates/interactive-defaults.ks",
"/usr/share/anaconda/interactive-defaults.ks"]
@ -1203,6 +1086,14 @@ if __name__ == "__main__":
networkInitialize(ksdata)
threadMgr.add(AnacondaThread(name=constants.THREAD_WAIT_FOR_CONNECTING_NM, target=wait_for_connecting_NM_thread, args=(ksdata,)))
# initialize the screen access manager before launching the UI
from pyanaconda import screen_access
screen_access.initSAM()
# try to open any existing config file
# (might be created by pre-anaconda helper tools, injected during image
# generation, etc.)
screen_access.sam.open_config_file()
# now start the interface
setupDisplay(anaconda, opts, addon_paths)
if anaconda.gui_startup_failed:
@ -1232,23 +1123,23 @@ if __name__ == "__main__":
try:
for (name, path) in name_path_pairs(opts.images):
log.info("naming disk image '%s' '%s'", path, name)
anaconda.storage.config.diskImages[name] = path
anaconda.storage.config.disk_images[name] = path
image_count += 1
flags.imageInstall = True
except ValueError as e:
stdoutLog.error("error specifying image file: %s", e)
iutil.ipmi_report(constants.IPMI_ABORTED)
iutil.ipmi_abort(scripts=ksdata.scripts)
sys.exit(1)
if image_count:
anaconda.storage.setupDiskImages()
anaconda.storage.setup_disk_images()
from blivet.osinstall import storageInitialize
from blivet.osinstall import storage_initialize
from pyanaconda.packaging import payloadMgr
from pyanaconda.timezone import time_initialize
if not flags.dirInstall:
threadMgr.add(AnacondaThread(name=constants.THREAD_STORAGE, target=storageInitialize,
threadMgr.add(AnacondaThread(name=constants.THREAD_STORAGE, target=storage_initialize,
args=(anaconda.storage, ksdata, anaconda.protected)))
if can_touch_runtime_system("initialize time", touch_live=True):

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -1,6 +1,5 @@
#!/bin/bash -e
[ -d m4 ] || mkdir m4
autopoint --force
libtoolize --copy --force
aclocal -I m4
autoconf

@ -14,13 +14,11 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author: David Cantrell <dcantrell@redhat.com>
m4_define(python_required_version, 3.4)
AC_PREREQ([2.63])
AC_INIT([anaconda], [23.19.10], [anaconda-devel-list@redhat.com])
AC_INIT([anaconda], [25.20.9], [anaconda-devel-list@redhat.com])
# Disable building static libraries.
# This needs to be set before initializing automake
@ -43,34 +41,13 @@ AC_PROG_LN_S
AC_PROG_LIBTOOL
AC_PROG_MKDIR_P
# Check for the intltool programs
# These checks and subsitutions are adapted IT_PROG_INTLTOOL provided in
# intltool.m4, but without the parts where it breaks gettext.
AC_PATH_PROG([INTLTOOL_EXTRACT], [intltool-extract])
AC_PATH_PROG([INTLTOOL_MERGE], [intltool-merge])
AS_IF([test -z "$INTLTOOL_EXTRACT" -o -z "$INTLTOOL_MERGE"],
[ANACONDA_SOFT_FAILURE([intltool not found])])
# Add the bits for Makefile rules
INTLTOOL_V_MERGE='$(INTLTOOL__v_MERGE_$(V))'
INTLTOOL__v_MERGE_='$(INTLTOOL__v_MERGE_$(AM_DEFAULT_VERBOSITY))'
INTLTOOL__v_MERGE_0='@echo " ITMRG " $@;'
INTLTOOL_V_MERGE_OPTIONS='$(intltool__v_merge_options_$(V))'
intltool__v_merge_options_='$(intltool__v_merge_options_$(AM_DEFAULT_VERBOSITY))'
intltool__v_merge_options_0='-q'
AC_SUBST(INTLTOOL_V_MERGE)
AC_SUBST(INTLTOOL__v_MERGE_)
AC_SUBST(INTLTOOL__v_MERGE_0)
AC_SUBST(INTLTOOL_V_MERGE_OPTIONS)
AC_SUBST(intltool__v_merge_options_)
AC_SUBST(intltool__v_merge_options_0)
INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@'
AC_SUBST(INTLTOOL_DESKTOP_RULE)
AM_GNU_GETTEXT([external])
# Also update in gettextver in anaconda.spec.in
AM_GNU_GETTEXT_VERSION([0.18.3])
# Check for the gettext programs
AC_PATH_PROG([XGETTEXT], [xgettext])
AC_PATH_PROG([MSGFMT], [msgfmt])
AC_PATH_PROG([MSGMERGE], [msgmerge])
AC_PATH_PROG([MSGCAT], [msgcat])
AS_IF([test -z "$XGETTEXT" -o -z "$MSGFMT" -o -z "$MSGMERGE" -o -z "$MSGCAT"],
[ANACONDA_SOFT_FAILURE([gettext not found])])
# Checks for header files.
AC_CHECK_HEADERS([fcntl.h stdlib.h string.h sys/time.h unistd.h],
@ -147,7 +124,7 @@ AC_CONFIG_FILES([Makefile
data/window-manager/Makefile
data/window-manager/config/Makefile
data/window-manager/theme/Makefile
po/Makefile.in
po/Makefile
scripts/Makefile
pyanaconda/Makefile
pyanaconda/version.py
@ -166,6 +143,7 @@ AC_CONFIG_FILES([Makefile
pyanaconda/ui/tui/spokes/Makefile
pyanaconda/ui/tui/Makefile
data/post-scripts/Makefile
data/pixmaps/Makefile
tests/Makefile
utils/Makefile
utils/dd/Makefile])

@ -14,10 +14,8 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author: Martin Sivak <msivak@redhat.com>
SUBDIRS = command-stubs liveinst systemd post-scripts window-manager
SUBDIRS = command-stubs liveinst systemd post-scripts pixmaps window-manager
CLEANFILES = *~

@ -8,59 +8,26 @@
* default, but it defines them for level bars using a continuous value between
* 0 and 1, so our discrete level bars are effectively always at the "high"
* level.
*
* Fun surprises that might change in future versions:
*
* - Defining properties for a level will set properties on both the filled
* portion and the empty portion of the level bar. So if all of the display
* properties are set, which we do, the level bar effectively becomes 100%
* filled with whatever properties are set. Copying the .empty-fill-block
* properties from the theme so that they apply at the application level
* works around this.
*
* - There's a bug in the handling of the maximum offset in that it only
* applies when value == max-value, rather than when it's between
* max-value and the next lower offset. For example, consider a
* discrete-mode level bar with a max-value of 4 and offsets defined as
* "low": 2.0, "medium": 3.0 and "high": 4.0. Value 1 will be low,
* value 2 will be medium, value 3 will be in an undefined no-man's land,
* and value 4 will be high. To get around this we re-define the default
* fill-block values as the same as fill-block.level-high.
*
* - The GNOME Adwaita theme applies a gradient to the progress bar when the
* window is focused. It does this by redefining the colors in a
* background-image property, so unless we reset background-image our colors
* will only apply when the window is out of focus, which uses the :backdrop
* selector.
*/
@define-color anaconda_level_bar_low red;
@define-color anaconda_level_bar_medium orange;
@define-color anaconda_level_bar_high green;
.level-bar.fill-block.level-low {
levelbar.discrete trough block.filled.low {
border-color: darker(@anaconda_level_bar_low);
background-color: @anaconda_level_bar_low;
background-image: none;
background: @anaconda_level_bar_low;
}
.level-bar.fill-block.level-medium {
levelbar.discrete trough block.filled.medium {
border-color: darker(@anaconda_level_bar_medium);
background-color: @anaconda_level_bar_medium;
background-image: none;
background: @anaconda_level_bar_medium;
}
.level-bar.fill-block,
.level-bar.fill-block.level-high {
levelbar.discrete trough block.filled.full,
levelbar.discrete trough block.filled.high {
border-color: darker(@anaconda_level_bar_high);
background-color: @anaconda_level_bar_high;
background-image: none;
}
.level-bar.fill-block.empty-fill-block {
background-color: transparent;
background-image: none;
border-color: alpha(#000000, 0.1);
background: @anaconda_level_bar_high;
}
/* As of gnome-themes-standard 3.9.90, the Adwaita theme uses the same color
@ -158,44 +125,12 @@ AnacondaSpokeWindow #nav-box {
background-color: @fedora;
}
/* These rules were removed when the Adwaita theme moved from
* gnome-themes-standard to gtk. The selectors had been wildcards, but after
* the move they were replaced with more specific selectors. We need to apply
* the old style to anconda's custom widgets in order for the selection
* highlight and insensitive shading to appear.
*/
@define-color anaconda_selected_bg_color #4a90d9;
@define-color anaconda_selected_fg_color #ffffff;
AnacondaMountpointSelector:selected,
AnacondaDiskOverview:selected,
AnacondaSpokeSelector:selected,
AnacondaMountpointSelector:selected:focus,
AnacondaDiskOverview:selected:focus,
AnacondaSpokeSelector:selected:focus {
background-color: @anaconda_selected_bg_color;
color: @anaconda_selected_fg_color;
}
@define-color anaconda_insensitive_bg_color #f4f4f2;
@define-color anaconda_insensitive_fg_color #a7aba7;
@define-color anaconda_internal_element_color #888a85;
@define-color anaconda_insensitive_borders shade(@anaconda_internal_element_color, 1.37);
AnacondaMountpointSelector:insensitive,
AnacondaDiskOverview:insensitive,
AnacondaSpokeSelector:insensitive {
background-color: @anaconda_insensitive_bg_color;
color: @anaconda_insensitive_fg_color;
border-color: @anaconda_insensitive_borders;
}
/* When multi-column GtkTreeViews set a row separator, the horizontal-separator
* style property is still applied to the row separator, breaking the row
* separator up for each column. It looks kind of dumb. Provide a way to not do
* that.
*/
GtkTreeView.solid-separator {
treeview.solid-separator {
-GtkTreeView-horizontal-separator: 0;
}

@ -30,10 +30,11 @@ syntax see the Anaconda options wiki page: http://fedoraproject.org/wiki/Anacond
kickstart
Gives the local file path to use for kickstart. Normally only used when running anaconda
from the cmdline.
from the cmdline. This option is not supported for live installations.
rescue
Start the rescue environment instead of installation.
Start the rescue environment instead of installation. This option is not supported for
live installations.
armplatform
Can be used to specify the ARM platform for the installation by passing the appropriate PLATFORM_ID.
@ -109,6 +110,9 @@ lang
Language to use for the installation. LANG should be a language code which is valid to be used
with the lang kickstart command.
singlelang
Install in single language mode - no interactive options for language configuration will be available.
loglevel
Set the minimum level required for messages to be logged on a terminal (log files always
contain messages of all levels). Values for LEVEL are "debug", "info", "warning", "error",
@ -234,3 +238,14 @@ be retried if there is no listener (ie. won't block the installation).
kexec
Reboot the system using kexec with the new kernel and initrd. This will result in
a faster reboot by skipping the BIOS/Firmware and bootloader steps.
nosave
This option controls what installation results should not be saved to the installed system,
valid values are: "input_ks", "output_ks", "all_ks", "logs" and "all".
The "input_ks" value disables saving of the input kickstart (if any), "output_ks" disables saving of the output
kickstart generated by Anaconda, "all_ks" disables saving of both input and output kickstarts, "logs" disables saving
of all installation logs and "all" disables saving of all kickstarts and all logs. Multiple values can be combined
as a comma separated list, for example: "all_ks,logs"
legacygrub
Enable legacygrub (for installing older OSes). You probably do not want this.

@ -14,8 +14,6 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author: David Cantrell <dcantrell@redhat.com>
commandstubsdir = $(datadir)/$(PACKAGE_NAME)
dist_commandstubs_SCRIPTS = $(srcdir)/*-stub

@ -2,7 +2,7 @@
#
# scan system for harddrives and output device name/size
#
# Copyright (C) 2007, 2009 Red Hat, Inc. All rights reserved.
# Copyright (C) 2007-2016 Red Hat, Inc. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -19,12 +19,42 @@
#
import sys
import os
import stat
import parted
# The list-harddrives script is primarily meant for use in the
# kickstart %post scriptlets for listing all individual harddrives
# on the system.
#
# For more information check the docs/list-harddrives.rsh file
# in the Anaconda source code.
def check_device(device):
if stat.S_ISBLK(os.stat(device.path).st_mode):
# exclude device mapper devices
if device.type == parted.DEVICE_DM:
return False
# exclude block devices for CD/DVD disks
elif device.path.startswith("/dev/sr"):
return False
# exclude zram block devices
elif device.path.startswith("/dev/zram"):
return False
# exclude software raid block devices
elif device.path.startswith("/dev/md"):
return False
# the remaining block devices should be fine
else:
return True
else:
# ignore everything that is not a block device
return False
def main(argv):
lst = set()
for dev in filter(lambda d: d.type != parted.DEVICE_DM and not d.path.startswith("/dev/sr"), parted.getAllDevices()):
for dev in filter(check_device, parted.getAllDevices()):
if dev.path.startswith("/dev/"):
path = dev.path[5:]
else:

@ -14,8 +14,6 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author: David Cantrell <dcantrell@redhat.com>
SUBDIRS = console.apps gnome pam.d
@ -23,28 +21,33 @@ if IS_LIVEINST_ARCH
dist_sbin_SCRIPTS = liveinst
desktopdir = $(datadir)/applications
desktop_DATA = liveinst.desktop
dist_desktop_DATA = liveinst.desktop
dist_libexec_SCRIPTS = liveinst-setup.sh
xinitdir = $(sysconfdir)/X11/xinit/xinitrc.d
dist_xinit_SCRIPTS = zz-liveinst.sh
autostartdir = $(sysconfdir)/xdg/autostart
dist_autostart_DATA = liveinst-setup.desktop
install-exec-local:
$(MKDIR_P) $(DESTDIR)$(bindir)
$(LN_S) consolehelper $(DESTDIR)$(bindir)/liveinst
# Merge translations into the desktop file
# Use the merged translations in $(builddir). If no merged translations exist,
# just exit.
install-data-hook:
for p in $(top_builddir)/po/*.mpo ; do \
[ -e $$p ] || exit 0 ; \
$(MSGFMT) --desktop --template=$(DESTDIR)$(desktopdir)/liveinst.desktop \
--locale=$$(basename $$p .mpo) \
-o $(DESTDIR)$(desktopdir)/liveinst.desktop.new $$p || exit 1 ; \
mv $(DESTDIR)$(desktopdir)/liveinst.desktop.new $(DESTDIR)$(desktopdir)/liveinst.desktop || exit 1 ; \
done
uninstall-local:
rm -f $(DESTDIR)$(bindir)/liveinst
endif
EXTRA_DIST = README liveinst.desktop.in
CLEANFILES = liveinst.desktop *.h
EXTRA_DIST = README
MAINTAINERCLEANFILES = Makefile.in
@INTLTOOL_DESKTOP_RULE@
# Files generated for gettext need to be included in the distribution
EXTRA_DIST += $(srcdir)/liveinst.desktop.in.h
$(srcdir)/liveinst.desktop.in.h: $(srcdir)/liveinst.desktop.in
@$(MAKE) -C $(top_builddir)/po $(abs_top_srcdir)/$(subdir)/$$(basename $@)

@ -14,18 +14,11 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author: David Cantrell <dcantrell@redhat.com>
if IS_LIVEINST_ARCH
consoledir = $(sysconfdir)/security/console.apps
dist_console_DATA = liveinst
endif
#
# Files generated for gettext need to be included in the distribution
EXTRA_DIST = $(srcdir)/liveinst.h
$(srcdir)/liveinst.h: $(srcdir)/liveinst
@$(MAKE) -C $(top_builddir)/po $(abs_top_srcdir)/$(subdir)/$$(basename $@)
CLEANFILES = *.h
MAINTAINERCLEANFILES = Makefile.in

@ -14,24 +14,26 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author: Kalev Lember <kalevlember@gmail.com>
welcomedir = $(datadir)/$(PACKAGE_NAME)/gnome
dist_welcome_DATA = install-button.png
dist_welcome_SCRIPTS = fedora-welcome
welcome_DATA = fedora-welcome.desktop
EXTRA_DIST = fedora-welcome.desktop.in
CLEANFILES = fedora-welcome.desktop
dist_welcome_DATA = install-button.png fedora-welcome.desktop
dist_welcome_SCRIPTS = fedora-welcome.js
MAINTAINERCLEANFILES = Makefile.in
@INTLTOOL_DESKTOP_RULE@
# Merge the translations into the desktop file
# Use the merged translations in $(builddir). If no merged translations exist,
# just exit.
# Rename fedora-welcome.js to just fedora-welcome
install-data-hook:
for p in $(top_builddir)/po/*.mpo ; do \
[ -e $$p ] || exit 0 ; \
$(MSGFMT) --desktop --template=$(DESTDIR)$(welcomedir)/fedora-welcome.desktop \
--locale=$$(basename $$p .mpo) \
-o $(DESTDIR)$(welcomedir)/fedora-welcome.desktop.new $$p || exit 1 ; \
mv $(DESTDIR)$(welcomedir)/fedora-welcome.desktop.new $(DESTDIR)$(welcomedir)/fedora-welcome.desktop || exit 1 ; \
done
cd $(DESTDIR)$(welcomedir) && mv fedora-welcome.js fedora-welcome
# Files generated for gettext need to be included in the distribution
EXTRA_DIST += $(srcdir)/fedora-welcome.po $(srcdir)/fedora-welcome.desktop.in.h
$(srcdir)/fedora-welcome.po $(srcdir)/fedora-welcome.desktop.in.h: \
$(srcdir)/fedora-welcome $(srcdir)/fedora-welcome.desktop.in
@$(MAKE) -C $(top_builddir)/po $(abs_top_srcdir)/$(subdir)/$$(basename $@)
uninstall-hook:
-cd $(DESTDIR)$(welcomedir) && rm -f fedora-welcome

@ -1,8 +0,0 @@
[Desktop Entry]
_Name=Welcome to Fedora
Exec=/usr/share/anaconda/gnome/fedora-welcome
Terminal=false
Type=Application
StartupNotify=true
NoDisplay=true
X-GNOME-Autostart-enabled=true

@ -16,9 +16,6 @@
* 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.
*
* Authors: Cosimo Cecchi <cosimoc@redhat.com>
*
*/
const Gdk = imports.gi.Gdk;

@ -20,10 +20,6 @@
LIVE_INSTALL=0
IMAGE_INSTALL=0
RESCUE=0
if [[ "$LIVECMD $*" =~ "--rescue" ]]; then
RESCUE=1
fi
if [ -z "$LIVECMD" ]; then
LIVE_INSTALL=1
@ -134,6 +130,17 @@ for opt in `cat /proc/cmdline` $*; do
echo "$text" >&2
fi
;;
rescue|--rescue)
title="Configuration not supported"
text="Rescue mode is not supported on live media. Please use the normal system tools to recover your system."
if which zenity &> /dev/null; then
zenity --warning --title="$title" --text="$text"
else
echo "$title" >&2
echo "$text" >&2
fi
exit 1
;;
esac
done
@ -179,6 +186,9 @@ if [ -z $LC_ALL ]; then
export LC_ALL=$LANG
fi
# Force the X11 backend since sudo and wayland do not mix
export GDK_BACKEND=x11
if [ -x /usr/bin/udisks ]; then
/usr/bin/udisks --inhibit -- $ANACONDA $*
else
@ -189,7 +199,7 @@ if [ -e /tmp/updates ]; then rm -r /tmp/updates; fi
if [ -e /tmp/updates.img ]; then rm /tmp/updates.img; fi
# try to teardown the filesystems if this was an image install
if [ $IMAGE_INSTALL = 1 -a $RESCUE = 0 ]; then
if [ $IMAGE_INSTALL = 1 ]; then
anaconda-cleanup
fi

@ -0,0 +1,9 @@
[Desktop Entry]
Type=Application
Name=Liveinst Setup
TryExec=/usr/sbin/liveinst
Exec=/usr/libexec/liveinst-setup.sh
NoDisplay=true
X-GNOME-AutoRestart=false
X-GNOME-Autostart-Phase=Initialization
X-GNOME-Autostart-Notify=false

@ -0,0 +1,14 @@
#!/bin/bash
# Set up a launcher on the desktop for the live installer if we're on
# a live CD
if [ ! \( -b /dev/mapper/live-base -o -b /dev/mapper/live-osimg-min \) ]; then
exit 0
fi
# Prevents breakage if the hostname is changed before or during the install
# Also lets us run (with the X11 backend) on Wayland
[ -x /usr/bin/xhost ] && xhost +si:localuser:root > /dev/null 2>&1
test -f ${XDG_CONFIG_HOME:-~/.config}/user-dirs.dirs && source ${XDG_CONFIG_HOME:-~/.config}/user-dirs.dirs
cp /usr/share/applications/liveinst.desktop "${XDG_DESKTOP_DIR:-$HOME/Desktop}"

@ -1,11 +1,12 @@
[Desktop Entry]
_Name=Install to Hard Drive
_GenericName=Install
_Comment=Install the live CD to your hard disk
Name=Install to Hard Drive
GenericName=Install
Comment=Install the live CD to your hard disk
Categories=System;Utility;X-Red-Hat-Base;X-Fedora;GNOME;GTK;
Exec=/usr/bin/liveinst
Terminal=false
Type=Application
# TRANSLATORS: Icon name, probably should not be translated
Icon=anaconda
StartupNotify=true
NoDisplay=true

@ -14,8 +14,6 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author: David Cantrell <dcantrell@redhat.com>
if IS_LIVEINST_ARCH
pamdir = $(sysconfdir)/pam.d

@ -1,17 +0,0 @@
#!/bin/bash
# Set up a launcher on the desktop for the live installer if we're on
# a live CD
# Prevents breakage if the hostname is changed before or during the install
[ -x /usr/bin/xhost ] && xhost +si:localuser:root > /dev/null 2>&1
# don't run on geode (olpc)
if [ `grep -c Geode /proc/cpuinfo` -eq 0 ]; then
if [ -b /dev/mapper/live-osimg-min ]; then
test -f ${XDG_CONFIG_HOME:-~/.config}/user-dirs.dirs && source ${XDG_CONFIG_HOME:-~/.config}/user-dirs.dirs
cp /usr/share/applications/liveinst.desktop "${XDG_DESKTOP_DIR:-$HOME/Desktop}"
elif [ -f /.livecd-configured ]; then # FIXME: old way... this should go away
test -f ${XDG_CONFIG_HOME:-~/.config}/user-dirs.dirs && source ${XDG_CONFIG_HOME:-~/.config}/user-dirs.dirs
cp /usr/share/applications/liveinst.desktop "${XDG_DESKTOP_DIR:-$HOME/Desktop}"
fi
fi

@ -1,6 +1,6 @@
# pixmaps/Makefile.am for anaconda
#
# Copyright (C) 2009 Red Hat, Inc.
# Copyright (C) 2016 Red Hat, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published
@ -15,9 +15,9 @@
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author: David Cantrell <dcantrell@redhat.com>
pixmapsdir = $(datadir)/anaconda/pixmaps
dist_pixmaps_DATA = $(srcdir)/*.png $(srcdir)/*.svg
# Author(s): Vendula Poncova <vponcova@redhat.com>
#
pixmapsdir = $(datadir)/$(PACKAGE_NAME)/pixmaps
dist_pixmaps_DATA = anaconda-password-show-off.svg anaconda-password-show-on.svg
MAINTAINERCLEANFILES = Makefile.in

@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<path style="fill:currentColor;fill-opacity:1;stroke:none"
d="M 13.314453 2 L 2 13.294922 L 2.7148438 14 L 14 2.6972656 L 13.314453 2 z M 8 3 A 8.9999916 9.000003 0 0 0 0.12304688 7.6679688 C 0.25199187 8.0317035 0.48048562 8.3445563 0.77929688 8.5761719 A 7.9999926 8.0000028 0 0 1 8 4 A 3.9999993 4.0000007 0 0 0 4 8 A 3.9999993 4.0000007 0 0 0 4.1054688 8.8945312 L 5 8 A 2.9999993 3.0000005 0 0 1 8 5 L 8.8925781 4.1074219 A 3.9999993 4.0000007 0 0 0 8.3496094 4.0175781 A 7.9999926 8.0000028 0 0 1 8.9277344 4.0722656 L 9.8066406 3.1933594 A 8.9999916 9.000003 0 0 0 8 3 z M 13.835938 5.1640625 L 13.121094 5.8789062 A 7.9999926 8.0000028 0 0 1 15.220703 8.5761719 C 15.522218 8.3424607 15.752612 8.0261216 15.880859 7.6582031 A 8.9999916 9.000003 0 0 0 13.835938 5.1640625 z M 11.894531 7.1054688 L 11 8 A 2.9999993 3.0000005 0 0 1 8 11 L 7.1074219 11.892578 A 3.9999993 4.0000007 0 0 0 8 12 A 3.9999993 4.0000007 0 0 0 12 8 A 3.9999993 4.0000007 0 0 0 11.894531 7.1054688 z "
class="ColorScheme-Text"
/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@ -0,0 +1,21 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<g
transform="translate(-421.71429,-531.79074)">
<g
transform="matrix(0.75,0,0,0.74999813,421.46429,-241.22897)">
<path
style="fill:currentColor;fill-opacity:1;stroke:none"
d="M 8 3 A 8.9999925 9.0000023 0 0 0 0.12304688 7.6679688 C 0.2519919 8.0317178 0.48048563 8.3445725 0.77929688 8.5761719 A 7.9999935 8.0000021 0 0 1 8 4 A 3.9999996 4.0000004 0 0 0 4 8 A 3.9999996 4.0000004 0 0 0 8 12 A 3.9999996 4.0000004 0 0 0 12 8 A 3.9999996 4.0000004 0 0 0 8.3496094 4.0175781 A 7.9999935 8.0000021 0 0 1 15.220703 8.5761719 C 15.522218 8.3424725 15.752612 8.0260772 15.880859 7.6582031 A 8.9999925 9.0000023 0 0 0 8 3 z M 8 5 A 2.9999996 3.0000002 0 0 1 11 8 A 2.9999996 3.0000002 0 0 1 8 11 A 2.9999996 3.0000002 0 0 1 5 8 A 2.9999996 3.0000002 0 0 1 8 5 z M 8 6 A 1.9999999 2.0000003 0 0 0 6 8 A 1.9999999 2.0000003 0 0 0 8 10 A 1.9999999 2.0000003 0 0 0 10 8 A 1.9999999 2.0000003 0 0 0 9.9101562 7.4121094 A 0.9999999 1 0 0 1 9 8 A 0.9999999 1 0 0 1 8 7 A 0.9999999 1 0 0 1 8.5898438 6.0898438 A 1.9999999 2.0000003 0 0 0 8 6 z "
transform="matrix(1.3333333,0,0,1.3333367,0.33333333,1030.6955)"
class="ColorScheme-Text"
id="rect4170" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

@ -1,12 +1,27 @@
# Note, this script log will not be copied to the installed system.
%post --nochroot
mkdir -p $ANA_INSTALL_PATH/var/log/anaconda
for log in anaconda.log syslog X.log program.log packaging.log storage.log ifcfg.log yum.log dnf.log dnf.rpm.log; do
[ -e /tmp/$log ] && cp /tmp/$log $ANA_INSTALL_PATH/var/log/anaconda/
done
cp /tmp/ks-script*.log $ANA_INSTALL_PATH/var/log/anaconda/
journalctl -b > $ANA_INSTALL_PATH/var/log/anaconda/journal.log
chmod 0600 $ANA_INSTALL_PATH/var/log/anaconda/*
NOSAVE_INPUT_KS_FILE=/tmp/NOSAVE_INPUT_KS
NOSAVE_LOGS_FILE=/tmp/NOSAVE_LOGS
PRE_ANA_LOGS=/tmp/pre-anaconda-logs
if [ -e ${NOSAVE_LOGS_FILE} ]; then
rm -f ${NOSAVE_LOGS_FILE}
else
mkdir -p $ANA_INSTALL_PATH/var/log/anaconda
for log in anaconda.log syslog X.log program.log packaging.log storage.log ifcfg.log lvm.log dnf.librepo.log hawkey.log; do
[ -e /tmp/$log ] && cp /tmp/$log $ANA_INSTALL_PATH/var/log/anaconda/
done
[ -e /tmp/pre-anaconda-logs ] && cp -r $PRE_ANA_LOGS $ANA_INSTALL_PATH/var/log/anaconda
cp /tmp/ks-script*.log $ANA_INSTALL_PATH/var/log/anaconda/
journalctl -b > $ANA_INSTALL_PATH/var/log/anaconda/journal.log
chmod 0600 $ANA_INSTALL_PATH/var/log/anaconda/*
fi
if [ -e ${NOSAVE_INPUT_KS_FILE} ]; then
rm -f ${NOSAVE_INPUT_KS_FILE}
else
[ -e /run/install/ks.cfg ] && cp /run/install/ks.cfg $ANA_INSTALL_PATH/root/original-ks.cfg
fi
%end

@ -14,8 +14,6 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author: Chris Lumens <clumens@redhat.com>
postscriptsdir = $(datadir)/$(PACKAGE_NAME)/post-scripts
dist_postscripts_DATA = 40-qubes-alt-kernels.ks 50-qubes.ks 60-systemd-preset.ks 80-setfilecons.ks 90-copy-screenshots.ks 99-copy-logs.ks

@ -1,6 +1,6 @@
# systemd/Makefile.am for anaconda
#
# Copyright (C) 2011 Red Hat, Inc.
# Copyright (C) 2011, 2016 Red Hat, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published
@ -14,22 +14,21 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author: Chris Lumens <clumens@redhat.com>
systemddir = $(prefix)/lib/systemd/system
generatordir = $(prefix)/lib/systemd/system-generators
dist_systemd_DATA = anaconda.service \
anaconda-noshell.service \
anaconda-direct.service \
anaconda.target \
anaconda-tmux@.service \
anaconda-shell@.service \
instperf.service \
anaconda-sshd.service \
anaconda-nm-config.service \
zram.service
anaconda-noshell.service \
anaconda-direct.service \
anaconda.target \
anaconda-tmux@.service \
anaconda-shell@.service \
instperf.service \
anaconda-sshd.service \
anaconda-nm-config.service \
anaconda-pre.service \
zram.service
dist_generator_SCRIPTS = anaconda-generator

@ -1,6 +1,14 @@
#!/bin/bash
# anaconda-generator: generate services needed for anaconda operation
# only run in the Anaconda installation environment
ANACONDA_TARGET="/lib/systemd/system/anaconda.target"
CURRENT_DEFAULT_TARGET=$(readlink /etc/systemd/system/default.target)
if [ "$ANACONDA_TARGET" != "$CURRENT_DEFAULT_TARGET" ]; then
exit 0
fi
# set up dirs
systemd_dir=/lib/systemd/system
target_dir=$systemd_dir/anaconda.target.wants
@ -33,3 +41,4 @@ for tty in hvc0 hvc1 xvc0 hvsi0 hvsi1 hvsi2; do
done
ln -sf $systemd_dir/anaconda-nm-config.service $target_dir/anaconda-nm-config.service
ln -sf $systemd_dir/anaconda-pre.service $target_dir/anaconda-pre.service

@ -4,4 +4,5 @@ Description=Anaconda NetworkManager configuration
Before=NetworkManager.service
[Service]
Type=oneshot
ExecStart=/usr/bin/anaconda-disable-nm-ibft-plugin

@ -0,0 +1,21 @@
[Unit]
# This service is to be run before anaconda starts and log data before anaconda changes them
Description=pre-anaconda logging service
Requires=basic.target
After=basic.target
Before=anaconda.target
Wants=instperf.service
Wants=rsyslog.service
Wants=systemd-udev-settle.service
Wants=NetworkManager.service
Wants=plymouth-quit.service plymouth-quit-wait.service
Wants=zram.service
Wants=systemd-logind.service
[Service]
Type=oneshot
ExecStart=/usr/libexec/anaconda/anaconda-pre-log-gen
StardardInput=tty
StandardOutput=journal+console
StandardError=journal+console
TimeoutSec=0

@ -1,15 +1,17 @@
[Unit]
Description=OpenSSH server daemon
Before=anaconda.target
After=syslog.target network.target
After=syslog.target network.target sshd-keygen.target
Wants=sshd-keygen.target
ConditionKernelCommandLine=|sshd
ConditionKernelCommandLine=|inst.sshd
ConditionKernelCommandLine=!inst.sshd=0
ConditionKernelCommandLine=!sshd=0
# TODO: use ConditionArchitecture in systemd v210 or later
ConditionPathIsDirectory=|/sys/hypervisor/s390
[Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStartPre=/usr/sbin/sshd-keygen
ExecStartPre=/usr/sbin/handle-sshpw
ExecStart=/usr/sbin/sshd -D $OPTIONS -f /etc/ssh/sshd_config.anaconda
ExecReload=/bin/kill -HUP $MAINPID

@ -10,5 +10,6 @@ Wants=NetworkManager.service
Wants=plymouth-quit.service plymouth-quit-wait.service
Wants=anaconda-direct.service anaconda.service
Wants=anaconda-sshd.service
Wants=anaconda-pre.service
Wants=zram.service
Wants=systemd-logind.service

@ -17,4 +17,8 @@ new-window -d -n log "tail -F /tmp/anaconda.log"
new-window -d -n storage-log "tail -F /tmp/storage.log"
new-window -d -n program-log "tail -F /tmp/program.log"
detach-client -s anaconda
# The idea here is to detach the client started here via anaconda.service, and
# then re-attach to it in the tmux service run on the console tty. However,
# the detach-client directive is now giving us "no current client" for some
# reason.
# detach-client -s anaconda

@ -14,7 +14,5 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author: David Shea <dshea@redhat.com>
SUBDIRS = config theme

@ -14,15 +14,14 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author: David Shea <dshea@redhat.com>
schemadir = $(pkgdatadir)/window-manager/glib-2.0/schemas
# These files need to be compiled by glib-compile-schemas. This is handled
# in the spec file scriptlets.
dist_schema_DATA = org.gnome.desktop.wm.keybindings.gschema.override \
org.gnome.desktop.wm.preferences.gschema.override
org.gnome.desktop.wm.preferences.gschema.override \
org.gnome.metacity.gschema.override
# GSettings insists on the override files being in the same directory as the
# schemas they modify, so pretend that this is the case with symlinks and
@ -31,8 +30,9 @@ install-data-hook:
$(MKDIR_P) $(DESTDIR)$(schemadir)
$(LN_S) -f /usr/share/glib-2.0/schemas/org.gnome.desktop.wm.keybindings.gschema.xml $(DESTDIR)$(schemadir)
$(LN_S) -f /usr/share/glib-2.0/schemas/org.gnome.desktop.wm.preferences.gschema.xml $(DESTDIR)$(schemadir)
$(LN_S) -f /usr/share/glib-2.0/schemas/org.gnome.metacity.gschema.xml $(DESTDIR)$(schemadir)
$(LN_S) -f /usr/share/glib-2.0/schemas/org.gnome.desktop.enums.xml $(DESTDIR)$(schemadir)
glib-compile-schemas $(DESTDIR)$(schemadir)
glib-compile-schemas --strict $(DESTDIR)$(schemadir)
uninstall-local:
rm -f $(DESTDIR)$(schemadir)/*.xml

@ -1,6 +1,7 @@
[org.gnome.desktop.wm.preferences]
button-layout=':'
button-layout=':close'
action-right-click-titlebar='none'
action-double-click-titlebar='none'
num-workspaces=1
theme='Anaconda'
mouse-button-modifier=''

@ -14,8 +14,6 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author: David Shea <dshea@redhat.com>
themedir = $(datadir)/themes/Anaconda/metacity-1

@ -14,8 +14,6 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author: David Cantrell <dcantrell@redhat.com>
EXTRA_DIST = $(srcdir)/*.rst $(srcdir)/*.txt $(srcdir)/conf.py
@ -73,6 +71,8 @@ apidoc:
if [ -f /usr/bin/$(SPHINXAPIDOC) ]; then \
rm $(addprefix ./, $(MODULE_NAMES)) ; \
$(SPHINXAPIDOC) -o . $(SOURCEDIR) ; \
rm $(addprefix ./, tests/*.rst) ; \
$(SPHINXAPIDOC) -o ./tests ../tests ../tests/storage/run_storage_tests.py ; \
fi
html: apidoc

@ -75,6 +75,11 @@ different ways:
You can specify what version of the NFS protocol to use by adding ``nfsvers=X``
to the `options`.
This accepts not just an installable tree directory in the ``<path>`` element,
but you can also specify an ``.iso`` file. That ISO file is then mounted and
used as the installation tree. This is often used for simulating a standard
DVD installation using a remote ``DVD.iso`` image.
.. _diskdev:
@ -269,6 +274,14 @@ ifname
Assign the given interface name to the network device with the given MAC. May
be used multiple times.
.. NOTE::
Dracut applies ifname option (which might involve renaming the device with
given MAC) in initramfs only if the device is activated in initramfs stage
(based on ip= option). If it is not the case, installer still binds the
current device name to the MAC by adding HWADDR setting to the ifcfg file of
the device.
.. inst.dhcpclass:
inst.dhcpclass
@ -303,6 +316,21 @@ inst.lang
Set the language to be used during installation. The language specified must
be valid for the ``lang`` kickstart command.
.. inst.singlelang:
inst.singlelang
^^^^^^^^^^^^^^^
Install in single language mode - no interactive options for installation language
and language support configuration will be available.
If a language has been specified via the `inst.lang`_ boot option
or the `lang` kickstart command it will be used.
If no language is specified Anaconda will default to en_US.UTF-8.
.. NOTE::
Atomic installations always run in single language mode.
.. inst.geoloc:
inst.geoloc
@ -449,10 +477,10 @@ Locations may be specified using any of the formats allowed for ``inst.repo``.
For any format the ``<path>`` component defaults to ``/updates.img`` if it is
omitted.
.. nokill:
.. inst.nokill:
nokill
^^^^^^
inst.nokill
^^^^^^^^^^^
A debugging option that prevents anaconda from and rebooting when a fatal error
occurs or at the end of the installation process.
@ -582,6 +610,36 @@ Also note that while SELinux is running in the installation environment by
default, it is running in permissive mode so disabling it there does not make
much sense.
.. inst.nosave
inst.nosave
^^^^^^^^^^^
Controls what installation results should not be saved to the installed system,
valid values are: "input_ks", "output_ks", "all_ks", "logs" and "all".
``input_ks``
Disables saving of the input kickstart (if any).
``output_ks``
Disables saving of the output kickstart generated by Anaconda.
``all_ks``
Disables saving of both input and output kickstarts.
``logs``
Disables saving of all installation logs.
``all``
Disables saving of all kickstarts and all logs.
Multiple values can be combined as a comma separated list, for example: ``input_ks,logs``
.. NOTE::
The nosave option is meant for excluding files from the installed system that *can't*
be removed by a kickstart %post script, such as logs and input/output kickstarts.
Third-party options
^^^^^^^^^^^^^^^^^^^

@ -11,9 +11,6 @@
# All configuration values have a default; values that are commented out
# serve to show the default.
# Ignore any interruptible calls
# pylint: disable=interruptible-system-call
import sys, os
# If extensions (or modules to document with autodoc) are in another directory,
@ -21,6 +18,13 @@ import sys, os
# documentation root, use os.path.abspath to make it absolute, like shown here.
sys.path.insert(0, os.path.abspath('..'))
# configuration required to import test modules
for path in ["../pyanaconda/isys/.libs", "../pyanaconda", "../tests", "../tests/lib", "../dracut", "../widgets"]:
sys.path.append(os.path.abspath(path))
if not 'ANACONDA_INSTALL_CLASSES' in os.environ:
# pylint: disable=environment-modify
os.environ['ANACONDA_INSTALL_CLASSES'] = os.path.abspath('../pyanaconda/installclasses')
# -- General configuration -----------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.

@ -1,91 +0,0 @@
gettext, i18n, and the po/ subdirectory
26-Nov-2013
David Cantrell <dcantrell@redhat.com>
David Shea <dshea@redhat.com>
---------------------------------------
I have attempted to clean up our po/ subdirectory and bring it in to
conformance with GNU gettext tools as well as hook it in to GNU autoconf and
GNU automake. The gettext software has templates set up for this already,
so I'm just using those.
From time to time, we may have to update our gettext template files and or
expand or reduce the information in the files. How do you know what files
do what? Here's an explanation:
ABOUT-NLS
config.rpath
m4/gettext.m4
m4/iconv.m4
m4/nls.m4
m4/po.m4
m4/...
po/Makefile.in.in
po/Makevars.template
po/Rules-quot
po/boldquot.sed
po/en@boldquot.header
po/en@quot.header
po/insert-header.sin
po/quot.sed
po/remove-potcdate.sin
These files are copied in when 'autopoint' is run on the source
project, which happens as part of autogen.sh. In general, we should never
need to touch these files.
The autopoint tool depends on two macros in configure.ac: AM_GNU_GETTEXT,
and AM_GNU_GETTEXT_VERSION([<version>]). From time to time we may need to
update the set of gettext files that we use. To do so, update the gettext
version number in AM_GNU_GETTEXT_VERSION and run autogen.sh. Be sure to
also update the required gettext version in the spec file.
po/Makevars
Should be updated when we update gettext files from autopoint with a new
gettext version. A file called po/Makevars.template will appear and we
can move over our values to the new file and commit it. We do not need to
change this file on a regular basis.
po/POTFILES.in
This file contains a listing of all source files in the project that
have translatable strings.
Some files can't be handled by gettext directly, such as the GNOME desktop
files and anything without a clear filename extension. For these types of
files, add a rule to po/Rules-extract to create a file that gettext can
handle, and add the name of the generated file to po/POTFILES.in.
po/LINGUAS
Space-delimited list of languages available. If a new language is
added, it should be added to this file.
po/Rules-extract
Extra Makefile rules to process files that gettext can't handle on its
own.
Currently there are two types of files handled in Rules-extract: files in
a language that gettext doesn't know, and files in a language that gettext
can't figure out from the filename. For the first type of file (.desktop
files, consolehelper files), we use intltool-extract to create a C-style
header file containing the translatable strings, and for the second we
manually run xgettext, forcing a --language setting, and generate an
intermediate .po file.
In both cases, the name of the generated file is what goes in
po/POTFILES.in.
po/anaconda.pot
This is the template file built by xgettext containing all of the
translatable strings. The file is updated and committed to git as part of
building a release.
po/*.po
Actual translated strings, as maintained by the translation team(s). These
files are not stored in git. The po-pull target will pull the latest
translations from Transifex.

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

@ -0,0 +1,11 @@
<map id="inheritance0518f0e46c" name="inheritance0518f0e46c">
<area shape="rect" id="node1" href="pyanaconda.ui.tui.simpleline.html#pyanaconda.ui.tui.simpleline.base.UIScreen" title="Base class representing one TUI Screen. Shares some API with anaconda&#39;s GUI" alt="" coords="5,5,168,33"/>
<area shape="rect" id="node7" href="pyanaconda.ui.tui.html#pyanaconda.ui.tui.tuiobject.TUIObject" title="Base class for Anaconda specific TUI screens. Implements the" alt="" coords="101,81,246,109"/>
<area shape="rect" id="node2" href="pyanaconda.ui.tui.simpleline.html#pyanaconda.ui.tui.simpleline.base.Widget" title="simpleline.base.Widget" alt="" coords="271,81,420,109"/>
<area shape="rect" id="node5" href="#pyanaconda.ui.tui.spokes.TUISpoke" title="Base TUI Spoke class implementing the pyanaconda.ui.common.Spoke API." alt="" coords="273,157,410,185"/>
<area shape="rect" id="node3" href="#pyanaconda.ui.tui.spokes.shell_spoke.ShellSpoke" title=".. inheritance&#45;diagram:: ShellSpoke" alt="" coords="329,309,527,337"/>
<area shape="rect" id="node4" href="#pyanaconda.ui.tui.spokes.NormalTUISpoke" title=".. inheritance&#45;diagram:: NormalTUISpoke" alt="" coords="339,233,517,261"/>
<area shape="rect" id="node6" href="pyanaconda.ui.html#pyanaconda.ui.common.NormalSpoke" title="A NormalSpoke is a Spoke subclass that is displayed when the user" alt="" coords="434,157,595,185"/>
<area shape="rect" id="node8" href="pyanaconda.ui.html#pyanaconda.ui.common.Spoke" title="A Spoke is a single configuration screen. &#160;There are several different" alt="" coords="451,81,570,109"/>
<area shape="rect" id="node9" href="pyanaconda.ui.html#pyanaconda.ui.common.UIObject" title="This is the base class from which all other UI classes are derived. &#160;It" alt="" coords="193,5,327,33"/>
</map>

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

@ -0,0 +1,8 @@
<map id="inheritancea99f168d23" name="inheritancea99f168d23">
<area shape="rect" id="node1" href="#pyanaconda.ui.gui.spokes.NormalSpoke" title=".. inheritance&#45;diagram:: NormalSpoke" alt="" coords="73,157,233,185"/>
<area shape="rect" id="node4" href="#pyanaconda.ui.gui.spokes.keyboard.KeyboardSpoke" title=".. inheritance&#45;diagram:: KeyboardSpoke" alt="" coords="48,233,257,261"/>
<area shape="rect" id="node2" title="This is the base class from which all other GUI classes are derived. &#160;It" alt="" coords="17,81,128,109"/>
<area shape="rect" id="node3" href="pyanaconda.ui.html#pyanaconda.ui.common.NormalSpoke" title="A NormalSpoke is a Spoke subclass that is displayed when the user" alt="" coords="152,81,313,109"/>
<area shape="rect" id="node5" href="pyanaconda.ui.html#pyanaconda.ui.common.Spoke" title="A Spoke is a single configuration screen. &#160;There are several different" alt="" coords="173,5,292,33"/>
<area shape="rect" id="node6" href="pyanaconda.ui.html#pyanaconda.ui.common.UIObject" title="This is the base class from which all other UI classes are derived. &#160;It" alt="" coords="5,5,140,33"/>
</map>

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

@ -0,0 +1,13 @@
<map id="inheritance4b26f822c5" name="inheritance4b26f822c5">
<area shape="rect" id="node1" href="pyanaconda.ui.tui.simpleline.html#pyanaconda.ui.tui.simpleline.base.UIScreen" title="Base class representing one TUI Screen. Shares some API with anaconda&#39;s GUI" alt="" coords="5,5,168,33"/>
<area shape="rect" id="node9" href="pyanaconda.ui.tui.html#pyanaconda.ui.tui.tuiobject.TUIObject" title="Base class for Anaconda specific TUI screens. Implements the" alt="" coords="101,81,246,109"/>
<area shape="rect" id="node2" href="pyanaconda.ui.tui.simpleline.html#pyanaconda.ui.tui.simpleline.base.Widget" title="simpleline.base.Widget" alt="" coords="271,81,420,109"/>
<area shape="rect" id="node7" href="#pyanaconda.ui.tui.spokes.TUISpoke" title="Base TUI Spoke class implementing the pyanaconda.ui.common.Spoke API." alt="" coords="273,157,410,185"/>
<area shape="rect" id="node3" href="#pyanaconda.ui.tui.spokes.source.SourceSpoke" title="Spoke used to customize the install source repo." alt="" coords="439,385,620,413"/>
<area shape="rect" id="node4" href="#pyanaconda.ui.tui.spokes.EditTUISpoke" title="Spoke with declarative semantics, it contains" alt="" coords="348,309,508,337"/>
<area shape="rect" id="node5" href="pyanaconda.ui.html#pyanaconda.ui.helpers.SourceSwitchHandler" title="A class that can be used as a mixin handling" alt="" coords="532,309,732,337"/>
<area shape="rect" id="node6" href="#pyanaconda.ui.tui.spokes.NormalTUISpoke" title=".. inheritance&#45;diagram:: NormalTUISpoke" alt="" coords="339,233,517,261"/>
<area shape="rect" id="node8" href="pyanaconda.ui.html#pyanaconda.ui.common.NormalSpoke" title="A NormalSpoke is a Spoke subclass that is displayed when the user" alt="" coords="434,157,595,185"/>
<area shape="rect" id="node10" href="pyanaconda.ui.html#pyanaconda.ui.common.Spoke" title="A Spoke is a single configuration screen. &#160;There are several different" alt="" coords="451,81,570,109"/>
<area shape="rect" id="node11" href="pyanaconda.ui.html#pyanaconda.ui.common.UIObject" title="This is the base class from which all other UI classes are derived. &#160;It" alt="" coords="193,5,327,33"/>
</map>

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

@ -0,0 +1,11 @@
<map id="inheritance719cbf80e2" name="inheritance719cbf80e2">
<area shape="rect" id="node1" href="pyanaconda.ui.tui.simpleline.html#pyanaconda.ui.tui.simpleline.base.UIScreen" title="Base class representing one TUI Screen. Shares some API with anaconda&#39;s GUI" alt="" coords="5,5,168,33"/>
<area shape="rect" id="node7" href="pyanaconda.ui.tui.html#pyanaconda.ui.tui.tuiobject.TUIObject" title="Base class for Anaconda specific TUI screens. Implements the" alt="" coords="101,81,246,109"/>
<area shape="rect" id="node2" href="pyanaconda.ui.tui.simpleline.html#pyanaconda.ui.tui.simpleline.base.Widget" title="simpleline.base.Widget" alt="" coords="271,81,420,109"/>
<area shape="rect" id="node5" href="#pyanaconda.ui.tui.spokes.TUISpoke" title="Base TUI Spoke class implementing the pyanaconda.ui.common.Spoke API." alt="" coords="273,157,410,185"/>
<area shape="rect" id="node3" href="#pyanaconda.ui.tui.spokes.storage.StorageSpoke" title="Storage spoke where users proceed to customize storage features such" alt="" coords="333,309,523,337"/>
<area shape="rect" id="node4" href="#pyanaconda.ui.tui.spokes.NormalTUISpoke" title=".. inheritance&#45;diagram:: NormalTUISpoke" alt="" coords="339,233,517,261"/>
<area shape="rect" id="node6" href="pyanaconda.ui.html#pyanaconda.ui.common.NormalSpoke" title="A NormalSpoke is a Spoke subclass that is displayed when the user" alt="" coords="434,157,595,185"/>
<area shape="rect" id="node8" href="pyanaconda.ui.html#pyanaconda.ui.common.Spoke" title="A Spoke is a single configuration screen. &#160;There are several different" alt="" coords="451,81,570,109"/>
<area shape="rect" id="node9" href="pyanaconda.ui.html#pyanaconda.ui.common.UIObject" title="This is the base class from which all other UI classes are derived. &#160;It" alt="" coords="193,5,327,33"/>
</map>

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

@ -0,0 +1,5 @@
<map id="inheritance4e37dafe94" name="inheritance4e37dafe94">
<area shape="rect" id="node1" href="#pyanaconda.ui.gui.spokes.advstorage.zfcp.ZFCPDialog" title="Gtk dialog which allows users to manually add zFCP devices without" alt="" coords="5,157,188,185"/>
<area shape="rect" id="node2" title="This is the base class from which all other GUI classes are derived. &#160;It" alt="" coords="41,81,152,109"/>
<area shape="rect" id="node3" href="pyanaconda.ui.html#pyanaconda.ui.common.UIObject" title="This is the base class from which all other UI classes are derived. &#160;It" alt="" coords="29,5,164,33"/>
</map>

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

@ -0,0 +1,12 @@
<map id="inheritanceb4619035ea" name="inheritanceb4619035ea">
<area shape="rect" id="node1" href="pyanaconda.ui.gui.html#pyanaconda.ui.gui.helpers.GUIInputCheckHandler" title="Provide InputCheckHandler functionality for Gtk input screens." alt="" coords="503,81,720,109"/>
<area shape="rect" id="node3" href="pyanaconda.ui.gui.html#pyanaconda.ui.gui.helpers.GUISpokeInputCheckHandler" title="Provide InputCheckHandler functionality for graphical spokes." alt="" coords="484,157,739,185"/>
<area shape="rect" id="node2" href="pyanaconda.ui.html#pyanaconda.ui.helpers.InputCheckHandler" title="Provide a framework for adding input validation checks to a screen." alt="" coords="518,5,705,33"/>
<area shape="rect" id="node7" href="#pyanaconda.ui.gui.spokes.password.PasswordSpoke" title=".. inheritance&#45;diagram:: PasswordSpoke" alt="" coords="251,233,465,261"/>
<area shape="rect" id="node4" href="#pyanaconda.ui.gui.spokes.NormalSpoke" title=".. inheritance&#45;diagram:: NormalSpoke" alt="" coords="73,157,233,185"/>
<area shape="rect" id="node5" title="This is the base class from which all other GUI classes are derived. &#160;It" alt="" coords="17,81,128,109"/>
<area shape="rect" id="node6" href="pyanaconda.ui.html#pyanaconda.ui.common.NormalSpoke" title="A NormalSpoke is a Spoke subclass that is displayed when the user" alt="" coords="152,81,313,109"/>
<area shape="rect" id="node8" href="pyanaconda.ui.html#pyanaconda.ui.common.FirstbootSpokeMixIn" title="This MixIn class marks Spokes as usable for Firstboot" alt="" coords="257,157,459,185"/>
<area shape="rect" id="node9" href="pyanaconda.ui.html#pyanaconda.ui.common.Spoke" title="A Spoke is a single configuration screen. &#160;There are several different" alt="" coords="173,5,292,33"/>
<area shape="rect" id="node10" href="pyanaconda.ui.html#pyanaconda.ui.common.UIObject" title="This is the base class from which all other UI classes are derived. &#160;It" alt="" coords="5,5,140,33"/>
</map>

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

@ -0,0 +1,7 @@
<map id="inheritance945d734cf8" name="inheritance945d734cf8">
<area shape="rect" id="node1" href="#pyanaconda.ui.gui.hubs.Hub" title="A Hub is an overview UI screen. &#160;A Hub consists of one or more grids of" alt="" coords="94,157,185,185"/>
<area shape="rect" id="node4" href="#pyanaconda.ui.gui.hubs.summary.SummaryHub" title=".. inheritance&#45;diagram:: SummaryHub" alt="" coords="47,233,231,261"/>
<area shape="rect" id="node2" title="This is the base class from which all other GUI classes are derived. &#160;It" alt="" coords="17,81,128,109"/>
<area shape="rect" id="node3" href="pyanaconda.ui.html#pyanaconda.ui.common.Hub" title="A Hub is an overview UI screen. &#160;A Hub consists of one or more grids of" alt="" coords="153,81,259,109"/>
<area shape="rect" id="node5" href="pyanaconda.ui.html#pyanaconda.ui.common.UIObject" title="This is the base class from which all other UI classes are derived. &#160;It" alt="" coords="5,5,140,33"/>
</map>

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

@ -0,0 +1,13 @@
<map id="inheritance4b26f822c5" name="inheritance4b26f822c5">
<area shape="rect" id="node1" href="pyanaconda.ui.tui.simpleline.html#pyanaconda.ui.tui.simpleline.base.UIScreen" title="Base class representing one TUI Screen. Shares some API with anaconda&#39;s GUI" alt="" coords="5,5,168,33"/>
<area shape="rect" id="node9" href="pyanaconda.ui.tui.html#pyanaconda.ui.tui.tuiobject.TUIObject" title="Base class for Anaconda specific TUI screens. Implements the" alt="" coords="101,81,246,109"/>
<area shape="rect" id="node2" href="pyanaconda.ui.tui.simpleline.html#pyanaconda.ui.tui.simpleline.base.Widget" title="simpleline.base.Widget" alt="" coords="271,81,420,109"/>
<area shape="rect" id="node7" href="#pyanaconda.ui.tui.spokes.TUISpoke" title="Base TUI Spoke class implementing the pyanaconda.ui.common.Spoke API." alt="" coords="273,157,410,185"/>
<area shape="rect" id="node3" href="#pyanaconda.ui.tui.spokes.source.SourceSpoke" title="Spoke used to customize the install source repo." alt="" coords="439,385,620,413"/>
<area shape="rect" id="node4" href="#pyanaconda.ui.tui.spokes.EditTUISpoke" title="Spoke with declarative semantics, it contains" alt="" coords="348,309,508,337"/>
<area shape="rect" id="node5" href="pyanaconda.ui.html#pyanaconda.ui.helpers.SourceSwitchHandler" title="A class that can be used as a mixin handling" alt="" coords="532,309,732,337"/>
<area shape="rect" id="node6" href="#pyanaconda.ui.tui.spokes.NormalTUISpoke" title=".. inheritance&#45;diagram:: NormalTUISpoke" alt="" coords="339,233,517,261"/>
<area shape="rect" id="node8" href="pyanaconda.ui.html#pyanaconda.ui.common.NormalSpoke" title="A NormalSpoke is a Spoke subclass that is displayed when the user" alt="" coords="434,157,595,185"/>
<area shape="rect" id="node10" href="pyanaconda.ui.html#pyanaconda.ui.common.Spoke" title="A Spoke is a single configuration screen. &#160;There are several different" alt="" coords="451,81,570,109"/>
<area shape="rect" id="node11" href="pyanaconda.ui.html#pyanaconda.ui.common.UIObject" title="This is the base class from which all other UI classes are derived. &#160;It" alt="" coords="193,5,327,33"/>
</map>

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

@ -0,0 +1,7 @@
<map id="inheritance945d734cf8" name="inheritance945d734cf8">
<area shape="rect" id="node1" href="#pyanaconda.ui.gui.hubs.Hub" title="A Hub is an overview UI screen. &#160;A Hub consists of one or more grids of" alt="" coords="94,157,185,185"/>
<area shape="rect" id="node4" href="#pyanaconda.ui.gui.hubs.summary.SummaryHub" title=".. inheritance&#45;diagram:: SummaryHub" alt="" coords="47,233,231,261"/>
<area shape="rect" id="node2" title="This is the base class from which all other GUI classes are derived. &#160;It" alt="" coords="17,81,128,109"/>
<area shape="rect" id="node3" href="pyanaconda.ui.html#pyanaconda.ui.common.Hub" title="A Hub is an overview UI screen. &#160;A Hub consists of one or more grids of" alt="" coords="153,81,259,109"/>
<area shape="rect" id="node5" href="pyanaconda.ui.html#pyanaconda.ui.common.UIObject" title="This is the base class from which all other UI classes are derived. &#160;It" alt="" coords="5,5,140,33"/>
</map>

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

@ -0,0 +1,12 @@
<map id="inheritance55c7130382" name="inheritance55c7130382">
<area shape="rect" id="node1" href="pyanaconda.ui.gui.html#pyanaconda.ui.gui.helpers.GUIInputCheckHandler" title="Provide InputCheckHandler functionality for Gtk input screens." alt="" coords="503,81,720,109"/>
<area shape="rect" id="node3" href="pyanaconda.ui.gui.html#pyanaconda.ui.gui.helpers.GUISpokeInputCheckHandler" title="Provide InputCheckHandler functionality for graphical spokes." alt="" coords="484,157,739,185"/>
<area shape="rect" id="node2" href="pyanaconda.ui.html#pyanaconda.ui.helpers.InputCheckHandler" title="Provide a framework for adding input validation checks to a screen." alt="" coords="518,5,705,33"/>
<area shape="rect" id="node7" href="#pyanaconda.ui.gui.spokes.user.UserSpoke" title=".. inheritance&#45;diagram:: UserSpoke" alt="" coords="281,233,435,261"/>
<area shape="rect" id="node4" href="#pyanaconda.ui.gui.spokes.NormalSpoke" title=".. inheritance&#45;diagram:: NormalSpoke" alt="" coords="73,157,233,185"/>
<area shape="rect" id="node5" title="This is the base class from which all other GUI classes are derived. &#160;It" alt="" coords="17,81,128,109"/>
<area shape="rect" id="node6" href="pyanaconda.ui.html#pyanaconda.ui.common.NormalSpoke" title="A NormalSpoke is a Spoke subclass that is displayed when the user" alt="" coords="152,81,313,109"/>
<area shape="rect" id="node8" href="pyanaconda.ui.html#pyanaconda.ui.common.FirstbootSpokeMixIn" title="This MixIn class marks Spokes as usable for Firstboot" alt="" coords="257,157,459,185"/>
<area shape="rect" id="node9" href="pyanaconda.ui.html#pyanaconda.ui.common.Spoke" title="A Spoke is a single configuration screen. &#160;There are several different" alt="" coords="173,5,292,33"/>
<area shape="rect" id="node10" href="pyanaconda.ui.html#pyanaconda.ui.common.UIObject" title="This is the base class from which all other UI classes are derived. &#160;It" alt="" coords="5,5,140,33"/>
</map>

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

@ -0,0 +1,11 @@
<map id="inheritancec265f1ca2e" name="inheritancec265f1ca2e">
<area shape="rect" id="node1" href="pyanaconda.ui.tui.simpleline.html#pyanaconda.ui.tui.simpleline.base.UIScreen" title="Base class representing one TUI Screen. Shares some API with anaconda&#39;s GUI" alt="" coords="5,5,168,33"/>
<area shape="rect" id="node7" href="pyanaconda.ui.tui.html#pyanaconda.ui.tui.tuiobject.TUIObject" title="Base class for Anaconda specific TUI screens. Implements the" alt="" coords="101,81,246,109"/>
<area shape="rect" id="node2" href="pyanaconda.ui.tui.simpleline.html#pyanaconda.ui.tui.simpleline.base.Widget" title="simpleline.base.Widget" alt="" coords="271,81,420,109"/>
<area shape="rect" id="node5" href="#pyanaconda.ui.tui.spokes.TUISpoke" title="Base TUI Spoke class implementing the pyanaconda.ui.common.Spoke API." alt="" coords="270,157,407,185"/>
<area shape="rect" id="node3" href="#pyanaconda.ui.tui.spokes.warnings_spoke.WarningsSpoke" title=".. inheritance&#45;diagram:: WarningsSpoke" alt="" coords="305,309,556,337"/>
<area shape="rect" id="node4" title=".. inheritance&#45;diagram:: StandaloneTUISpoke" alt="" coords="329,233,532,261"/>
<area shape="rect" id="node6" href="pyanaconda.ui.html#pyanaconda.ui.common.StandaloneSpoke" title="A StandaloneSpoke is a Spoke subclass that is displayed apart from any" alt="" coords="432,157,616,185"/>
<area shape="rect" id="node8" href="pyanaconda.ui.html#pyanaconda.ui.common.Spoke" title="A Spoke is a single configuration screen. &#160;There are several different" alt="" coords="458,81,577,109"/>
<area shape="rect" id="node9" href="pyanaconda.ui.html#pyanaconda.ui.common.UIObject" title="This is the base class from which all other UI classes are derived. &#160;It" alt="" coords="193,5,327,33"/>
</map>

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

@ -0,0 +1,11 @@
<map id="inheritance742ec8b57e" name="inheritance742ec8b57e">
<area shape="rect" id="node1" href="pyanaconda.ui.tui.simpleline.html#pyanaconda.ui.tui.simpleline.base.UIScreen" title="Base class representing one TUI Screen. Shares some API with anaconda&#39;s GUI" alt="" coords="5,5,168,33"/>
<area shape="rect" id="node7" href="pyanaconda.ui.tui.html#pyanaconda.ui.tui.tuiobject.TUIObject" title="Base class for Anaconda specific TUI screens. Implements the" alt="" coords="101,81,246,109"/>
<area shape="rect" id="node2" href="pyanaconda.ui.tui.simpleline.html#pyanaconda.ui.tui.simpleline.base.Widget" title="simpleline.base.Widget" alt="" coords="271,81,420,109"/>
<area shape="rect" id="node5" href="#pyanaconda.ui.tui.spokes.TUISpoke" title="Base TUI Spoke class implementing the pyanaconda.ui.common.Spoke API." alt="" coords="273,157,410,185"/>
<area shape="rect" id="node3" href="#pyanaconda.ui.tui.spokes.askvnc.VNCPassSpoke" title=".. inheritance&#45;diagram:: VNCPassSpoke" alt="" coords="327,309,529,337"/>
<area shape="rect" id="node4" href="#pyanaconda.ui.tui.spokes.NormalTUISpoke" title=".. inheritance&#45;diagram:: NormalTUISpoke" alt="" coords="339,233,517,261"/>
<area shape="rect" id="node6" href="pyanaconda.ui.html#pyanaconda.ui.common.NormalSpoke" title="A NormalSpoke is a Spoke subclass that is displayed when the user" alt="" coords="434,157,595,185"/>
<area shape="rect" id="node8" href="pyanaconda.ui.html#pyanaconda.ui.common.Spoke" title="A Spoke is a single configuration screen. &#160;There are several different" alt="" coords="451,81,570,109"/>
<area shape="rect" id="node9" href="pyanaconda.ui.html#pyanaconda.ui.common.UIObject" title="This is the base class from which all other UI classes are derived. &#160;It" alt="" coords="193,5,327,33"/>
</map>

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

@ -0,0 +1,13 @@
<map id="inheritance55c7130382" name="inheritance55c7130382">
<area shape="rect" id="node1" href="pyanaconda.ui.tui.simpleline.html#pyanaconda.ui.tui.simpleline.base.UIScreen" title="Base class representing one TUI Screen. Shares some API with anaconda&#39;s GUI" alt="" coords="5,5,168,33"/>
<area shape="rect" id="node9" href="pyanaconda.ui.tui.html#pyanaconda.ui.tui.tuiobject.TUIObject" title="Base class for Anaconda specific TUI screens. Implements the" alt="" coords="101,81,246,109"/>
<area shape="rect" id="node2" href="pyanaconda.ui.tui.simpleline.html#pyanaconda.ui.tui.simpleline.base.Widget" title="simpleline.base.Widget" alt="" coords="271,81,420,109"/>
<area shape="rect" id="node7" href="#pyanaconda.ui.tui.spokes.TUISpoke" title="Base TUI Spoke class implementing the pyanaconda.ui.common.Spoke API." alt="" coords="273,157,410,185"/>
<area shape="rect" id="node3" href="#pyanaconda.ui.tui.spokes.user.UserSpoke" title=".. inheritance&#45;diagram:: UserSpoke" alt="" coords="453,385,608,413"/>
<area shape="rect" id="node4" href="pyanaconda.ui.html#pyanaconda.ui.common.FirstbootSpokeMixIn" title="This MixIn class marks Spokes as usable for Firstboot" alt="" coords="532,309,735,337"/>
<area shape="rect" id="node5" href="#pyanaconda.ui.tui.spokes.EditTUISpoke" title="Spoke with declarative semantics, it contains" alt="" coords="348,309,508,337"/>
<area shape="rect" id="node6" href="#pyanaconda.ui.tui.spokes.NormalTUISpoke" title=".. inheritance&#45;diagram:: NormalTUISpoke" alt="" coords="339,233,517,261"/>
<area shape="rect" id="node8" href="pyanaconda.ui.html#pyanaconda.ui.common.NormalSpoke" title="A NormalSpoke is a Spoke subclass that is displayed when the user" alt="" coords="434,157,595,185"/>
<area shape="rect" id="node10" href="pyanaconda.ui.html#pyanaconda.ui.common.Spoke" title="A Spoke is a single configuration screen. &#160;There are several different" alt="" coords="451,81,570,109"/>
<area shape="rect" id="node11" href="pyanaconda.ui.html#pyanaconda.ui.common.UIObject" title="This is the base class from which all other UI classes are derived. &#160;It" alt="" coords="193,5,327,33"/>
</map>

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

@ -0,0 +1,11 @@
<map id="inheritance9fd6cc9af9" name="inheritance9fd6cc9af9">
<area shape="rect" id="node1" href="pyanaconda.ui.tui.simpleline.html#pyanaconda.ui.tui.simpleline.base.UIScreen" title="Base class representing one TUI Screen. Shares some API with anaconda&#39;s GUI" alt="" coords="5,5,168,33"/>
<area shape="rect" id="node7" href="pyanaconda.ui.tui.html#pyanaconda.ui.tui.tuiobject.TUIObject" title="Base class for Anaconda specific TUI screens. Implements the" alt="" coords="101,81,246,109"/>
<area shape="rect" id="node2" href="pyanaconda.ui.tui.simpleline.html#pyanaconda.ui.tui.simpleline.base.Widget" title="simpleline.base.Widget" alt="" coords="271,81,420,109"/>
<area shape="rect" id="node5" href="#pyanaconda.ui.tui.spokes.TUISpoke" title="Base TUI Spoke class implementing the pyanaconda.ui.common.Spoke API." alt="" coords="270,157,407,185"/>
<area shape="rect" id="node3" href="#pyanaconda.ui.tui.spokes.progress.ProgressSpoke" title=".. inheritance&#45;diagram:: ProgressSpoke" alt="" coords="329,309,532,337"/>
<area shape="rect" id="node4" title=".. inheritance&#45;diagram:: StandaloneTUISpoke" alt="" coords="329,233,532,261"/>
<area shape="rect" id="node6" href="pyanaconda.ui.html#pyanaconda.ui.common.StandaloneSpoke" title="A StandaloneSpoke is a Spoke subclass that is displayed apart from any" alt="" coords="432,157,616,185"/>
<area shape="rect" id="node8" href="pyanaconda.ui.html#pyanaconda.ui.common.Spoke" title="A Spoke is a single configuration screen. &#160;There are several different" alt="" coords="458,81,577,109"/>
<area shape="rect" id="node9" href="pyanaconda.ui.html#pyanaconda.ui.common.UIObject" title="This is the base class from which all other UI classes are derived. &#160;It" alt="" coords="193,5,327,33"/>
</map>

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

@ -0,0 +1,9 @@
<map id="inheritance08fe414db7" name="inheritance08fe414db7">
<area shape="rect" id="node1" href="#pyanaconda.ui.gui.spokes.NormalSpoke" title=".. inheritance&#45;diagram:: NormalSpoke" alt="" coords="290,157,450,185"/>
<area shape="rect" id="node5" href="#pyanaconda.ui.gui.spokes.langsupport.LangsupportSpoke" title=".. inheritance&#45;diagram:: LangsupportSpoke" alt="" coords="133,233,372,261"/>
<area shape="rect" id="node2" title="This is the base class from which all other GUI classes are derived. &#160;It" alt="" coords="235,81,345,109"/>
<area shape="rect" id="node3" href="pyanaconda.ui.html#pyanaconda.ui.common.NormalSpoke" title="A NormalSpoke is a Spoke subclass that is displayed when the user" alt="" coords="369,81,531,109"/>
<area shape="rect" id="node4" href="pyanaconda.ui.gui.spokes.lib.html#pyanaconda.ui.gui.spokes.lib.lang_locale_handler.LangLocaleHandler" title="Class that could be used as a mixin for screens handling languages or" alt="" coords="5,157,265,185"/>
<area shape="rect" id="node6" href="pyanaconda.ui.html#pyanaconda.ui.common.Spoke" title="A Spoke is a single configuration screen. &#160;There are several different" alt="" coords="391,5,509,33"/>
<area shape="rect" id="node7" href="pyanaconda.ui.html#pyanaconda.ui.common.UIObject" title="This is the base class from which all other UI classes are derived. &#160;It" alt="" coords="223,5,357,33"/>
</map>

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

@ -0,0 +1,11 @@
<map id="inheritance99136694aa" name="inheritance99136694aa">
<area shape="rect" id="node1" href="pyanaconda.ui.tui.simpleline.html#pyanaconda.ui.tui.simpleline.base.UIScreen" title="Base class representing one TUI Screen. Shares some API with anaconda&#39;s GUI" alt="" coords="5,5,168,33"/>
<area shape="rect" id="node7" href="pyanaconda.ui.tui.html#pyanaconda.ui.tui.tuiobject.TUIObject" title="Base class for Anaconda specific TUI screens. Implements the" alt="" coords="101,81,246,109"/>
<area shape="rect" id="node2" href="pyanaconda.ui.tui.simpleline.html#pyanaconda.ui.tui.simpleline.base.Widget" title="simpleline.base.Widget" alt="" coords="271,81,420,109"/>
<area shape="rect" id="node5" href="#pyanaconda.ui.tui.spokes.TUISpoke" title="Base TUI Spoke class implementing the pyanaconda.ui.common.Spoke API." alt="" coords="273,157,410,185"/>
<area shape="rect" id="node3" href="#pyanaconda.ui.tui.spokes.software.SoftwareSpoke" title="Spoke used to read new value of text to represent source repo." alt="" coords="327,309,529,337"/>
<area shape="rect" id="node4" href="#pyanaconda.ui.tui.spokes.NormalTUISpoke" title=".. inheritance&#45;diagram:: NormalTUISpoke" alt="" coords="339,233,517,261"/>
<area shape="rect" id="node6" href="pyanaconda.ui.html#pyanaconda.ui.common.NormalSpoke" title="A NormalSpoke is a Spoke subclass that is displayed when the user" alt="" coords="434,157,595,185"/>
<area shape="rect" id="node8" href="pyanaconda.ui.html#pyanaconda.ui.common.Spoke" title="A Spoke is a single configuration screen. &#160;There are several different" alt="" coords="451,81,570,109"/>
<area shape="rect" id="node9" href="pyanaconda.ui.html#pyanaconda.ui.common.UIObject" title="This is the base class from which all other UI classes are derived. &#160;It" alt="" coords="193,5,327,33"/>
</map>

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

@ -0,0 +1,5 @@
<map id="inheritance4e37dafe94" name="inheritance4e37dafe94">
<area shape="rect" id="node1" href="#pyanaconda.ui.gui.spokes.advstorage.zfcp.ZFCPDialog" title="Gtk dialog which allows users to manually add zFCP devices without" alt="" coords="5,157,188,185"/>
<area shape="rect" id="node2" title="This is the base class from which all other GUI classes are derived. &#160;It" alt="" coords="41,81,152,109"/>
<area shape="rect" id="node3" href="pyanaconda.ui.html#pyanaconda.ui.common.UIObject" title="This is the base class from which all other UI classes are derived. &#160;It" alt="" coords="29,5,164,33"/>
</map>

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

@ -0,0 +1,13 @@
<map id="inheritanceb4619035ea" name="inheritanceb4619035ea">
<area shape="rect" id="node1" href="pyanaconda.ui.tui.simpleline.html#pyanaconda.ui.tui.simpleline.base.UIScreen" title="Base class representing one TUI Screen. Shares some API with anaconda&#39;s GUI" alt="" coords="5,5,168,33"/>
<area shape="rect" id="node9" href="pyanaconda.ui.tui.html#pyanaconda.ui.tui.tuiobject.TUIObject" title="Base class for Anaconda specific TUI screens. Implements the" alt="" coords="101,81,246,109"/>
<area shape="rect" id="node2" href="pyanaconda.ui.tui.simpleline.html#pyanaconda.ui.tui.simpleline.base.Widget" title="simpleline.base.Widget" alt="" coords="271,81,420,109"/>
<area shape="rect" id="node7" href="#pyanaconda.ui.tui.spokes.TUISpoke" title="Base TUI Spoke class implementing the pyanaconda.ui.common.Spoke API." alt="" coords="273,157,410,185"/>
<area shape="rect" id="node3" href="#pyanaconda.ui.tui.spokes.password.PasswordSpoke" title=".. inheritance&#45;diagram:: PasswordSpoke" alt="" coords="423,385,638,413"/>
<area shape="rect" id="node4" href="pyanaconda.ui.html#pyanaconda.ui.common.FirstbootSpokeMixIn" title="This MixIn class marks Spokes as usable for Firstboot" alt="" coords="532,309,735,337"/>
<area shape="rect" id="node5" href="#pyanaconda.ui.tui.spokes.EditTUIDialog" title="Spoke/dialog used to read new value of textual or password data" alt="" coords="348,309,508,337"/>
<area shape="rect" id="node6" href="#pyanaconda.ui.tui.spokes.NormalTUISpoke" title=".. inheritance&#45;diagram:: NormalTUISpoke" alt="" coords="339,233,517,261"/>
<area shape="rect" id="node8" href="pyanaconda.ui.html#pyanaconda.ui.common.NormalSpoke" title="A NormalSpoke is a Spoke subclass that is displayed when the user" alt="" coords="434,157,595,185"/>
<area shape="rect" id="node10" href="pyanaconda.ui.html#pyanaconda.ui.common.Spoke" title="A Spoke is a single configuration screen. &#160;There are several different" alt="" coords="451,81,570,109"/>
<area shape="rect" id="node11" href="pyanaconda.ui.html#pyanaconda.ui.common.UIObject" title="This is the base class from which all other UI classes are derived. &#160;It" alt="" coords="193,5,327,33"/>
</map>

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

@ -0,0 +1,9 @@
<map id="inheritance719cbf80e2" name="inheritance719cbf80e2">
<area shape="rect" id="node1" href="#pyanaconda.ui.gui.spokes.NormalSpoke" title=".. inheritance&#45;diagram:: NormalSpoke" alt="" coords="197,157,357,185"/>
<area shape="rect" id="node4" href="#pyanaconda.ui.gui.spokes.storage.StorageSpoke" title=".. inheritance&#45;diagram:: StorageSpoke" alt="" coords="88,233,277,261"/>
<area shape="rect" id="node2" title="This is the base class from which all other GUI classes are derived. &#160;It" alt="" coords="142,81,253,109"/>
<area shape="rect" id="node3" href="pyanaconda.ui.html#pyanaconda.ui.common.NormalSpoke" title="A NormalSpoke is a Spoke subclass that is displayed when the user" alt="" coords="277,81,438,109"/>
<area shape="rect" id="node5" href="pyanaconda.ui.html#pyanaconda.ui.helpers.StorageChecker" title="ui.helpers.StorageChecker" alt="" coords="5,157,173,185"/>
<area shape="rect" id="node6" href="pyanaconda.ui.html#pyanaconda.ui.common.Spoke" title="A Spoke is a single configuration screen. &#160;There are several different" alt="" coords="298,5,417,33"/>
<area shape="rect" id="node7" href="pyanaconda.ui.html#pyanaconda.ui.common.UIObject" title="This is the base class from which all other UI classes are derived. &#160;It" alt="" coords="130,5,265,33"/>
</map>

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

@ -0,0 +1,9 @@
<map id="inheritancec86ce9e3e6" name="inheritancec86ce9e3e6">
<area shape="rect" id="node1" href="#pyanaconda.ui.gui.spokes.StandaloneSpoke" title=".. inheritance&#45;diagram:: StandaloneSpoke" alt="" coords="289,157,472,185"/>
<area shape="rect" id="node5" href="#pyanaconda.ui.gui.spokes.welcome.WelcomeLanguageSpoke" title=".. inheritance&#45;diagram:: WelcomeLanguageSpoke" alt="" coords="126,233,390,261"/>
<area shape="rect" id="node2" title="This is the base class from which all other GUI classes are derived. &#160;It" alt="" coords="239,81,349,109"/>
<area shape="rect" id="node3" href="pyanaconda.ui.html#pyanaconda.ui.common.StandaloneSpoke" title="A StandaloneSpoke is a Spoke subclass that is displayed apart from any" alt="" coords="374,81,558,109"/>
<area shape="rect" id="node4" href="pyanaconda.ui.gui.spokes.lib.html#pyanaconda.ui.gui.spokes.lib.lang_locale_handler.LangLocaleHandler" title="Class that could be used as a mixin for screens handling languages or" alt="" coords="5,157,265,185"/>
<area shape="rect" id="node6" href="pyanaconda.ui.html#pyanaconda.ui.common.Spoke" title="A Spoke is a single configuration screen. &#160;There are several different" alt="" coords="407,5,525,33"/>
<area shape="rect" id="node7" href="pyanaconda.ui.html#pyanaconda.ui.common.UIObject" title="This is the base class from which all other UI classes are derived. &#160;It" alt="" coords="227,5,361,33"/>
</map>

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

@ -0,0 +1,13 @@
<map id="inheritance4b26f822c5" name="inheritance4b26f822c5">
<area shape="rect" id="node1" href="pyanaconda.ui.tui.simpleline.html#pyanaconda.ui.tui.simpleline.base.UIScreen" title="Base class representing one TUI Screen. Shares some API with anaconda&#39;s GUI" alt="" coords="5,5,168,33"/>
<area shape="rect" id="node9" href="pyanaconda.ui.tui.html#pyanaconda.ui.tui.tuiobject.TUIObject" title="Base class for Anaconda specific TUI screens. Implements the" alt="" coords="101,81,246,109"/>
<area shape="rect" id="node2" href="pyanaconda.ui.tui.simpleline.html#pyanaconda.ui.tui.simpleline.base.Widget" title="simpleline.base.Widget" alt="" coords="271,81,420,109"/>
<area shape="rect" id="node7" href="#pyanaconda.ui.tui.spokes.TUISpoke" title="Base TUI Spoke class implementing the pyanaconda.ui.common.Spoke API." alt="" coords="273,157,410,185"/>
<area shape="rect" id="node3" href="#pyanaconda.ui.tui.spokes.source.SourceSpoke" title="Spoke used to customize the install source repo." alt="" coords="439,385,620,413"/>
<area shape="rect" id="node4" href="#pyanaconda.ui.tui.spokes.EditTUISpoke" title="Spoke with declarative semantics, it contains" alt="" coords="348,309,508,337"/>
<area shape="rect" id="node5" href="pyanaconda.ui.html#pyanaconda.ui.helpers.SourceSwitchHandler" title="A class that can be used as a mixin handling" alt="" coords="532,309,732,337"/>
<area shape="rect" id="node6" href="#pyanaconda.ui.tui.spokes.NormalTUISpoke" title=".. inheritance&#45;diagram:: NormalTUISpoke" alt="" coords="339,233,517,261"/>
<area shape="rect" id="node8" href="pyanaconda.ui.html#pyanaconda.ui.common.NormalSpoke" title="A NormalSpoke is a Spoke subclass that is displayed when the user" alt="" coords="434,157,595,185"/>
<area shape="rect" id="node10" href="pyanaconda.ui.html#pyanaconda.ui.common.Spoke" title="A Spoke is a single configuration screen. &#160;There are several different" alt="" coords="451,81,570,109"/>
<area shape="rect" id="node11" href="pyanaconda.ui.html#pyanaconda.ui.common.UIObject" title="This is the base class from which all other UI classes are derived. &#160;It" alt="" coords="193,5,327,33"/>
</map>

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

@ -0,0 +1,8 @@
<map id="inheritance74f83ce4b5" name="inheritance74f83ce4b5">
<area shape="rect" id="node1" href="#pyanaconda.ui.gui.spokes.NormalSpoke" title=".. inheritance&#45;diagram:: NormalSpoke" alt="" coords="73,157,233,185"/>
<area shape="rect" id="node4" href="#pyanaconda.ui.gui.spokes.filter.FilterSpoke" title=".. inheritance&#45;diagram:: FilterSpoke" alt="" coords="75,233,230,261"/>
<area shape="rect" id="node2" title="This is the base class from which all other GUI classes are derived. &#160;It" alt="" coords="17,81,128,109"/>
<area shape="rect" id="node3" href="pyanaconda.ui.html#pyanaconda.ui.common.NormalSpoke" title="A NormalSpoke is a Spoke subclass that is displayed when the user" alt="" coords="152,81,313,109"/>
<area shape="rect" id="node5" href="pyanaconda.ui.html#pyanaconda.ui.common.Spoke" title="A Spoke is a single configuration screen. &#160;There are several different" alt="" coords="173,5,292,33"/>
<area shape="rect" id="node6" href="pyanaconda.ui.html#pyanaconda.ui.common.UIObject" title="This is the base class from which all other UI classes are derived. &#160;It" alt="" coords="5,5,140,33"/>
</map>

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

@ -0,0 +1,7 @@
<map id="inheritance945d734cf8" name="inheritance945d734cf8">
<area shape="rect" id="node1" href="#pyanaconda.ui.gui.hubs.Hub" title="A Hub is an overview UI screen. &#160;A Hub consists of one or more grids of" alt="" coords="94,157,185,185"/>
<area shape="rect" id="node4" href="#pyanaconda.ui.gui.hubs.summary.SummaryHub" title=".. inheritance&#45;diagram:: SummaryHub" alt="" coords="47,233,231,261"/>
<area shape="rect" id="node2" title="This is the base class from which all other GUI classes are derived. &#160;It" alt="" coords="17,81,128,109"/>
<area shape="rect" id="node3" href="pyanaconda.ui.html#pyanaconda.ui.common.Hub" title="A Hub is an overview UI screen. &#160;A Hub consists of one or more grids of" alt="" coords="153,81,259,109"/>
<area shape="rect" id="node5" href="pyanaconda.ui.html#pyanaconda.ui.common.UIObject" title="This is the base class from which all other UI classes are derived. &#160;It" alt="" coords="5,5,140,33"/>
</map>

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

@ -0,0 +1,9 @@
<map id="inheritance28436954cd" name="inheritance28436954cd">
<area shape="rect" id="node1" href="#pyanaconda.ui.gui.spokes.NormalSpoke" title=".. inheritance&#45;diagram:: NormalSpoke" alt="" coords="197,157,357,185"/>
<area shape="rect" id="node4" href="#pyanaconda.ui.gui.spokes.custom.CustomPartitioningSpoke" title=".. inheritance&#45;diagram:: CustomPartitioningSpoke" alt="" coords="55,233,310,261"/>
<area shape="rect" id="node2" title="This is the base class from which all other GUI classes are derived. &#160;It" alt="" coords="142,81,253,109"/>
<area shape="rect" id="node3" href="pyanaconda.ui.html#pyanaconda.ui.common.NormalSpoke" title="A NormalSpoke is a Spoke subclass that is displayed when the user" alt="" coords="277,81,438,109"/>
<area shape="rect" id="node5" href="pyanaconda.ui.html#pyanaconda.ui.helpers.StorageChecker" title="ui.helpers.StorageChecker" alt="" coords="5,157,173,185"/>
<area shape="rect" id="node6" href="pyanaconda.ui.html#pyanaconda.ui.common.Spoke" title="A Spoke is a single configuration screen. &#160;There are several different" alt="" coords="298,5,417,33"/>
<area shape="rect" id="node7" href="pyanaconda.ui.html#pyanaconda.ui.common.UIObject" title="This is the base class from which all other UI classes are derived. &#160;It" alt="" coords="130,5,265,33"/>
</map>

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

@ -0,0 +1,11 @@
<map id="inheritance81ab1c32bf" name="inheritance81ab1c32bf">
<area shape="rect" id="node1" href="pyanaconda.ui.tui.simpleline.html#pyanaconda.ui.tui.simpleline.base.UIScreen" title="Base class representing one TUI Screen. Shares some API with anaconda&#39;s GUI" alt="" coords="5,5,168,33"/>
<area shape="rect" id="node7" href="pyanaconda.ui.tui.html#pyanaconda.ui.tui.tuiobject.TUIObject" title="Base class for Anaconda specific TUI screens. Implements the" alt="" coords="101,81,246,109"/>
<area shape="rect" id="node2" href="pyanaconda.ui.tui.simpleline.html#pyanaconda.ui.tui.simpleline.base.Widget" title="simpleline.base.Widget" alt="" coords="271,81,420,109"/>
<area shape="rect" id="node5" href="#pyanaconda.ui.tui.spokes.TUISpoke" title="Base TUI Spoke class implementing the pyanaconda.ui.common.Spoke API." alt="" coords="273,157,410,185"/>
<area shape="rect" id="node3" href="#pyanaconda.ui.tui.spokes.askvnc.AskVNCSpoke" title=".. inheritance&#45;diagram:: AskVNCSpoke" alt="" coords="331,309,525,337"/>
<area shape="rect" id="node4" href="#pyanaconda.ui.tui.spokes.NormalTUISpoke" title=".. inheritance&#45;diagram:: NormalTUISpoke" alt="" coords="339,233,517,261"/>
<area shape="rect" id="node6" href="pyanaconda.ui.html#pyanaconda.ui.common.NormalSpoke" title="A NormalSpoke is a Spoke subclass that is displayed when the user" alt="" coords="434,157,595,185"/>
<area shape="rect" id="node8" href="pyanaconda.ui.html#pyanaconda.ui.common.Spoke" title="A Spoke is a single configuration screen. &#160;There are several different" alt="" coords="451,81,570,109"/>
<area shape="rect" id="node9" href="pyanaconda.ui.html#pyanaconda.ui.common.UIObject" title="This is the base class from which all other UI classes are derived. &#160;It" alt="" coords="193,5,327,33"/>
</map>

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

@ -0,0 +1,5 @@
<map id="inheritancee991b46c4f" name="inheritancee991b46c4f">
<area shape="rect" id="node1" href="#pyanaconda.ui.gui.spokes.advstorage.fcoe.FCoEDialog" title=".. inheritance&#45;diagram:: FCoEDialog" alt="" coords="5,157,188,185"/>
<area shape="rect" id="node2" title="This is the base class from which all other GUI classes are derived. &#160;It" alt="" coords="41,81,152,109"/>
<area shape="rect" id="node3" href="pyanaconda.ui.html#pyanaconda.ui.common.UIObject" title="This is the base class from which all other UI classes are derived. &#160;It" alt="" coords="29,5,164,33"/>
</map>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save