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 mkdir -p work
pushd work && pungi --name=Qubes $(PUNGI_OPTS) -c $(INSTALLER_KICKSTART) && popd pushd work && pungi --name=Qubes $(PUNGI_OPTS) -c $(INSTALLER_KICKSTART) && popd
# Move result files to known-named directories # 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/ mv work/$(ISO_VERSION)/x86_64/iso/*-DVD*.iso build/ISO/qubes-x86_64/iso/
rm -rf build/work/$(ISO_VERSION) rm -rf build/work
mv work/$(ISO_VERSION)/x86_64/os build/work/$(ISO_VERSION) mv work build/work
chown --reference=Makefile -R build yum chown --reference=Makefile -R build yum
rm -rf work rm -rf work

@ -4,7 +4,6 @@ RPM_SPEC_FILES.dom0 := \
lorax-templates-qubes/lorax-templates-qubes.spec \ lorax-templates-qubes/lorax-templates-qubes.spec \
pungi/pungi.spec \ pungi/pungi.spec \
anaconda/anaconda.spec \ anaconda/anaconda.spec \
initial-setup-launcher/initial-setup-launcher.spec \
qubes-anaconda-addon/qubes-anaconda-addon.spec \ qubes-anaconda-addon/qubes-anaconda-addon.spec \
qubes-release/qubes-release.spec \ qubes-release/qubes-release.spec \
qubes-release/qubes-dom0-dist-upgrade.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 # 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/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author: David Cantrell <dcantrell@redhat.com>
ACLOCAL_AMFLAGS = -I m4 ACLOCAL_AMFLAGS = -I m4
SUBDIRS = data docs dracut po pyanaconda scripts tests widgets utils 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 # Include the xgettext wrapper so pot-update can be run from the source distribution
EXTRA_DIST += $(srcdir)/anaconda.po # This is needed for make distcheck.
$(srcdir)/anaconda.po: $(srcdir)/anaconda EXTRA_DIST += $(srcdir)/translation-canary/xgettext_werror.sh
@$(MAKE) -C $(top_builddir)/po $(abs_top_srcdir)/$(subdir)/$$(basename $@)
MAINTAINERCLEANFILES = Makefile.in config.guess config.h.in config.sub \ MAINTAINERCLEANFILES = Makefile.in config.guess config.h.in config.sub \
depcomp install-sh ltmain.sh missing ABOUT-NLS \ depcomp install-sh ltmain.sh missing ABOUT-NLS \
INSTALL aclocal.m4 configure *.pyc py-compile \ 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 test-driver
CLEANFILES = *~ CLEANFILES = *~
dist_noinst_DATA = $(PACKAGE_NAME).spec 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) ARCHIVE_TAG = $(PACKAGE_NAME)-$(PACKAGE_VERSION)-$(PACKAGE_RELEASE)
ZANATA_PULL_ARGS = --transdir $(srcdir)/po/ 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) 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: tag:
@git tag -s -a -m "Tag as $(ARCHIVE_TAG)" $(ARCHIVE_TAG) @git tag -s -a -m "Tag as $(ARCHIVE_TAG)" $(ARCHIVE_TAG)
@ -54,20 +73,16 @@ tag:
po-pull: po-pull:
rpm -q zanata-python-client &>/dev/null || ( echo "need to run: dnf install zanata-python-client"; exit 1 ) 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: # Try to fetch translations, but if that fails just keep going
for lingua in $$(grep -v '^#' $(srcdir)/po/LINGUAS) ; do \ po-fallback:
[ -f $(srcdir)/po/$$lingua.po ] || \ -$(MAKE) po-pull
msginit -i $(srcdir)/po/$(PACKAGE_NAME).pot -o $(srcdir)/po/$$lingua.po --no-translator || \
exit 1 ; \
done
scratch: po-empty scratch:
$(MAKE) ARCHIVE_TAG=HEAD dist $(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)" ; \ @opts="-S -n $(PACKAGE_NAME) -v $(PACKAGE_VERSION) -r $(PACKAGE_RELEASE) -b $(PACKAGE_BUGREPORT) --newrelease $(RC_RELEASE)" ; \
if [ ! -z "$(IGNORE)" ]; then \ if [ ! -z "$(IGNORE)" ]; then \
opts="$${opts} -i $(IGNORE)" ; \ opts="$${opts} -i $(IGNORE)" ; \
@ -82,7 +97,7 @@ scratch-bumpver: po-empty
$(MAKE) -C po $(PACKAGE_NAME).pot-update $(MAKE) -C po $(PACKAGE_NAME).pot-update
release: release:
$(MAKE) dist && $(MAKE) tag && git checkout -- $(srcdir)/po/$(PACKAGE_NAME).pot $(MAKE) dist && $(MAKE) tag
rc-release: scratch-bumpver scratch rc-release: scratch-bumpver scratch
mock -r $(MOCKCHROOT) --scrub all || exit 1 mock -r $(MOCKCHROOT) --scrub all || exit 1
@ -105,6 +120,7 @@ bumpver: po-pull
fi ; \ fi ; \
( cd $(srcdir) && scripts/makebumpver $${opts} ) || exit 1 ; \ ( cd $(srcdir) && scripts/makebumpver $${opts} ) || exit 1 ; \
$(MAKE) -C po $(PACKAGE_NAME).pot-update && \ $(MAKE) -C po $(PACKAGE_NAME).pot-update && \
rm $(srcdir)/po/{main,extra}.pot
zanata push $(ZANATA_PUSH_ARGS) zanata push $(ZANATA_PUSH_ARGS)
# Install all packages specified as BuildRequires in the Anaconda specfile # Install all packages specified as BuildRequires in the Anaconda specfile
@ -117,7 +133,8 @@ install-buildrequires:
if ! [[ $$(uname -m) =~ s390x? ]]; then \ if ! [[ $$(uname -m) =~ s390x? ]]; then \
pkglist=$$(echo "$$pkglist" | grep -v s390utils) ; \ pkglist=$$(echo "$$pkglist" | grep -v s390utils) ; \
fi ; \ 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 # Install all packages specified as Requires in the Anaconda specfile
# -> installs packages needed to run Anaconda and the Anaconda unit tests # -> installs packages needed to run Anaconda and the Anaconda unit tests
@ -127,6 +144,14 @@ install-requires:
: $${srcdir:=.} && \ : $${srcdir:=.} && \
dnf install $$(grep ^Requires: $${srcdir}/anaconda.spec.in | grep -v %{name} | cut -d ' ' -f 2 | grep -v ^anaconda) 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 # 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 # was tagged. Updates are copied to ./updates-img and then the image is
# created. By default, the updates subdirectory is removed after the # created. By default, the updates subdirectory is removed after the
@ -144,7 +169,6 @@ updates:
runglade: runglade:
ANACONDA_DATA=$(srcdir)/data \ ANACONDA_DATA=$(srcdir)/data \
ANACONDA_WIDGETS_OVERRIDES=$(srcdir)/widgets/python \ ANACONDA_WIDGETS_OVERRIDES=$(srcdir)/widgets/python \
ANACONDA_WIDGETS_DATA=$(srcdir)/widgets/data \
ANACONDA_INSTALL_CLASSES=$(srcdir)/pyanaconda/installclasses \ ANACONDA_INSTALL_CLASSES=$(srcdir)/pyanaconda/installclasses \
PYTHONPATH=$(srcdir):$(builddir)/pyanaconda/isys/.libs:$(srcdir)/widgets/python/:$(builddir)/widgets/src/.libs/ \ PYTHONPATH=$(srcdir):$(builddir)/pyanaconda/isys/.libs:$(srcdir)/widgets/python/:$(builddir)/widgets/src/.libs/ \
LD_LIBRARY_PATH=$(builddir)/widgets/src/.libs \ LD_LIBRARY_PATH=$(builddir)/widgets/src/.libs \
@ -155,10 +179,43 @@ runglade:
glade ${GLADE_FILE} glade ${GLADE_FILE}
ci: rc-release ci: rc-release
$(MAKE) -C utils/dd @rm -f tests/test-suite.log.*
$(MAKE) TMPDIR=/var/tmp check @mkdir -p $(USER_SITE_PACKAGES)
@sudo $(MAKE) TMPDIR=/var/tmp TESTS=nosetests_root.sh check @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 @mkdir -p repo
@mv *rpm repo @mv *rpm repo
@createrepo -p repo @createrepo_c -p repo
@sudo $(MAKE) TMPDIR=/var/tmp TESTS=install/run_install_test.sh TEST_ANACONDA_REPO=file://$(abs_builddir)/repo/ check @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
dnl You should have received a copy of the GNU Lesser General Public License 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 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 ANACONDA_SOFT_FAILURE(MESSAGE)
dnl dnl

@ -18,34 +18,33 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # 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) # This toplevel file is a little messy at the moment... (2001-06-22)
# ...still messy (2013-07-12) # ...still messy (2013-07-12)
import os
import site
coverage = None coverage = None
# If we get a signal immediately after starting that would be pretty messed up proc_cmdline = open("/proc/cmdline", "r").read()
proc_cmdline = open("/proc/cmdline", "r").read() # pylint: disable=interruptible-system-call
proc_cmdline = proc_cmdline.split() 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 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", cov = coverage.coverage(data_file="/mnt/sysimage/root/anaconda.coverage",
branch=True, branch=True,
source=["/usr/sbin/anaconda", "pyanaconda"] source=["/usr/sbin/anaconda", pyanaconda_dir]
) )
cov.start() cov.start()
import atexit, sys, os, time, signal import atexit, sys, time, signal
import pid import pid
def exitHandler(rebootData, storage): def exitHandler(rebootData, storage):
@ -68,16 +67,6 @@ def exitHandler(rebootData, storage):
while True: while True:
time.sleep(10000) 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: if anaconda.dbus_inhibit_id:
from pyanaconda.screensaver import uninhibit_screensaver from pyanaconda.screensaver import uninhibit_screensaver
uninhibit_screensaver(anaconda.dbus_session_connection, anaconda.dbus_inhibit_id) uninhibit_screensaver(anaconda.dbus_session_connection, anaconda.dbus_inhibit_id)
@ -87,6 +76,16 @@ def exitHandler(rebootData, storage):
if anaconda.payload: if anaconda.payload:
anaconda.payload.unsetup() 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 # Clean up the PID file
if pidfile: if pidfile:
pidfile.close() pidfile.close()
@ -94,23 +93,22 @@ def exitHandler(rebootData, storage):
if not flags.imageInstall and not flags.livecdInstall \ if not flags.imageInstall and not flags.livecdInstall \
and not flags.dirInstall: and not flags.dirInstall:
from pykickstart.constants import KS_SHUTDOWN, KS_WAIT from pykickstart.constants import KS_SHUTDOWN, KS_WAIT
from pyanaconda.iutil import dracut_eject, get_mount_paths, execWithRedirect
if flags.eject or rebootData.eject: if flags.eject or rebootData.eject:
for cdrom in storage.devicetree.getDevicesByType("cdrom"): for cdrom in (d for d in storage.devices if d.type == "cdrom"):
if get_mount_paths(cdrom.path): if iutil.get_mount_paths(cdrom.path):
dracut_eject(cdrom.path) iutil.dracut_eject(cdrom.path)
if flags.kexec: if flags.kexec:
execWithRedirect("systemctl", ["--no-wall", "kexec"]) iutil.execWithRedirect("systemctl", ["--no-wall", "kexec"])
while True: while True:
time.sleep(10000) time.sleep(10000)
elif rebootData.action == KS_SHUTDOWN: elif rebootData.action == KS_SHUTDOWN:
execWithRedirect("systemctl", ["--no-wall", "poweroff"]) iutil.execWithRedirect("systemctl", ["--no-wall", "poweroff"])
elif rebootData.action == KS_WAIT: elif rebootData.action == KS_WAIT:
execWithRedirect("systemctl", ["--no-wall", "halt"]) iutil.execWithRedirect("systemctl", ["--no-wall", "halt"])
else: # reboot action is KS_REBOOT or None else: # reboot action is KS_REBOOT or None
execWithRedirect("systemctl", ["--no-wall", "reboot"]) iutil.execWithRedirect("systemctl", ["--no-wall", "reboot"])
def startSpiceVDAgent(): def startSpiceVDAgent():
status = iutil.execWithRedirect("spice-vdagent", []) status = iutil.execWithRedirect("spice-vdagent", [])
@ -139,10 +137,11 @@ def doStartupX11Actions():
# fingers crossed. # fingers crossed.
# Add XDG_DATA_DIRS to the environment to pull in our overridden schema # Add XDG_DATA_DIRS to the environment to pull in our overridden schema
# files. # files.
datadir = os.environ.get('ANACONDA_DATADIR', '/usr/share/anaconda')
if 'XDG_DATA_DIRS' in os.environ: 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: 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"], childproc = iutil.startProgram(["metacity", "--display", ":1", "--sm-disable"],
env_add={'XDG_DATA_DIRS': xdg_data_dirs}) env_add={'XDG_DATA_DIRS': xdg_data_dirs})
@ -164,12 +163,20 @@ def doExtraX11Actions(runres):
set_x_resolution(runres) set_x_resolution(runres)
# Load the system-wide Xresources
iutil.execWithRedirect("xrdb",
["-nocpp", "-merge", "/etc/X11/Xresources"])
startSpiceVDAgent() startSpiceVDAgent()
def setupPythonUpdates(): def setupPythonUpdates():
from distutils.sysconfig import get_python_lib from distutils.sysconfig import get_python_lib
import gi.overrides 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 # Temporary hack for F18 alpha to symlink updates and product directories
# into tmpfs. To be removed after beta in order to directly use content # into tmpfs. To be removed after beta in order to directly use content
# from /run/install/ -- JLK # from /run/install/ -- JLK
@ -234,145 +241,8 @@ def getAnacondaVersionString():
def parseArguments(argv=None, boot_cmdline=None): def parseArguments(argv=None, boot_cmdline=None):
from pyanaconda.anaconda_argparse import AnacondaArgumentParser from pyanaconda.anaconda_argparse import getArgumentParser
from pyanaconda.anaconda_argparse import HelpTextParser ap = getArgumentParser(getAnacondaVersionString(), boot_cmdline)
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")
namespace = ap.parse_args(argv, boot_cmdline=boot_cmdline) namespace = ap.parse_args(argv, boot_cmdline=boot_cmdline)
return (namespace, ap.deprecated_bootargs) return (namespace, ap.deprecated_bootargs)
@ -456,7 +326,6 @@ def gtk_warning(title, reason):
# pylint: disable=redefined-outer-name # pylint: disable=redefined-outer-name
def check_memory(anaconda, options, display_mode=None): def check_memory(anaconda, options, display_mode=None):
from pyanaconda import isys from pyanaconda import isys
from pyanaconda.iutil import persistent_root_image
reason_strict = _("%(product_name)s requires %(needed_ram)s MB of memory to " 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") "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.") "MB of memory, but you only have %(total_ram)s MB\n.")
reboot_extra = _('\n' reboot_extra = _('\n'
'Press <return> to reboot your system.\n') 'Press [Enter] to reboot your system.\n')
livecd_title = _("Not enough RAM") livecd_title = _("Not enough RAM")
livecd_extra = _(" Try the text mode installer by running:\n\n" livecd_extra = _(" Try the text mode installer by running:\n\n"
"'/usr/bin/liveinst -T'\n\n from a root " "'/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 display_mode = anaconda.displayMode
reason = reason_strict reason = reason_strict
total_ram = int(isys.total_memory()) total_ram = int(isys.total_memory() / 1024)
needed_ram = int(isys.MIN_RAM) needed_ram = int(isys.MIN_RAM)
graphical_ram = int(isys.MIN_GUI_RAM) graphical_ram = int(isys.MIN_GUI_RAM)
# count the squashfs.img in if it is kept in 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 needed_ram += isys.SQUASHFS_EXTRA_RAM
graphical_ram += isys.SQUASHFS_EXTRA_RAM graphical_ram += isys.SQUASHFS_EXTRA_RAM
@ -552,7 +421,7 @@ def setupDisplay(anaconda, options, addons=None):
vncS.anaconda = anaconda vncS.anaconda = anaconda
anaconda.displayMode = options.display_mode anaconda.displayMode = options.display_mode
anaconda.isHeadless = arch.isS390() anaconda.isHeadless = arch.is_s390()
if options.vnc: if options.vnc:
flags.usevnc = True flags.usevnc = True
@ -743,7 +612,7 @@ def prompt_for_ssh():
if connxinfo: if connxinfo:
stdoutLog.info(_("Please ssh install@%s to begin the install."), connxinfo) stdoutLog.info(_("Please ssh install@%s to begin the install."), connxinfo)
else: else:
stdoutLog.info(_("Please ssh install@<host> to continue installation.")) stdoutLog.info(_("Please ssh install@HOSTNAME to continue installation."))
def cleanPStore(): def cleanPStore():
"""remove files stored in nonvolatile ram created by the pstore subsystem""" """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 # is sufficient free space on the flash part. On some machines this will
# take effect immediately, which is the best case. Unfortunately on some, # take effect immediately, which is the best case. Unfortunately on some,
# an intervening reboot is needed.""" # an intervening reboot is needed."""
from pyanaconda.iutil import dir_tree_map iutil.dir_tree_map("/sys/fs/pstore", os.unlink, files=True, dirs=False)
dir_tree_map("/sys/fs/pstore", os.unlink, files=True, dirs=False)
if __name__ == "__main__": if __name__ == "__main__":
# check if the CLI help is requested and return it at once, # 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 import constants
from pyanaconda.addons import collect_addon_paths from pyanaconda.addons import collect_addon_paths
from pyanaconda import geoloc from pyanaconda import geoloc
from pyanaconda import iutil
# do this early so we can set flags before initializing logging # do this early so we can set flags before initializing logging
from pyanaconda.flags import flags, can_touch_runtime_system from pyanaconda.flags import flags, can_touch_runtime_system
@ -818,6 +687,16 @@ if __name__ == "__main__":
stdoutLog.error("anaconda must be run as root.") stdoutLog.error("anaconda must be run as root.")
sys.exit(1) 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 # see if we're on s390x and if we've got an ssh connection
uname = os.uname() uname = os.uname()
if uname[4] == 's390x': if uname[4] == 's390x':
@ -840,19 +719,19 @@ if __name__ == "__main__":
from pyanaconda import isys from pyanaconda import isys
from pyanaconda import iutil
iutil.ipmi_report(constants.IPMI_STARTED) 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: if opts.images and opts.dirinstall:
stdoutLog.error("--images and --dirinstall cannot be used at the same time") stdoutLog.error("--images and --dirinstall cannot be used at the same time")
iutil.ipmi_report(constants.IPMI_ABORTED) iutil.ipmi_report(constants.IPMI_ABORTED)
sys.exit(1) sys.exit(1)
elif opts.dirinstall: elif opts.dirinstall:
if opts.dirinstall is True: root_path = opts.dirinstall
root_path = os.environ.get("ANACONDA_ROOT_PATH", "/mnt/sysimage")
else:
root_path = opts.dirinstall
iutil.setTargetPhysicalRoot(root_path) iutil.setTargetPhysicalRoot(root_path)
iutil.setSysroot(root_path) iutil.setSysroot(root_path)
@ -861,7 +740,6 @@ if __name__ == "__main__":
from pyanaconda import ntp from pyanaconda import ntp
from pyanaconda import keyboard from pyanaconda import keyboard
from pyanaconda.iutil import ProxyString, ProxyStringError from pyanaconda.iutil import ProxyString, ProxyStringError
from pyanaconda.iutil import open # pylint: disable=redefined-builtin
verdesc = "%s for %s %s" % (getAnacondaVersionString(), verdesc = "%s for %s %s" % (getAnacondaVersionString(),
product.productName, product.productVersion) product.productName, product.productVersion)
@ -888,7 +766,7 @@ if __name__ == "__main__":
if not opts.images and not opts.dirinstall: if not opts.images and not opts.dirinstall:
print(logs_note) print(logs_note)
# no fancy stuff like TTYs on a s390... # 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": if "TMUX" in os.environ and os.environ.get("TERM") == "screen":
print(shell_and_tmux_note) print(shell_and_tmux_note)
else: else:
@ -997,6 +875,7 @@ if __name__ == "__main__":
flags.selinux = opts.selinux flags.selinux = opts.selinux
flags.eject = opts.eject flags.eject = opts.eject
flags.kexec = opts.kexec flags.kexec = opts.kexec
flags.singlelang = opts.singlelang
# Switch to tty1 on exception in case something goes wrong during X start. # 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 # 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("anaconda called with cmdline = %s", sys.argv)
log.info("Default encoding = %s ", sys.getdefaultencoding()) log.info("Default encoding = %s ", sys.getdefaultencoding())
iutil.execWithRedirect("udevadm", ["control", "--env=ANACONDA=1"])
# Collect all addon paths # Collect all addon paths
addon_paths = collect_addon_paths(constants.ADDON_PATHS) addon_paths = collect_addon_paths(constants.ADDON_PATHS)
@ -1048,6 +925,12 @@ if __name__ == "__main__":
flags.automatedInstall = True flags.automatedInstall = True
flags.eject = False flags.eject = False
ksFiles = [opts.ksfile] 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: else:
ksFiles = ["/tmp/updates/interactive-defaults.ks", ksFiles = ["/tmp/updates/interactive-defaults.ks",
"/usr/share/anaconda/interactive-defaults.ks"] "/usr/share/anaconda/interactive-defaults.ks"]
@ -1203,6 +1086,14 @@ if __name__ == "__main__":
networkInitialize(ksdata) networkInitialize(ksdata)
threadMgr.add(AnacondaThread(name=constants.THREAD_WAIT_FOR_CONNECTING_NM, target=wait_for_connecting_NM_thread, args=(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 # now start the interface
setupDisplay(anaconda, opts, addon_paths) setupDisplay(anaconda, opts, addon_paths)
if anaconda.gui_startup_failed: if anaconda.gui_startup_failed:
@ -1232,23 +1123,23 @@ if __name__ == "__main__":
try: try:
for (name, path) in name_path_pairs(opts.images): for (name, path) in name_path_pairs(opts.images):
log.info("naming disk image '%s' '%s'", path, name) 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 image_count += 1
flags.imageInstall = True flags.imageInstall = True
except ValueError as e: except ValueError as e:
stdoutLog.error("error specifying image file: %s", e) stdoutLog.error("error specifying image file: %s", e)
iutil.ipmi_report(constants.IPMI_ABORTED) iutil.ipmi_abort(scripts=ksdata.scripts)
sys.exit(1) sys.exit(1)
if image_count: 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.packaging import payloadMgr
from pyanaconda.timezone import time_initialize from pyanaconda.timezone import time_initialize
if not flags.dirInstall: 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))) args=(anaconda.storage, ksdata, anaconda.protected)))
if can_touch_runtime_system("initialize time", touch_live=True): 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 #!/bin/bash -e
[ -d m4 ] || mkdir m4 [ -d m4 ] || mkdir m4
autopoint --force
libtoolize --copy --force libtoolize --copy --force
aclocal -I m4 aclocal -I m4
autoconf autoconf

@ -14,13 +14,11 @@
# #
# You should have received a copy of the GNU Lesser General Public License # 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/>. # 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) m4_define(python_required_version, 3.4)
AC_PREREQ([2.63]) 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. # Disable building static libraries.
# This needs to be set before initializing automake # This needs to be set before initializing automake
@ -43,34 +41,13 @@ AC_PROG_LN_S
AC_PROG_LIBTOOL AC_PROG_LIBTOOL
AC_PROG_MKDIR_P AC_PROG_MKDIR_P
# Check for the intltool programs # Check for the gettext programs
# These checks and subsitutions are adapted IT_PROG_INTLTOOL provided in AC_PATH_PROG([XGETTEXT], [xgettext])
# intltool.m4, but without the parts where it breaks gettext. AC_PATH_PROG([MSGFMT], [msgfmt])
AC_PATH_PROG([INTLTOOL_EXTRACT], [intltool-extract]) AC_PATH_PROG([MSGMERGE], [msgmerge])
AC_PATH_PROG([INTLTOOL_MERGE], [intltool-merge]) AC_PATH_PROG([MSGCAT], [msgcat])
AS_IF([test -z "$INTLTOOL_EXTRACT" -o -z "$INTLTOOL_MERGE"], AS_IF([test -z "$XGETTEXT" -o -z "$MSGFMT" -o -z "$MSGMERGE" -o -z "$MSGCAT"],
[ANACONDA_SOFT_FAILURE([intltool not found])]) [ANACONDA_SOFT_FAILURE([gettext 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])
# Checks for header files. # Checks for header files.
AC_CHECK_HEADERS([fcntl.h stdlib.h string.h sys/time.h unistd.h], 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/Makefile
data/window-manager/config/Makefile data/window-manager/config/Makefile
data/window-manager/theme/Makefile data/window-manager/theme/Makefile
po/Makefile.in po/Makefile
scripts/Makefile scripts/Makefile
pyanaconda/Makefile pyanaconda/Makefile
pyanaconda/version.py pyanaconda/version.py
@ -166,6 +143,7 @@ AC_CONFIG_FILES([Makefile
pyanaconda/ui/tui/spokes/Makefile pyanaconda/ui/tui/spokes/Makefile
pyanaconda/ui/tui/Makefile pyanaconda/ui/tui/Makefile
data/post-scripts/Makefile data/post-scripts/Makefile
data/pixmaps/Makefile
tests/Makefile tests/Makefile
utils/Makefile utils/Makefile
utils/dd/Makefile]) utils/dd/Makefile])

@ -14,10 +14,8 @@
# #
# You should have received a copy of the GNU Lesser General Public License # 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/>. # 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 = *~ CLEANFILES = *~

@ -8,59 +8,26 @@
* default, but it defines them for level bars using a continuous value between * 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" * 0 and 1, so our discrete level bars are effectively always at the "high"
* level. * 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_low red;
@define-color anaconda_level_bar_medium orange; @define-color anaconda_level_bar_medium orange;
@define-color anaconda_level_bar_high green; @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); border-color: darker(@anaconda_level_bar_low);
background-color: @anaconda_level_bar_low; background: @anaconda_level_bar_low;
background-image: none;
} }
.level-bar.fill-block.level-medium { levelbar.discrete trough block.filled.medium {
border-color: darker(@anaconda_level_bar_medium); border-color: darker(@anaconda_level_bar_medium);
background-color: @anaconda_level_bar_medium; background: @anaconda_level_bar_medium;
background-image: none;
} }
.level-bar.fill-block, levelbar.discrete trough block.filled.full,
.level-bar.fill-block.level-high { levelbar.discrete trough block.filled.high {
border-color: darker(@anaconda_level_bar_high); border-color: darker(@anaconda_level_bar_high);
background-color: @anaconda_level_bar_high; background: @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);
} }
/* As of gnome-themes-standard 3.9.90, the Adwaita theme uses the same color /* 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; 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 /* When multi-column GtkTreeViews set a row separator, the horizontal-separator
* style property is still applied to the row separator, breaking the row * 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 * separator up for each column. It looks kind of dumb. Provide a way to not do
* that. * that.
*/ */
GtkTreeView.solid-separator { treeview.solid-separator {
-GtkTreeView-horizontal-separator: 0; -GtkTreeView-horizontal-separator: 0;
} }

@ -30,10 +30,11 @@ syntax see the Anaconda options wiki page: http://fedoraproject.org/wiki/Anacond
kickstart kickstart
Gives the local file path to use for kickstart. Normally only used when running anaconda 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 rescue
Start the rescue environment instead of installation. Start the rescue environment instead of installation. This option is not supported for
live installations.
armplatform armplatform
Can be used to specify the ARM platform for the installation by passing the appropriate PLATFORM_ID. 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 Language to use for the installation. LANG should be a language code which is valid to be used
with the lang kickstart command. with the lang kickstart command.
singlelang
Install in single language mode - no interactive options for language configuration will be available.
loglevel loglevel
Set the minimum level required for messages to be logged on a terminal (log files always 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", 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 kexec
Reboot the system using kexec with the new kernel and initrd. This will result in 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. 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 # 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/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author: David Cantrell <dcantrell@redhat.com>
commandstubsdir = $(datadir)/$(PACKAGE_NAME) commandstubsdir = $(datadir)/$(PACKAGE_NAME)
dist_commandstubs_SCRIPTS = $(srcdir)/*-stub dist_commandstubs_SCRIPTS = $(srcdir)/*-stub

@ -2,7 +2,7 @@
# #
# scan system for harddrives and output device name/size # 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 # 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 # it under the terms of the GNU General Public License as published by
@ -19,12 +19,42 @@
# #
import sys import sys
import os
import stat
import parted 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): def main(argv):
lst = set() 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/"): if dev.path.startswith("/dev/"):
path = dev.path[5:] path = dev.path[5:]
else: else:

@ -14,8 +14,6 @@
# #
# You should have received a copy of the GNU Lesser General Public License # 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/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author: David Cantrell <dcantrell@redhat.com>
SUBDIRS = console.apps gnome pam.d SUBDIRS = console.apps gnome pam.d
@ -23,28 +21,33 @@ if IS_LIVEINST_ARCH
dist_sbin_SCRIPTS = liveinst dist_sbin_SCRIPTS = liveinst
desktopdir = $(datadir)/applications desktopdir = $(datadir)/applications
desktop_DATA = liveinst.desktop dist_desktop_DATA = liveinst.desktop
dist_libexec_SCRIPTS = liveinst-setup.sh
xinitdir = $(sysconfdir)/X11/xinit/xinitrc.d autostartdir = $(sysconfdir)/xdg/autostart
dist_xinit_SCRIPTS = zz-liveinst.sh dist_autostart_DATA = liveinst-setup.desktop
install-exec-local: install-exec-local:
$(MKDIR_P) $(DESTDIR)$(bindir) $(MKDIR_P) $(DESTDIR)$(bindir)
$(LN_S) consolehelper $(DESTDIR)$(bindir)/liveinst $(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: uninstall-local:
rm -f $(DESTDIR)$(bindir)/liveinst rm -f $(DESTDIR)$(bindir)/liveinst
endif endif
EXTRA_DIST = README liveinst.desktop.in EXTRA_DIST = README
CLEANFILES = liveinst.desktop *.h
MAINTAINERCLEANFILES = Makefile.in 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 # 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/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author: David Cantrell <dcantrell@redhat.com>
if IS_LIVEINST_ARCH if IS_LIVEINST_ARCH
consoledir = $(sysconfdir)/security/console.apps consoledir = $(sysconfdir)/security/console.apps
dist_console_DATA = liveinst dist_console_DATA = liveinst
endif 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 CLEANFILES = *.h
MAINTAINERCLEANFILES = Makefile.in MAINTAINERCLEANFILES = Makefile.in

@ -14,24 +14,26 @@
# #
# You should have received a copy of the GNU Lesser General Public License # 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/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author: Kalev Lember <kalevlember@gmail.com>
welcomedir = $(datadir)/$(PACKAGE_NAME)/gnome welcomedir = $(datadir)/$(PACKAGE_NAME)/gnome
dist_welcome_DATA = install-button.png dist_welcome_DATA = install-button.png fedora-welcome.desktop
dist_welcome_SCRIPTS = fedora-welcome dist_welcome_SCRIPTS = fedora-welcome.js
welcome_DATA = fedora-welcome.desktop
EXTRA_DIST = fedora-welcome.desktop.in
CLEANFILES = fedora-welcome.desktop
MAINTAINERCLEANFILES = Makefile.in 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 uninstall-hook:
EXTRA_DIST += $(srcdir)/fedora-welcome.po $(srcdir)/fedora-welcome.desktop.in.h -cd $(DESTDIR)$(welcomedir) && rm -f fedora-welcome
$(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 $@)

@ -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 * You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Authors: Cosimo Cecchi <cosimoc@redhat.com>
*
*/ */
const Gdk = imports.gi.Gdk; const Gdk = imports.gi.Gdk;

@ -20,10 +20,6 @@
LIVE_INSTALL=0 LIVE_INSTALL=0
IMAGE_INSTALL=0 IMAGE_INSTALL=0
RESCUE=0
if [[ "$LIVECMD $*" =~ "--rescue" ]]; then
RESCUE=1
fi
if [ -z "$LIVECMD" ]; then if [ -z "$LIVECMD" ]; then
LIVE_INSTALL=1 LIVE_INSTALL=1
@ -134,6 +130,17 @@ for opt in `cat /proc/cmdline` $*; do
echo "$text" >&2 echo "$text" >&2
fi 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 esac
done done
@ -179,6 +186,9 @@ if [ -z $LC_ALL ]; then
export LC_ALL=$LANG export LC_ALL=$LANG
fi fi
# Force the X11 backend since sudo and wayland do not mix
export GDK_BACKEND=x11
if [ -x /usr/bin/udisks ]; then if [ -x /usr/bin/udisks ]; then
/usr/bin/udisks --inhibit -- $ANACONDA $* /usr/bin/udisks --inhibit -- $ANACONDA $*
else 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 if [ -e /tmp/updates.img ]; then rm /tmp/updates.img; fi
# try to teardown the filesystems if this was an image install # 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 anaconda-cleanup
fi 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] [Desktop Entry]
_Name=Install to Hard Drive Name=Install to Hard Drive
_GenericName=Install GenericName=Install
_Comment=Install the live CD to your hard disk Comment=Install the live CD to your hard disk
Categories=System;Utility;X-Red-Hat-Base;X-Fedora;GNOME;GTK; Categories=System;Utility;X-Red-Hat-Base;X-Fedora;GNOME;GTK;
Exec=/usr/bin/liveinst Exec=/usr/bin/liveinst
Terminal=false Terminal=false
Type=Application Type=Application
# TRANSLATORS: Icon name, probably should not be translated
Icon=anaconda Icon=anaconda
StartupNotify=true StartupNotify=true
NoDisplay=true NoDisplay=true

@ -14,8 +14,6 @@
# #
# You should have received a copy of the GNU Lesser General Public License # 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/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author: David Cantrell <dcantrell@redhat.com>
if IS_LIVEINST_ARCH if IS_LIVEINST_ARCH
pamdir = $(sysconfdir)/pam.d 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 # 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 # 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 # 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 # 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/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
# Author: David Cantrell <dcantrell@redhat.com> # Author(s): Vendula Poncova <vponcova@redhat.com>
#
pixmapsdir = $(datadir)/anaconda/pixmaps
dist_pixmaps_DATA = $(srcdir)/*.png $(srcdir)/*.svg
pixmapsdir = $(datadir)/$(PACKAGE_NAME)/pixmaps
dist_pixmaps_DATA = anaconda-password-show-off.svg anaconda-password-show-on.svg
MAINTAINERCLEANFILES = Makefile.in 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. # Note, this script log will not be copied to the installed system.
%post --nochroot %post --nochroot
mkdir -p $ANA_INSTALL_PATH/var/log/anaconda NOSAVE_INPUT_KS_FILE=/tmp/NOSAVE_INPUT_KS
for log in anaconda.log syslog X.log program.log packaging.log storage.log ifcfg.log yum.log dnf.log dnf.rpm.log; do NOSAVE_LOGS_FILE=/tmp/NOSAVE_LOGS
[ -e /tmp/$log ] && cp /tmp/$log $ANA_INSTALL_PATH/var/log/anaconda/ PRE_ANA_LOGS=/tmp/pre-anaconda-logs
done
cp /tmp/ks-script*.log $ANA_INSTALL_PATH/var/log/anaconda/ if [ -e ${NOSAVE_LOGS_FILE} ]; then
journalctl -b > $ANA_INSTALL_PATH/var/log/anaconda/journal.log rm -f ${NOSAVE_LOGS_FILE}
chmod 0600 $ANA_INSTALL_PATH/var/log/anaconda/* 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 %end

@ -14,8 +14,6 @@
# #
# You should have received a copy of the GNU Lesser General Public License # 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/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author: Chris Lumens <clumens@redhat.com>
postscriptsdir = $(datadir)/$(PACKAGE_NAME)/post-scripts 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 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 # 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 # 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 # 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 # 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/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author: Chris Lumens <clumens@redhat.com>
systemddir = $(prefix)/lib/systemd/system systemddir = $(prefix)/lib/systemd/system
generatordir = $(prefix)/lib/systemd/system-generators generatordir = $(prefix)/lib/systemd/system-generators
dist_systemd_DATA = anaconda.service \ dist_systemd_DATA = anaconda.service \
anaconda-noshell.service \ anaconda-noshell.service \
anaconda-direct.service \ anaconda-direct.service \
anaconda.target \ anaconda.target \
anaconda-tmux@.service \ anaconda-tmux@.service \
anaconda-shell@.service \ anaconda-shell@.service \
instperf.service \ instperf.service \
anaconda-sshd.service \ anaconda-sshd.service \
anaconda-nm-config.service \ anaconda-nm-config.service \
zram.service anaconda-pre.service \
zram.service
dist_generator_SCRIPTS = anaconda-generator dist_generator_SCRIPTS = anaconda-generator

@ -1,6 +1,14 @@
#!/bin/bash #!/bin/bash
# anaconda-generator: generate services needed for anaconda operation # 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 # set up dirs
systemd_dir=/lib/systemd/system systemd_dir=/lib/systemd/system
target_dir=$systemd_dir/anaconda.target.wants target_dir=$systemd_dir/anaconda.target.wants
@ -33,3 +41,4 @@ for tty in hvc0 hvc1 xvc0 hvsi0 hvsi1 hvsi2; do
done done
ln -sf $systemd_dir/anaconda-nm-config.service $target_dir/anaconda-nm-config.service 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 Before=NetworkManager.service
[Service] [Service]
Type=oneshot
ExecStart=/usr/bin/anaconda-disable-nm-ibft-plugin 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] [Unit]
Description=OpenSSH server daemon Description=OpenSSH server daemon
Before=anaconda.target Before=anaconda.target
After=syslog.target network.target After=syslog.target network.target sshd-keygen.target
Wants=sshd-keygen.target
ConditionKernelCommandLine=|sshd ConditionKernelCommandLine=|sshd
ConditionKernelCommandLine=|inst.sshd ConditionKernelCommandLine=|inst.sshd
ConditionKernelCommandLine=!inst.sshd=0
ConditionKernelCommandLine=!sshd=0
# TODO: use ConditionArchitecture in systemd v210 or later # TODO: use ConditionArchitecture in systemd v210 or later
ConditionPathIsDirectory=|/sys/hypervisor/s390 ConditionPathIsDirectory=|/sys/hypervisor/s390
[Service] [Service]
EnvironmentFile=/etc/sysconfig/sshd EnvironmentFile=/etc/sysconfig/sshd
ExecStartPre=/usr/sbin/sshd-keygen
ExecStartPre=/usr/sbin/handle-sshpw ExecStartPre=/usr/sbin/handle-sshpw
ExecStart=/usr/sbin/sshd -D $OPTIONS -f /etc/ssh/sshd_config.anaconda ExecStart=/usr/sbin/sshd -D $OPTIONS -f /etc/ssh/sshd_config.anaconda
ExecReload=/bin/kill -HUP $MAINPID ExecReload=/bin/kill -HUP $MAINPID

@ -10,5 +10,6 @@ Wants=NetworkManager.service
Wants=plymouth-quit.service plymouth-quit-wait.service Wants=plymouth-quit.service plymouth-quit-wait.service
Wants=anaconda-direct.service anaconda.service Wants=anaconda-direct.service anaconda.service
Wants=anaconda-sshd.service Wants=anaconda-sshd.service
Wants=anaconda-pre.service
Wants=zram.service Wants=zram.service
Wants=systemd-logind.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 storage-log "tail -F /tmp/storage.log"
new-window -d -n program-log "tail -F /tmp/program.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 # 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/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author: David Shea <dshea@redhat.com>
SUBDIRS = config theme SUBDIRS = config theme

@ -14,15 +14,14 @@
# #
# You should have received a copy of the GNU Lesser General Public License # 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/>. # 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 schemadir = $(pkgdatadir)/window-manager/glib-2.0/schemas
# These files need to be compiled by glib-compile-schemas. This is handled # These files need to be compiled by glib-compile-schemas. This is handled
# in the spec file scriptlets. # in the spec file scriptlets.
dist_schema_DATA = org.gnome.desktop.wm.keybindings.gschema.override \ 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 # 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 # schemas they modify, so pretend that this is the case with symlinks and
@ -31,8 +30,9 @@ install-data-hook:
$(MKDIR_P) $(DESTDIR)$(schemadir) $(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.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.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) $(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: uninstall-local:
rm -f $(DESTDIR)$(schemadir)/*.xml rm -f $(DESTDIR)$(schemadir)/*.xml

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

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

@ -14,8 +14,6 @@
# #
# You should have received a copy of the GNU Lesser General Public License # 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/>. # 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 EXTRA_DIST = $(srcdir)/*.rst $(srcdir)/*.txt $(srcdir)/conf.py
@ -73,6 +71,8 @@ apidoc:
if [ -f /usr/bin/$(SPHINXAPIDOC) ]; then \ if [ -f /usr/bin/$(SPHINXAPIDOC) ]; then \
rm $(addprefix ./, $(MODULE_NAMES)) ; \ rm $(addprefix ./, $(MODULE_NAMES)) ; \
$(SPHINXAPIDOC) -o . $(SOURCEDIR) ; \ $(SPHINXAPIDOC) -o . $(SOURCEDIR) ; \
rm $(addprefix ./, tests/*.rst) ; \
$(SPHINXAPIDOC) -o ./tests ../tests ../tests/storage/run_storage_tests.py ; \
fi fi
html: apidoc html: apidoc

@ -75,6 +75,11 @@ different ways:
You can specify what version of the NFS protocol to use by adding ``nfsvers=X`` You can specify what version of the NFS protocol to use by adding ``nfsvers=X``
to the `options`. 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: .. _diskdev:
@ -269,6 +274,14 @@ ifname
Assign the given interface name to the network device with the given MAC. May Assign the given interface name to the network device with the given MAC. May
be used multiple times. 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:
inst.dhcpclass inst.dhcpclass
@ -303,6 +316,21 @@ inst.lang
Set the language to be used during installation. The language specified must Set the language to be used during installation. The language specified must
be valid for the ``lang`` kickstart command. 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:
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 For any format the ``<path>`` component defaults to ``/updates.img`` if it is
omitted. omitted.
.. nokill: .. inst.nokill:
nokill inst.nokill
^^^^^^ ^^^^^^^^^^^
A debugging option that prevents anaconda from and rebooting when a fatal error A debugging option that prevents anaconda from and rebooting when a fatal error
occurs or at the end of the installation process. 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 default, it is running in permissive mode so disabling it there does not make
much sense. 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 Third-party options
^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^

@ -11,9 +11,6 @@
# All configuration values have a default; values that are commented out # All configuration values have a default; values that are commented out
# serve to show the default. # serve to show the default.
# Ignore any interruptible calls
# pylint: disable=interruptible-system-call
import sys, os import sys, os
# If extensions (or modules to document with autodoc) are in another directory, # 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. # documentation root, use os.path.abspath to make it absolute, like shown here.
sys.path.insert(0, os.path.abspath('..')) 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 ----------------------------------------------------- # -- General configuration -----------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here. # 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