Compare commits

..

No commits in common. 'c8-beta' and 'i9' have entirely different histories.
c8-beta ... i9

@ -1 +1 @@
7450b69534ac5ce10f8698270153984ec9871944 SOURCES/anaconda-33.16.10.4.tar.bz2 71620d2ed3ce54558da0cb8d49cac48fa89d3a7a SOURCES/anaconda-34.25.4.9.tar.bz2

2
.gitignore vendored

@ -1 +1 @@
SOURCES/anaconda-33.16.10.4.tar.bz2 SOURCES/anaconda-34.25.4.9.tar.bz2

@ -0,0 +1,27 @@
From 8454ae65d1f7cb2f0221a33fd223c2b460c27017 Mon Sep 17 00:00:00 2001
From: Eugene Zamriy <eugene@zamriy.info>
Date: Fri, 14 Apr 2023 12:53:14 +0300
Subject: [PATCH 01/15] Disable subscription
---
pyanaconda/ui/gui/spokes/subscription.py | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/pyanaconda/ui/gui/spokes/subscription.py b/pyanaconda/ui/gui/spokes/subscription.py
index 4d03689..3b0e6c0 100644
--- a/pyanaconda/ui/gui/spokes/subscription.py
+++ b/pyanaconda/ui/gui/spokes/subscription.py
@@ -551,6 +551,10 @@ class SubscriptionSpoke(NormalSpoke):
# also set the spoke warning banner
self.show_warning_message(error_message)
+ @property
+ def showable(self):
+ return False
+
def initialize(self):
NormalSpoke.initialize(self)
self.initialize_start()
--
2.44.0

@ -0,0 +1,25 @@
From 3e3d00cc21ab256eb55c5e5176f66cd7a348c111 Mon Sep 17 00:00:00 2001
From: Eugene Zamriy <eugene@zamriy.info>
Date: Fri, 14 Apr 2023 12:54:58 +0300
Subject: [PATCH 02/15] Hide CDN source button
---
pyanaconda/ui/gui/spokes/installation_source.py | 2 ++
1 file changed, 2 insertions(+)
diff --git a/pyanaconda/ui/gui/spokes/installation_source.py b/pyanaconda/ui/gui/spokes/installation_source.py
index c467bd3..398ac11 100644
--- a/pyanaconda/ui/gui/spokes/installation_source.py
+++ b/pyanaconda/ui/gui/spokes/installation_source.py
@@ -798,6 +798,8 @@ class SourceSpoke(NormalSpoke, GUISpokeInputCheckHandler, SourceSwitchHandler):
self._network_button = self.builder.get_object("networkRadioButton")
self._network_box = self.builder.get_object("networkBox")
+ really_hide(self._cdn_button)
+
self._url_entry = self.builder.get_object("urlEntry")
self._protocol_combo_box = self.builder.get_object("protocolComboBox")
self._iso_chooser_button = self.builder.get_object("isoChooserButton")
--
2.44.0

@ -0,0 +1,29 @@
From d78fb7d96c772f00ce4b35f4f9209b2d629c27e0 Mon Sep 17 00:00:00 2001
From: Eugene Zamriy <eugene@zamriy.info>
Date: Fri, 14 Apr 2023 12:56:19 +0300
Subject: [PATCH 03/15] Set MSVSphere installer colors
---
data/anaconda-gtk.css | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/data/anaconda-gtk.css b/data/anaconda-gtk.css
index 516df62..ef6d79d 100644
--- a/data/anaconda-gtk.css
+++ b/data/anaconda-gtk.css
@@ -92,10 +92,11 @@ infobar.error box {
@define-color redhat #2d2d2d;
@define-color fedora #2f4265;
+@define-color msvsphere #343434;
/* theme colors/images */
-@define-color product_bg_color @fedora;
+@define-color product_bg_color @msvsphere;
/* logo and sidebar classes */
--
2.44.0

@ -0,0 +1,27 @@
From 18fcf71d53a8c476c55076f8a0e8db0904a51670 Mon Sep 17 00:00:00 2001
From: Eugene Zamriy <evgeniy.zamriy@softline.com>
Date: Fri, 28 Jul 2023 23:47:23 +0300
Subject: [PATCH 04/15] Add Minimal and Server repository support
---
pyanaconda/core/constants.py | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/pyanaconda/core/constants.py b/pyanaconda/core/constants.py
index 1496f8c..72a9d39 100644
--- a/pyanaconda/core/constants.py
+++ b/pyanaconda/core/constants.py
@@ -58,7 +58,9 @@ DEFAULT_REPOS = [productName.split('-')[0].lower(),
"fedora-modular-server",
"rawhide",
"BaseOS", # Used by RHEL
- "baseos"] # Used by CentOS Stream
+ "baseos", # Used by CentOS Stream
+ "Server", # Used by MSVSphere
+ "Minimal"] # Used by MSVSphere
DBUS_ANACONDA_SESSION_ADDRESS = "DBUS_ANACONDA_SESSION_BUS_ADDRESS"
--
2.44.0

@ -0,0 +1,55 @@
From 590d0e07d420aa32e69d23e1d70211ceaf35aa1f Mon Sep 17 00:00:00 2001
From: tigro <tigro@msvsphere-os.ru>
Date: Wed, 3 Apr 2024 09:41:32 +0300
Subject: [PATCH 05/15] Set default timezone to Europe/Moscow
---
pyanaconda/modules/timezone/installation.py | 4 ++--
pyanaconda/modules/timezone/timezone.py | 2 +-
pyanaconda/ui/gui/spokes/datetime_spoke.py | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/pyanaconda/modules/timezone/installation.py b/pyanaconda/modules/timezone/installation.py
index fcd04d1..88ac7b5 100644
--- a/pyanaconda/modules/timezone/installation.py
+++ b/pyanaconda/modules/timezone/installation.py
@@ -67,8 +67,8 @@ class ConfigureTimezoneTask(Task):
else:
# this should never happen, but for pity's sake
log.warning("Timezone %s set in kickstart is not valid, "
- "falling back to default (America/New_York).", self._timezone)
- self._timezone = "America/New_York"
+ "falling back to default (Europe/Moscow).", self._timezone)
+ self._timezone = "Europe/Moscow"
def _make_timezone_symlink(self):
"""Create the symlink that actually defines timezone."""
diff --git a/pyanaconda/modules/timezone/timezone.py b/pyanaconda/modules/timezone/timezone.py
index ac5318c..42e0cfe 100644
--- a/pyanaconda/modules/timezone/timezone.py
+++ b/pyanaconda/modules/timezone/timezone.py
@@ -46,7 +46,7 @@ class TimezoneService(KickstartService):
def __init__(self):
super().__init__()
self.timezone_changed = Signal()
- self._timezone = "America/New_York"
+ self._timezone = "Europe/Moscow"
self._priority = TIMEZONE_PRIORITY_DEFAULT
self.geolocation_result_changed = Signal()
diff --git a/pyanaconda/ui/gui/spokes/datetime_spoke.py b/pyanaconda/ui/gui/spokes/datetime_spoke.py
index 117dfe3..f35bab1 100644
--- a/pyanaconda/ui/gui/spokes/datetime_spoke.py
+++ b/pyanaconda/ui/gui/spokes/datetime_spoke.py
@@ -70,7 +70,7 @@ SERVER_WORKING = 3
SERVER_USE = 4
SERVER_OBJECT = 5
-DEFAULT_TZ = "America/New_York"
+DEFAULT_TZ = "Europe/Moscow"
SPLIT_NUMBER_SUFFIX_RE = re.compile(r'([^0-9]*)([-+])([0-9]+)')
--
2.44.0

@ -0,0 +1,40 @@
From 0fc5e241d84cb01bbaf93bba4e400d2f06b372c9 Mon Sep 17 00:00:00 2001
From: Eugene Zamriy <eugene@zamriy.info>
Date: Fri, 14 Apr 2023 14:59:53 +0300
Subject: [PATCH 06/15] Add MSVSphere product config
---
data/product.d/msvsphere.conf | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
create mode 100644 data/product.d/msvsphere.conf
diff --git a/data/product.d/msvsphere.conf b/data/product.d/msvsphere.conf
new file mode 100644
index 0000000..baaf497
--- /dev/null
+++ b/data/product.d/msvsphere.conf
@@ -0,0 +1,21 @@
+# Anaconda configuration file for MSVSphere.
+
+[Product]
+product_name = MSVSphere
+
+[Base Product]
+product_name = Red Hat Enterprise Linux
+
+[Anaconda]
+forbidden_modules =
+ org.fedoraproject.Anaconda.Modules.Subscription
+
+[Bootloader]
+efi_dir = msvsphere
+
+[Payload]
+enable_closest_mirror = True
+default_source = CLOSEST_MIRROR
+
+[License]
+eula = /usr/share/sphere-release/EULA
--
2.44.0

@ -0,0 +1,25 @@
From bb93c14285802d057447369c44b662d2d43521a8 Mon Sep 17 00:00:00 2001
From: Eugene Zamriy <eugene@zamriy.info>
Date: Fri, 14 Apr 2023 18:00:57 +0300
Subject: [PATCH 07/15] Set Russian language as default
---
pyanaconda/core/constants.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pyanaconda/core/constants.py b/pyanaconda/core/constants.py
index 72a9d39..ca9dadc 100644
--- a/pyanaconda/core/constants.py
+++ b/pyanaconda/core/constants.py
@@ -72,7 +72,7 @@ ANACONDA_CONFIG_DIR = "/etc/anaconda/"
ANACONDA_CONFIG_TMP = "/run/anaconda/anaconda.conf"
# NOTE: this should be LANG_TERRITORY.CODESET, e.g. en_US.UTF-8
-DEFAULT_LANG = "en_US.UTF-8"
+DEFAULT_LANG = "ru_RU.UTF-8"
DEFAULT_VC_FONT = "eurlatgr"
--
2.44.0

@ -0,0 +1,102 @@
From 03809bf006ee92d63a3bc4bc9702ceca757a5e9c Mon Sep 17 00:00:00 2001
From: Eugene Zamriy <eugene@zamriy.info>
Date: Fri, 14 Apr 2023 18:23:29 +0300
Subject: [PATCH 08/15] Replace Fedora references and update translations
---
data/liveinst/gnome/fedora-welcome.desktop | 3 ++-
data/liveinst/gnome/fedora-welcome.js | 6 +++---
docs/intro.rst | 4 ++--
docs/iscsi.rst | 2 +-
pyanaconda/core/constants.py | 4 ++--
5 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/data/liveinst/gnome/fedora-welcome.desktop b/data/liveinst/gnome/fedora-welcome.desktop
index 60e5c38..90f5678 100644
--- a/data/liveinst/gnome/fedora-welcome.desktop
+++ b/data/liveinst/gnome/fedora-welcome.desktop
@@ -1,5 +1,6 @@
[Desktop Entry]
-Name=Welcome to Fedora
+Name=Welcome to MSVSphere
+Name[ru]=Добро пожаловать в МСВСфера
Exec=/usr/share/anaconda/gnome/fedora-welcome
Terminal=false
Type=Application
diff --git a/data/liveinst/gnome/fedora-welcome.js b/data/liveinst/gnome/fedora-welcome.js
index 0520557..4c0a66a 100755
--- a/data/liveinst/gnome/fedora-welcome.js
+++ b/data/liveinst/gnome/fedora-welcome.js
@@ -62,7 +62,7 @@ const WelcomeWindow = new Lang.Class({
default_width: 600,
default_height: 550,
skip_taskbar_hint: true,
- title: _("Welcome to Fedora"),
+ title: _("Welcome to MSVSphere"),
window_position: Gtk.WindowPosition.CENTER });
this.window.connect('key-press-event', Lang.bind(this,
function(w, event) {
@@ -91,7 +91,7 @@ const WelcomeWindow = new Lang.Class({
spacing: 16 });
tryContent.add(new Gtk.Image({ icon_name: 'media-optical',
pixel_size: 256 }));
- tryContent.add(makeLabel(_("Try Fedora"), true));
+ tryContent.add(makeLabel(_("Try MSVSphere"), true));
let tryButton = new Gtk.Button({ child: tryContent });
buttonBox.add(tryButton);
@@ -107,7 +107,7 @@ const WelcomeWindow = new Lang.Class({
let installButton = new Gtk.Button({ child: installContent });
buttonBox.add(installButton);
- this._label = makeLabel(_("You are currently running Fedora from live media.\nYou can install Fedora now, or choose \"Install to Hard Drive\" in the Activities Overview at any later time."), false);
+ this._label = makeLabel(_("You are currently running MSVSphere from live media.\nYou can install MSVSphere now, or choose \"Install to Hard Drive\" in the Activities Overview at any later time."), false);
mainGrid.add(this._label);
installButton.connect('clicked', Lang.bind(this,
diff --git a/docs/intro.rst b/docs/intro.rst
index bbaf74f..65a1a35 100644
--- a/docs/intro.rst
+++ b/docs/intro.rst
@@ -1,8 +1,8 @@
Introduction to Anaconda
========================
-Anaconda is the installation program used by Fedora, Red Hat Enterprise Linux
-and some other distributions.
+Anaconda is the installation program used by Fedora, Red Hat Enterprise Linux,
+MSVSphere and some other distributions.
During installation, a target computer's hardware is identified and configured
and the appropriate file systems for the system's architecture are created.
diff --git a/docs/iscsi.rst b/docs/iscsi.rst
index 847078d..6d9c4b3 100644
--- a/docs/iscsi.rst
+++ b/docs/iscsi.rst
@@ -139,7 +139,7 @@ If for some reason the DeviceTree fails at recognizing iscsi devices as such,
The booting problems are either due to incorrectly generated dracut boot
arguments or they are simply dracut bugs.
-Note that many of the iscsi adapters are installed in different Red Hat machines
+Note that many of the iscsi adapters are installed in different MSVSphere machines
and so the issues can often be reproduced and debugged.
diff --git a/pyanaconda/core/constants.py b/pyanaconda/core/constants.py
index ca9dadc..84b03e3 100644
--- a/pyanaconda/core/constants.py
+++ b/pyanaconda/core/constants.py
@@ -156,8 +156,8 @@ WARNING_SUPPORT_REMOVED = N_(
)
WARNING_HARDWARE_UNSUPPORTED = N_(
- "This hardware (or a combination thereof) is not supported by Red Hat. For more information "
- "on supported hardware, please refer to http://www.redhat.com/hardware."
+ "This hardware (or a combination thereof) is not supported by MSVSphere. For more information "
+ "on supported hardware, please refer to https://msvsphere-os.ru."
)
# Storage messages
--
2.44.0

@ -0,0 +1,34 @@
From 656b7931e60d6e25323e3ae46e2f15fc7d550ff3 Mon Sep 17 00:00:00 2001
From: Sergey Cherevko <s.cherevko@msvsphere-os.ru>
Date: Wed, 4 Oct 2023 17:41:16 +0300
Subject: [PATCH 09/15] Set Russian as default language for new regions
---
pyanaconda/modules/timezone/initialization.py | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/pyanaconda/modules/timezone/initialization.py b/pyanaconda/modules/timezone/initialization.py
index 0ef8d09..f8f5848 100644
--- a/pyanaconda/modules/timezone/initialization.py
+++ b/pyanaconda/modules/timezone/initialization.py
@@ -97,6 +97,17 @@ class GeolocationTask(Task):
territory = json_reply.get("country_code", "")
timezone = json_reply.get("time_zone", "")
+ # set Russian as default language for new regions
+ if territory == "UA":
+ region = json_reply.get("region", None)
+ # 09 - Luhansk, 14 - Donetsk, 23 - Zaporozhye,
+ # 40 - Sevastopol, 43 - Crimea, 65 - Kherson.
+ # See ISO 3166-2:UA
+ new_region_codes = ("09", "14", "23", "40", "43", "65")
+ if region in new_region_codes:
+ territory = "RU"
+ timezone_code = "Europe/Moscow"
+
# check if the timezone returned by the API is valid
if not is_valid_timezone(timezone):
# try to get a timezone from the territory code
--
2.44.0

@ -0,0 +1,50 @@
From 60ffb83455ecba7fccef1044e7eb17b55c589c44 Mon Sep 17 00:00:00 2001
From: Eugene Zamriy <eugene@zamriy.info>
Date: Wed, 19 Apr 2023 12:06:57 +0300
Subject: [PATCH 10/15] Set English as fallback language for help
---
pyanaconda/core/constants.py | 4 ++++
pyanaconda/ui/lib/help.py | 4 ++--
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/pyanaconda/core/constants.py b/pyanaconda/core/constants.py
index 84b03e3..b7c2e5e 100644
--- a/pyanaconda/core/constants.py
+++ b/pyanaconda/core/constants.py
@@ -74,6 +74,10 @@ ANACONDA_CONFIG_TMP = "/run/anaconda/anaconda.conf"
# NOTE: this should be LANG_TERRITORY.CODESET, e.g. en_US.UTF-8
DEFAULT_LANG = "ru_RU.UTF-8"
+# NOTE: MSVSphere change, set English as a fallback help language because
+# we use Russian by default for UI
+DEFAULT_HELP_LANG = "en_US.UTF-8"
+
DEFAULT_VC_FONT = "eurlatgr"
DEFAULT_KEYBOARD = "us"
diff --git a/pyanaconda/ui/lib/help.py b/pyanaconda/ui/lib/help.py
index 271e587..b8f424d 100644
--- a/pyanaconda/ui/lib/help.py
+++ b/pyanaconda/ui/lib/help.py
@@ -25,7 +25,7 @@ from collections import namedtuple
from pyanaconda.anaconda_loggers import get_module_logger
from pyanaconda.core.configuration.anaconda import conf
-from pyanaconda.core.constants import DEFAULT_LANG, DisplayModes
+from pyanaconda.core.constants import DEFAULT_HELP_LANG, DisplayModes
from pyanaconda.core.util import startProgram, join_paths
from pyanaconda.localization import find_best_locale_match
@@ -224,7 +224,7 @@ def _find_best_help_file(current_locale, available_files):
:param dict available_files: a dictionary of langcodes and help paths
:return str: a path to the best help file or None
"""
- for locale in (current_locale, DEFAULT_LANG):
+ for locale in (current_locale, DEFAULT_HELP_LANG):
best_lang = find_best_locale_match(locale, available_files.keys())
best_path = available_files.get(best_lang, None)
--
2.44.0

@ -0,0 +1,680 @@
From b0fe2c954cbab7d9e963a71efa6be2e9b310ab3d Mon Sep 17 00:00:00 2001
From: tigro <tigro@msvsphere-os.ru>
Date: Wed, 3 Apr 2024 10:11:15 +0300
Subject: [PATCH] Add MSVSphere identification support
---
data/liveinst/gnome/fedora-welcome.desktop | 4 +-
data/liveinst/gnome/fedora-welcome.js | 2 +-
po/ru.po | 216 ++++++++++++++----
pyanaconda/product.py | 36 ++-
.../ui/gui/spokes/installation_progress.py | 8 +-
pyanaconda/ui/gui/spokes/lib/accordion.py | 2 +-
.../ui/gui/spokes/lib/storage_dialogs.py | 4 +-
pyanaconda/ui/gui/spokes/welcome.py | 21 +-
pyanaconda/vnc.py | 42 +++-
9 files changed, 273 insertions(+), 62 deletions(-)
diff --git a/data/liveinst/gnome/fedora-welcome.desktop b/data/liveinst/gnome/fedora-welcome.desktop
index 90f5678..8ca72a7 100644
--- a/data/liveinst/gnome/fedora-welcome.desktop
+++ b/data/liveinst/gnome/fedora-welcome.desktop
@@ -1,6 +1,6 @@
[Desktop Entry]
-Name=Welcome to MSVSphere
-Name[ru]=Добро пожаловать в МСВСфера
+Name=Welcome to MSVSphere ARM 9.4
+Name[ru]=Добро пожаловать в МСВСфера АРМ 9.4
Exec=/usr/share/anaconda/gnome/fedora-welcome
Terminal=false
Type=Application
diff --git a/data/liveinst/gnome/fedora-welcome.js b/data/liveinst/gnome/fedora-welcome.js
index 4c0a66a..e313403 100755
--- a/data/liveinst/gnome/fedora-welcome.js
+++ b/data/liveinst/gnome/fedora-welcome.js
@@ -62,7 +62,7 @@ const WelcomeWindow = new Lang.Class({
default_width: 600,
default_height: 550,
skip_taskbar_hint: true,
- title: _("Welcome to MSVSphere"),
+ title: _("Welcome to MSVSphere ARM 9.4"),
window_position: Gtk.WindowPosition.CENTER });
this.window.connect('key-press-event', Lang.bind(this,
function(w, event) {
diff --git a/po/ru.po b/po/ru.po
index 1edb03d..1f8915b 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -197,7 +197,37 @@ msgstr "Выбор корня"
msgid "The following installations were discovered on your system."
msgstr "В вашей системе обнаружены следующие установки."
-#: pyanaconda/product.py:69
+#: pyanaconda/product.py:83
+#, python-format
+msgid "MSVSphere %(productVersion)s Server INSTALLATION"
+msgstr "УСТАНОВКА МСВСфера %(productVersion)s Сервер"
+
+#: pyanaconda/product.py:85
+#, python-format
+msgid "MSVSphere %(productVersion)s ARM INSTALLATION"
+msgstr "УСТАНОВКА МСВСфера %(productVersion)s АРМ"
+
+#: pyanaconda/product.py:87
+#, python-format
+msgid "MSVSphere %(productVersion)s Cinnamon INSTALLATION"
+msgstr "УСТАНОВКА МСВСфера %(productVersion)s Cinnamon"
+
+#: pyanaconda/product.py:89
+#, python-format
+msgid "MSVSphere %(productVersion)s KDE INSTALLATION"
+msgstr "УСТАНОВКА МСВСфера %(productVersion)s KDE"
+
+#: pyanaconda/product.py:91
+#, python-format
+msgid "MSVSphere %(productVersion)s XFCE INSTALLATION"
+msgstr "УСТАНОВКА МСВСфера %(productVersion)s XFCE"
+
+#: pyanaconda/product.py:93
+#, python-format
+msgid "MSVSphere %(productVersion)s OS INSTALLATION"
+msgstr "УСТАНОВКА МСВСфера %(productVersion)s ОС"
+
+#: pyanaconda/product.py:95
#, python-format
msgid "%(productName)s %(productVersion)s INSTALLATION"
msgstr "УСТАНОВКА %(productName)s %(productVersion)s"
@@ -288,31 +318,91 @@ msgstr "Сервера NTP:"
msgid "not configured"
msgstr "не настроено"
-#: pyanaconda/vnc.py:79
+#: pyanaconda/vnc.py:81
+#, python-format
+msgid "MSVSphere %(productVersion)s Server installation"
+msgstr "Установка МСВСфера %(productVersion)s Сервер"
+
+#: pyanaconda/vnc.py:83
+#, python-format
+msgid "MSVSphere %(productVersion)s ARM installation"
+msgstr "Установка МСВСфера %(productVersion)s АРМ"
+
+#: pyanaconda/vnc.py:85
+#, python-format
+msgid "MSVSphere %(productVersion)s Cinnamon installation"
+msgstr "Установка МСВСфера %(productVersion)s Cinnamon"
+
+#: pyanaconda/vnc.py:87
+#, python-format
+msgid "MSVSphere %(productVersion)s KDE installation"
+msgstr "Установка МСВСфера %(productVersion)s KDE"
+
+#: pyanaconda/vnc.py:89
+#, python-format
+msgid "MSVSphere %(productVersion)s XFCE installation"
+msgstr "Установка МСВСфера %(productVersion)s XFCE"
+
+#: pyanaconda/vnc.py:91
+#, python-format
+msgid "MSVSphere %(productVersion)s OS installation"
+msgstr "Установка МСВСфера %(productVersion)s ОС"
+
+#: pyanaconda/vnc.py:93
#, python-format
msgid "%(productName)s %(productVersion)s installation"
msgstr "Установка %(productName)s %(productVersion)s"
-#: pyanaconda/vnc.py:148
+#: pyanaconda/vnc.py:159
+#, python-format
+msgid "MSVSphere %(productVersion)s Server installation on host %(name)s"
+msgstr "Установка МСВСфера %(productVersion)s Сервер на %(name)s"
+
+#: pyanaconda/vnc.py:162
+#, python-format
+msgid "MSVSphere %(productVersion)s ARM installation on host %(name)s"
+msgstr "Установка МСВСфера %(productVersion)s АРМ на %(name)s"
+
+#: pyanaconda/vnc.py:162
+#, python-format
+msgid "MSVSphere %(productVersion)s Cinnamon installation on host %(name)s"
+msgstr "Установка МСВСфера %(productVersion)s Cinnamon на %(name)s"
+
+#: pyanaconda/vnc.py:162
+#, python-format
+msgid "MSVSphere %(productVersion)s KDE installation on host %(name)s"
+msgstr "Установка МСВСфера %(productVersion)s KDE на %(name)s"
+
+#: pyanaconda/vnc.py:162
+#, python-format
+msgid "MSVSphere %(productVersion)s XFCE installation on host %(name)s"
+msgstr "Установка МСВСфера %(productVersion)s XFCE на %(name)s"
+
+#: pyanaconda/vnc.py:165
+#, python-format
+msgid "MSVSphere %(productVersion)s OS installation on host %(name)s"
+msgstr "Установка МСВСфера %(productVersion)s ОС на %(name)s"
+
+#: pyanaconda/vnc.py:168
#, python-format
msgid "%(productName)s %(productVersion)s installation on host %(name)s"
msgstr "Установка %(productName)s %(productVersion)s на %(name)s"
-#: pyanaconda/vnc.py:167
+#: pyanaconda/vnc.py:204
#, python-format
msgid "Attempting to connect to vnc client on host %s..."
msgstr "Попытка соединения с VNC-клиентом на узле %s..."
-#: pyanaconda/vnc.py:181
+#: pyanaconda/vnc.py:218
msgid "Connected!"
msgstr "Подключено!"
-#: pyanaconda/vnc.py:184
+#: pyanaconda/vnc.py:221
msgid "Will try to connect again in 15 seconds..."
msgstr ""
"Повторная попытка установить соединение будет предпринята через 15 секунд..."
-#: pyanaconda/vnc.py:191
+#: pyanaconda/vnc.py:228
#, python-format
msgid "Giving up attempting to connect after %d try!\n"
msgid_plural "Giving up attempting to connect after %d tries!\n"
@@ -320,16 +410,16 @@ msgstr[0] "Установка соединения прекращена посл
msgstr[1] "Установка соединения прекращена после %d попыток!\n"
msgstr[2] "Установка соединения прекращена после %d попыток!\n"
-#: pyanaconda/vnc.py:199
+#: pyanaconda/vnc.py:236
msgid "Attempting to start vncconfig"
msgstr "Попытка запустить vncconfig"
-#: pyanaconda/vnc.py:212
+#: pyanaconda/vnc.py:249
#, python-format
msgid "Please manually connect your vnc client to %s to begin the install."
msgstr "Для начала установки подключите VNC-клиент к %s вручную."
-#: pyanaconda/vnc.py:214
+#: pyanaconda/vnc.py:251
#, python-format
msgid ""
"Please manually connect your vnc client to IP-ADDRESS:%s to begin the "
@@ -340,15 +430,15 @@ msgstr ""
"Переключитесь на оболочку (Ctrl-B 2) и выполните команду 'ip addr', чтобы "
"найти IP-ADDRESS."
-#: pyanaconda/vnc.py:219
+#: pyanaconda/vnc.py:256
msgid "Starting VNC..."
msgstr "Запуск VNC..."
-#: pyanaconda/vnc.py:256
+#: pyanaconda/vnc.py:293
msgid "The VNC server is now running."
msgstr "Сервер VNC запущен."
-#: pyanaconda/vnc.py:260
+#: pyanaconda/vnc.py:297
msgid ""
"\n"
"\n"
@@ -366,7 +456,7 @@ msgstr ""
"\n"
"\n"
-#: pyanaconda/vnc.py:265
+#: pyanaconda/vnc.py:302
msgid ""
"\n"
"\n"
@@ -382,7 +472,7 @@ msgstr ""
"для ограничения доступа к серверу.\n"
"\n"
-#: pyanaconda/vnc.py:269
+#: pyanaconda/vnc.py:306
msgid ""
"\n"
"\n"
@@ -394,7 +484,7 @@ msgstr ""
"Вы выбрали запуск VNC с паролем.\n"
"\n"
-#: pyanaconda/vnc.py:271
+#: pyanaconda/vnc.py:308
msgid ""
"\n"
"\n"
@@ -406,7 +496,7 @@ msgstr ""
"Неизвестная ошибка. Остановка работы.\n"
"\n"
-#: pyanaconda/vnc.py:293
+#: pyanaconda/vnc.py:330
msgid ""
"VNC password must be six to eight characters long.\n"
"Please enter a new one, or leave blank for no password."
@@ -750,13 +840,13 @@ msgstr ""
#: pyanaconda/core/constants.py:157
msgid ""
-"This hardware (or a combination thereof) is not supported by Red Hat. For "
-"more information on supported hardware, please refer to http://www.redhat."
-"com/hardware."
+"This hardware (or a combination thereof) is not supported by MSVSphere. "
+"For more information on supported hardware, please refer to "
+"https://msvsphere-os.ru."
msgstr ""
-"Это аппаратное обеспечение (или их комбинация) не поддерживается Red Hat. "
-"Для получения дополнительной информации о поддерживаемом оборудовании см. "
-"http://www.redhat.com/hardware."
+"Это аппаратное обеспечение (или их комбинация) не поддерживается "
+"МСВСфера ОС. Для получения дополнительной информации о поддерживаемом "
+"оборудовании см. https://msvsphere-os.ru."
#: pyanaconda/core/constants.py:163
msgid ""
@@ -1507,7 +1597,7 @@ msgstr "Не удалось добавить устройство."
#: pyanaconda/modules/storage/partitioning/interactive/utils.py:213
#, python-brace-format
msgid "New {name} {version} Installation"
-msgstr "Новая установка {name} {version}"
+msgstr "Новая установка МСВСфера {version}"
#: pyanaconda/modules/storage/partitioning/interactive/utils.py:275
msgid "Cannot set label on file system."
@@ -1937,7 +2027,7 @@ msgid ""
"recommended for a normal %(productName)s install."
msgstr ""
"Размер раздела %(mount)s меньше %(size)s, что меньше рекомендованного "
-"размера для обычной установки %(productName)s."
+"размера для обычной установки МСВСфера ОС."
#: pyanaconda/modules/storage/checker/utils.py:131
#, python-format
@@ -3455,7 +3545,7 @@ msgid ""
"You haven't created any mount points for your %(product)s %(version)s "
"installation yet. You can:"
msgstr ""
-"Вы еще не создали точки монтирования для установки %(product)s %(version)s. "
+"Вы еще не создали точки монтирования для установки МСВСфера ОС %(version)s. "
"Вы можете:"
#: pyanaconda/ui/gui/spokes/lib/accordion.py:479
@@ -3487,6 +3577,10 @@ msgstr ""
"_Автоматически созданные точки монтирования могут быть зашифрованы по "
"умолчанию:"
+#: pyanaconda/ui/gui/spokes/lib/accordion.py:547
+msgid "Encrypt my data."
+msgstr "Зашифровать данные."
+
#: pyanaconda/ui/gui/spokes/lib/storage_dialogs.py:69
msgid "Please wait... software metadata still loading."
msgstr "Подождите… Всё ещё загружаются метаданные ПО."
@@ -3498,7 +3592,7 @@ msgid ""
"of available space, including <b>%(software)s</b> for software and "
"<b>%(swap)s</b> for swap space."
msgstr ""
-"Для установки <b>%(product)s</b> требуется <b>%(total)s</b>, в том числе "
+"Для установки <b>МСВСфера ОС</b> требуется <b>%(total)s</b>, в том числе "
"<b>%(software)s</b> для программ и <b>%(swap)s</b> для подкачки."
#: pyanaconda/ui/gui/spokes/lib/storage_dialogs.py:81
@@ -3509,7 +3603,7 @@ msgid ""
"<b>%(software)s</b> for software and <b>%(swap)s</b> for swap space."
msgstr ""
"Для <a href=\"\" title=\"%(tooltip)s\">программного обеспечения "
-"<b>%(product)s</b></a> требуется <b>%(total)s</b> пространства, в том числе "
+"<b>МСВСфера ОС</b></a> требуется <b>%(total)s</b> пространства, в том числе "
"<b>%(software)s</b> для программ и <b>%(swap)s</b> для подкачки."
#: pyanaconda/ui/gui/spokes/lib/storage_dialogs.py:132
@@ -3520,11 +3614,11 @@ msgstr "%s На выбранных дисках доступно:"
#: pyanaconda/ui/gui/spokes/lib/storage_dialogs.py:142
#, python-format
msgid ""
-"<b>You don't have enough space available to install %s</b>. You can shrink "
+"<b>You don't have enough space available to install %(name)s</b>. You can shrink "
"or remove existing partitions via our guided reclaim space tool, or you can "
"adjust your partitions on your own in the custom partitioning interface."
msgstr ""
-"<b>Недостаточно места для установки %s</b>. Можно уменьшить или удалить "
+"<b>Недостаточно места для установки %(name)s</b>. Можно уменьшить или удалить "
"существующие разделы с помощью помощника или самостоятельно выбрать размеры "
"разделов в окне настройки разделов."
@@ -3534,7 +3628,7 @@ msgid ""
" You don't have enough space available to install <b>%(product)s</b>, even "
"if you used all of the free space available on the selected disks."
msgstr ""
-" Недостаточно места для установки <b>%(product)s</b>, даже если "
+" Недостаточно места для установки <b>МСВСфера ОС</b>, даже если "
"использовать все свободное место на выбранных дисках."
#: pyanaconda/ui/gui/spokes/lib/storage_dialogs.py:178
@@ -3545,10 +3639,10 @@ msgid ""
"could add more disks for additional space, modify your software selection to "
"install a smaller version of <b>%(productName)s</b>, or quit the installer."
msgstr ""
-"<b>Недостаточно места для установки %(productName)s</b>, даже если "
+"<b>Недостаточно места для установки МСВСфера ОС</b>, даже если "
"использовать всё свободное место на выбранных дисках. Можно добавить ещё "
"диски, чтобы получить дополнительное место, изменить выбор программного "
-"обеспечения, чтобы установить меньший вариант <b>%(productName)s</b>, или "
+"обеспечения, чтобы установить меньший вариант <b>МСВСфера ОС</b>, или "
"покинуть программу установки."
#: pyanaconda/ui/gui/spokes/lib/subscription.py:66
@@ -4096,7 +4190,7 @@ msgid ""
"you'll be able to view their details here."
msgstr ""
"Здесь будет показана информация о созданных точках монтирования для "
-"установки %(name)s %(version)s."
+"установки МСВСфера %(version)s OC."
#: pyanaconda/ui/gui/spokes/custom_storage.py:615
#: pyanaconda/ui/gui/spokes/advstorage/nvdimm.glade:178
@@ -4431,6 +4525,36 @@ msgstr "Рабочий сервер NTP не настроен"
msgid "What language would you like to use during the installation process?"
msgstr "Какой язык вы хотите использовать в процессе установки?"
+#: pyanaconda/ui/gui/spokes/welcome.py:278
+#, python-format
+msgid "WELCOME TO MSVSphere %(version)s Server"
+msgstr "ДОБРО ПОЖАЛОВАТЬ В МСВСфера %(version)s Сервер"
+
+#: pyanaconda/ui/gui/spokes/welcome.py:280
+#, python-format
+msgid "WELCOME TO MSVSphere %(version)s ARM"
+msgstr "ДОБРО ПОЖАЛОВАТЬ В МСВСфера %(version)s АРМ"
+
+#: pyanaconda/ui/gui/spokes/welcome.py:282
+#, python-format
+msgid "WELCOME TO MSVSphere %(version)s Cinnamon"
+msgstr "ДОБРО ПОЖАЛОВАТЬ В МСВСфера %(version)s Cinnamon"
+
+#: pyanaconda/ui/gui/spokes/welcome.py:284
+#, python-format
+msgid "WELCOME TO MSVSphere %(version)s KDE"
+msgstr "ДОБРО ПОЖАЛОВАТЬ В МСВСфера %(version)s KDE"
+
+#: pyanaconda/ui/gui/spokes/welcome.py:286
+#, python-format
+msgid "WELCOME TO MSVSphere %(version)s XFCE"
+msgstr "ДОБРО ПОЖАЛОВАТЬ В МСВСфера %(version)s XFCE"
+
+#: pyanaconda/ui/gui/spokes/welcome.py:288
+#, python-format
+msgid "WELCOME TO MSVSphere %(version)s OS"
+msgstr "ДОБРО ПОЖАЛОВАТЬ В МСВСфера %(version)s ОС"
+
#: pyanaconda/ui/gui/spokes/welcome.py:209
#, python-format
msgid "WELCOME TO %(name)s %(version)s."
@@ -4482,8 +4606,8 @@ msgid ""
"%s is now successfully installed and ready for you to use!\n"
"Go ahead and reboot your system to start using it!"
msgstr ""
-"%s успешно установлена и готова к использованию!\n"
-"Давайте, перезагружайте систему и начинайте использовать ее!"
+"МСВСфера ОС установлена и готова к работе.\n"
+"Необходимо перезагрузить систему чтобы приступить к использованию."
#: pyanaconda/ui/gui/spokes/installation_progress.py:163
#, python-format
@@ -4491,8 +4615,8 @@ msgid ""
"%s is now successfully installed and ready for you to use!\n"
"Go ahead and quit the application to start using it!"
msgstr ""
-"%s успешно установлено и готово к использованию!\n"
-"Выйдите из приложения и начните использовать его!"
+"МСВСфера ОС установлена и готова к работе.\n"
+"Необходимо выйти из приложения чтобы приступить к использованию."
#: pyanaconda/ui/gui/spokes/installation_source.py:73
msgid "Setting up installation source..."
@@ -7614,21 +7738,21 @@ msgstr "Настройка Liveinst"
#: data/liveinst/gnome/fedora-welcome.desktop:3
#: data/liveinst/gnome/fedora-welcome.js:65
-msgid "Welcome to Fedora"
-msgstr "Добро пожаловать в Fedora"
+msgid "Welcome to MSVSphere ARM 9.4"
+msgstr "Добро пожаловать в МСВСфера АРМ 9.4"
#: data/liveinst/gnome/fedora-welcome.js:94
-msgid "Try Fedora"
-msgstr "Попробуйте Fedora"
+msgid "Try MSVSphere"
+msgstr "Попробовать в режиме Live"
#: data/liveinst/gnome/fedora-welcome.js:110
msgid ""
-"You are currently running Fedora from live media.\n"
-"You can install Fedora now, or choose \"Install to Hard Drive\" in the "
+"You are currently running MSVSphere from live media.\n"
+"You can install MSVSphere now, or choose \"Install to Hard Drive\" in the "
"Activities Overview at any later time."
msgstr ""
-"Fedora запущена с установочного диска.\n"
-"Вы можете установить Fedora сейчас или в любое время выбрать «Установить на "
+"МСВСфера АРМ 9.4 запущена с установочного диска.\n"
+"Вы можете установить операционную систему сейчас или в любое время выбрать "
"жесткий диск» в меню «Обзор»."
#: data/liveinst/gnome/fedora-welcome.js:130
diff --git a/pyanaconda/product.py b/pyanaconda/product.py
index 9dbfe1f..140dbee 100644
--- a/pyanaconda/product.py
+++ b/pyanaconda/product.py
@@ -19,6 +19,7 @@
import configparser
import os
+import re
from pyanaconda.core.i18n import _
@@ -64,9 +65,42 @@ def trim_product_version_for_ui(version):
productVersion = trim_product_version_for_ui(productVersion)
+if productName.startswith("MSVSphere"):
+ productBase = "MSVSphere"
+ if productName == "MSVSphere Server" or \
+ (productName == "MSVSphere" and productVariant == "Minimal"):
+ productFlavor = "Server"
+ elif productName == "MSVSphere" and productVariant == "BaseOS":
+ productFlavor = "OS"
+ elif productName == "MSVSphere":
+ os_release = open("/etc/os-release", "r")
+ for line in os_release:
+ match = re.match("VERSION=.*\((.*?)\)", line)
+ if match:
+ productFlavor = match.group(1)
+ else:
+ productFlavor = "OS"
+else:
+ productBase = productName
+ productFlavor = None
+
def distributionText():
- return _("%(productName)s %(productVersion)s INSTALLATION") % {
+ if productBase == "MSVSphere" and productFlavor == "Server":
+ distro_text = _("MSVSphere %(productVersion)s Server INSTALLATION")
+ elif productBase == "MSVSphere" and productFlavor == "ARM":
+ distro_text = _("MSVSphere %(productVersion)s ARM INSTALLATION")
+ elif productBase == "MSVSphere" and productFlavor == "Cinnamon":
+ distro_text = _("MSVSphere %(productVersion)s Cinnamon INSTALLATION")
+ elif productBase == "MSVSphere" and productFlavor == "KDE":
+ distro_text = _("MSVSphere %(productVersion)s KDE INSTALLATION")
+ elif productBase == "MSVSphere" and productFlavor == "XFCE":
+ distro_text = _("MSVSphere %(productVersion)s XFCE INSTALLATION")
+ elif productBase == "MSVSphere" and productFlavor == "OS":
+ distro_text = _("MSVSphere %(productVersion)s OS INSTALLATION")
+ else:
+ distro_text = _("%(productName)s %(productVersion)s INSTALLATION")
+ return distro_text % {
"productName": productName.upper(),
"productVersion": productVersion.upper()
}
diff --git a/pyanaconda/ui/gui/spokes/installation_progress.py b/pyanaconda/ui/gui/spokes/installation_progress.py
index c2dfbaf..de1fe76 100644
--- a/pyanaconda/ui/gui/spokes/installation_progress.py
+++ b/pyanaconda/ui/gui/spokes/installation_progress.py
@@ -155,14 +155,14 @@ class ProgressSpoke(StandaloneSpoke):
# Set the reboot label.
if conf.target.is_hardware:
continue_text = _(
- "%s is now successfully installed and ready for you to use!\n"
+ "%(name)s is now successfully installed and ready for you to use!\n"
"Go ahead and reboot your system to start using it!"
- ) % productName
+ ) % {"name": productName}
else:
continue_text = _(
- "%s is now successfully installed and ready for you to use!\n"
+ "%(name)s is now successfully installed and ready for you to use!\n"
"Go ahead and quit the application to start using it!"
- ) % productName
+ ) % {"name": productName}
label = self.builder.get_object("rebootLabel")
label.set_text(continue_text)
diff --git a/pyanaconda/ui/gui/spokes/lib/accordion.py b/pyanaconda/ui/gui/spokes/lib/accordion.py
index 32801df..5e2e2b1 100644
--- a/pyanaconda/ui/gui/spokes/lib/accordion.py
+++ b/pyanaconda/ui/gui/spokes/lib/accordion.py
@@ -544,7 +544,7 @@ class CreateNewPage(BasePage):
)
self._createBox.attach(label, 0, 6, 2, 1)
- checkbox = Gtk.CheckButton(label="Encrypt my data.")
+ checkbox = Gtk.CheckButton(label=_("Encrypt my data."))
checkbox.connect("toggled", encrypted_changed_cb)
checkbox.set_active(default_encryption)
checkbox.set_margin_start(18)
diff --git a/pyanaconda/ui/gui/spokes/lib/storage_dialogs.py b/pyanaconda/ui/gui/spokes/lib/storage_dialogs.py
index 2f8338b..e330641 100644
--- a/pyanaconda/ui/gui/spokes/lib/storage_dialogs.py
+++ b/pyanaconda/ui/gui/spokes/lib/storage_dialogs.py
@@ -140,10 +140,10 @@ class NeedSpaceDialog(InstallOptionsDialogBase):
self._set_free_space_labels(disk_free, fs_free)
label_text = _("<b>You don't have enough space available to install "
- "%s</b>. You can shrink or remove existing partitions "
+ "%(name)s</b>. You can shrink or remove existing partitions "
"via our guided reclaim space tool, or you can adjust your "
"partitions on your own in the custom partitioning "
- "interface.") % escape_markup(productName)
+ "interface.") % {"name": escape_markup(productName)}
self.builder.get_object("need_space_options_label").set_markup(label_text)
self._add_modify_watcher(label)
diff --git a/pyanaconda/ui/gui/spokes/welcome.py b/pyanaconda/ui/gui/spokes/welcome.py
index de71615..7937f2c 100644
--- a/pyanaconda/ui/gui/spokes/welcome.py
+++ b/pyanaconda/ui/gui/spokes/welcome.py
@@ -35,7 +35,10 @@ from pyanaconda.ui.gui.spokes.lib.lang_locale_handler import LangLocaleHandler
from pyanaconda.ui.gui.spokes.lib.unsupported_hardware import UnsupportedHardwareDialog
from pyanaconda import localization
-from pyanaconda.product import distributionText, isFinal, productName, productVersion
+from pyanaconda.product import (
+ distributionText, isFinal, productName, productVersion, productBase,
+ productFlavor
+)
from pyanaconda import flags
from pyanaconda.core.i18n import _
from pyanaconda.core.util import ipmi_abort
@@ -206,7 +209,21 @@ class WelcomeLanguageSpoke(StandaloneSpoke, LangLocaleHandler):
# The welcome label is special - it has text that needs to be substituted.
welcomeLabel = self.builder.get_object("welcomeLabel")
- welcomeLabel.set_text(_("WELCOME TO %(name)s %(version)s.") %
+ if productBase == "MSVSphere" and productFlavor == "Server":
+ welcome_text = _("WELCOME TO MSVSphere %(version)s Server")
+ elif productBase == "MSVSphere" and productFlavor == "ARM":
+ welcome_text = _("WELCOME TO MSVSphere %(version)s ARM")
+ elif productBase == "MSVSphere" and productFlavor == "Cinnamon":
+ welcome_text = _("WELCOME TO MSVSphere %(version)s Cinnamon")
+ elif productBase == "MSVSphere" and productFlavor == "KDE":
+ welcome_text = _("WELCOME TO MSVSphere %(version)s KDE")
+ elif productBase == "MSVSphere" and productFlavor == "XFCE":
+ welcome_text = _("WELCOME TO MSVSphere %(version)s XFCE")
+ elif productBase == "MSVSphere" and productFlavor == "OS":
+ welcome_text = _("WELCOME TO MSVSphere %(version)s OS")
+ else:
+ welcome_text = _("WELCOME TO %(name)s %(version)s")
+ welcomeLabel.set_text(welcome_text %
{"name" : productName.upper(), "version" : productVersion}) # pylint: disable=no-member
# Retranslate the language (filtering) entry's placeholder text
diff --git a/pyanaconda/vnc.py b/pyanaconda/vnc.py
index 5fadcde..c349de8 100644
--- a/pyanaconda/vnc.py
+++ b/pyanaconda/vnc.py
@@ -76,7 +76,22 @@ class VncServer(object):
self.anaconda = None
self.log = get_stdout_logger()
- self.desktop = _("%(productName)s %(productVersion)s installation")\
+ is_sphere = product.productBase == "MSVSphere"
+ if is_sphere and product.productFlavor == "Server":
+ desktop_text = _("MSVSphere %(productVersion)s Server installation")
+ elif is_sphere and product.productFlavor == "ARM":
+ desktop_text = _("MSVSphere %(productVersion)s ARM installation")
+ elif is_sphere and product.productFlavor == "Cinnamon":
+ desktop_text = _("MSVSphere %(productVersion)s Cinnamon installation")
+ elif is_sphere and product.productFlavor == "KDE":
+ desktop_text = _("MSVSphere %(productVersion)s KDE installation")
+ elif is_sphere and product.productFlavor == "XFCE":
+ desktop_text = _("MSVSphere %(productVersion)s XFCE installation")
+ elif is_sphere and product.productFlavor == "OS":
+ desktop_text = _("MSVSphere %(productVersion)s OS installation")
+ else:
+ desktop_text = _("%(productName)s %(productVersion)s installation")
+ self.desktop = desktop_text \
% {'productName': product.productName,
'productVersion': product.productVersion}
@@ -145,8 +160,29 @@ class VncServer(object):
# figure out product info
if host:
- self.desktop = _("%(productName)s %(productVersion)s installation "
- "on host %(name)s") \
+ is_sphere = product.productBase == "MSVSphere"
+ if is_sphere and product.productFlavor == "Server":
+ desktop_text = _("MSVSphere %(productVersion)s Server "
+ "installation on host %(name)s")
+ elif is_sphere and product.productFlavor == "ARM":
+ desktop_text = _("MSVSphere %(productVersion)s ARM "
+ "installation on host %(name)s")
+ elif is_sphere and product.productFlavor == "Cinnamon":
+ desktop_text = _("MSVSphere %(productVersion)s Cinnamon "
+ "installation on host %(name)s")
+ elif is_sphere and product.productFlavor == "KDE":
+ desktop_text = _("MSVSphere %(productVersion)s KDE "
+ "installation on host %(name)s")
+ elif is_sphere and product.productFlavor == "XFCE":
+ desktop_text = _("MSVSphere %(productVersion)s XFCE "
+ "installation on host %(name)s")
+ elif is_sphere and product.productFlavor == "OS":
+ desktop_text = _("MSVSphere %(productVersion)s OS "
+ "installation on host %(name)s")
+ else:
+ desktop_text = _("%(productName)s %(productVersion)s "
+ "installation on host %(name)s")
+ self.desktop = desktop_text \
% {'productName': product.productName,
'productVersion': product.productVersion,
'name': host}
--
2.44.0

@ -0,0 +1,40 @@
From d89d1e6358188e8f3f3f595cc8af4d90dd78987e Mon Sep 17 00:00:00 2001
From: tigro <tigro@msvsphere-os.ru>
Date: Wed, 3 Apr 2024 10:12:41 +0300
Subject: [PATCH 12/15] Enable administrator by default
---
pyanaconda/ui/gui/spokes/user.glade | 1 +
pyanaconda/ui/lib/users.py | 4 +++-
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/pyanaconda/ui/gui/spokes/user.glade b/pyanaconda/ui/gui/spokes/user.glade
index 3d52a93..c070066 100644
--- a/pyanaconda/ui/gui/spokes/user.glade
+++ b/pyanaconda/ui/gui/spokes/user.glade
@@ -267,6 +267,7 @@
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
+ <property name="active">True</property>
<property name="tooltip-text" translatable="yes" context="GUI|User">Allow this user to run the 'sudo' command.</property>
<property name="use-underline">True</property>
<property name="xalign">0</property>
diff --git a/pyanaconda/ui/lib/users.py b/pyanaconda/ui/lib/users.py
index 2ea6a6f..a0cc1ec 100644
--- a/pyanaconda/ui/lib/users.py
+++ b/pyanaconda/ui/lib/users.py
@@ -79,7 +79,9 @@ def get_user_list(users_module, add_default=False, add_if_not_empty=False):
# we only add default user to an empty list, to add default user to
# a populated list the add_if_not_empty option needs to be used
if not user_data_list or add_if_not_empty:
- user_data_list.insert(0, UserData())
+ data = UserData()
+ data.set_admin_priviledges(True)
+ user_data_list.insert(0, data)
return user_data_list
--
2.44.0

File diff suppressed because it is too large Load Diff

@ -0,0 +1,130 @@
From db3ef1af1713398ef082b0c00875efefffe51d62 Mon Sep 17 00:00:00 2001
From: tigro <tigro@msvsphere-os.ru>
Date: Wed, 3 Apr 2024 10:27:12 +0300
Subject: [PATCH 14/15] Make branding free Russian translation
---
po/ru.po | 34 +++++++++++++++++-----------------
1 file changed, 17 insertions(+), 17 deletions(-)
diff --git a/po/ru.po b/po/ru.po
index 77dceed..0c1143b 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -845,7 +845,7 @@ msgid ""
"https://msvsphere-os.ru."
msgstr ""
"Это аппаратное обеспечение (или их комбинация) не поддерживается "
-"МСВСфера ОС. Для получения дополнительной информации о поддерживаемом "
+"операционной системой. Для получения дополнительной информации о поддерживаемом "
"оборудовании см. https://msvsphere-os.ru."
#: pyanaconda/core/constants.py:163
@@ -2027,7 +2027,7 @@ msgid ""
"recommended for a normal %(productName)s install."
msgstr ""
"Размер раздела %(mount)s меньше %(size)s, что меньше рекомендованного "
-"размера для обычной установки МСВСфера ОС."
+"размера для обычной установки операционной системы."
#: pyanaconda/modules/storage/checker/utils.py:131
#, python-format
@@ -3545,7 +3545,7 @@ msgid ""
"You haven't created any mount points for your %(product)s %(version)s "
"installation yet. You can:"
msgstr ""
-"Вы еще не создали точки монтирования для установки МСВСфера ОС %(version)s. "
+"Вы еще не создали точки монтирования для установки операционной системы. "
"Вы можете:"
#: pyanaconda/ui/gui/spokes/lib/accordion.py:479
@@ -3592,7 +3592,7 @@ msgid ""
"of available space, including <b>%(software)s</b> for software and "
"<b>%(swap)s</b> for swap space."
msgstr ""
-"Для установки <b>МСВСфера ОС</b> требуется <b>%(total)s</b>, в том числе "
+"Для установки <b>операционной системы</b> требуется <b>%(total)s</b>, в том числе "
"<b>%(software)s</b> для программ и <b>%(swap)s</b> для подкачки."
#: pyanaconda/ui/gui/spokes/lib/storage_dialogs.py:81
@@ -3602,8 +3602,8 @@ msgid ""
"selection</a> requires <b>%(total)s</b> of available space, including "
"<b>%(software)s</b> for software and <b>%(swap)s</b> for swap space."
msgstr ""
-"Для <a href=\"\" title=\"%(tooltip)s\">программного обеспечения "
-"<b>МСВСфера ОС</b></a> требуется <b>%(total)s</b> пространства, в том числе "
+"Для <a href=\"\" title=\"%(tooltip)s\">установки "
+"<b>операционной системы</b></a> требуется <b>%(total)s</b> пространства, в том числе "
"<b>%(software)s</b> для программ и <b>%(swap)s</b> для подкачки."
#: pyanaconda/ui/gui/spokes/lib/storage_dialogs.py:132
@@ -3618,7 +3618,7 @@ msgid ""
"or remove existing partitions via our guided reclaim space tool, or you can "
"adjust your partitions on your own in the custom partitioning interface."
msgstr ""
-"<b>Недостаточно места для установки %(name)s</b>. Можно уменьшить или удалить "
+"<b>Недостаточно места для установки операционной системы</b>. Можно уменьшить или удалить "
"существующие разделы с помощью помощника или самостоятельно выбрать размеры "
"разделов в окне настройки разделов."
@@ -3628,7 +3628,7 @@ msgid ""
" You don't have enough space available to install <b>%(product)s</b>, even "
"if you used all of the free space available on the selected disks."
msgstr ""
-" Недостаточно места для установки <b>МСВСфера ОС</b>, даже если "
+" Недостаточно места для установки <b>операционной системы</b>, даже если "
"использовать все свободное место на выбранных дисках."
#: pyanaconda/ui/gui/spokes/lib/storage_dialogs.py:178
@@ -3639,10 +3639,10 @@ msgid ""
"could add more disks for additional space, modify your software selection to "
"install a smaller version of <b>%(productName)s</b>, or quit the installer."
msgstr ""
-"<b>Недостаточно места для установки МСВСфера ОС</b>, даже если "
+"<b>Недостаточно места для установки операционной системы</b>, даже если "
"использовать всё свободное место на выбранных дисках. Можно добавить ещё "
"диски, чтобы получить дополнительное место, изменить выбор программного "
-"обеспечения, чтобы установить меньший вариант <b>МСВСфера ОС</b>, или "
+"обеспечения, чтобы установить меньший вариант <b>системы</b>, или "
"покинуть программу установки."
#: pyanaconda/ui/gui/spokes/lib/subscription.py:66
@@ -4190,7 +4190,7 @@ msgid ""
"you'll be able to view their details here."
msgstr ""
"Здесь будет показана информация о созданных точках монтирования для "
-"установки МСВСфера %(version)s OC."
+"установки операционной системы."
#: pyanaconda/ui/gui/spokes/custom_storage.py:615
#: pyanaconda/ui/gui/spokes/advstorage/nvdimm.glade:178
@@ -4603,20 +4603,20 @@ msgstr "_Завершить установку"
#: pyanaconda/ui/gui/spokes/installation_progress.py:158
#, python-format
msgid ""
-"%s is now successfully installed and ready for you to use!\n"
+"%(name)s is now successfully installed and ready for you to use!\n"
"Go ahead and reboot your system to start using it!"
msgstr ""
-"МСВСфера ОС установлена и готова к работе.\n"
-"Необходимо перезагрузить систему чтобы приступить к использованию."
+"Операционная система установлена и готова к работе.\n"
+"Необходимо перезагрузить компьютер, чтобы приступить к использованию."
#: pyanaconda/ui/gui/spokes/installation_progress.py:163
#, python-format
msgid ""
-"%s is now successfully installed and ready for you to use!\n"
+"%(name)s is now successfully installed and ready for you to use!\n"
"Go ahead and quit the application to start using it!"
msgstr ""
-"МСВСфера ОС установлена и готова к работе.\n"
-"Необходимо выйти из приложения чтобы приступить к использованию."
+"Операционная система установлена и готова к работе.\n"
+"Необходимо выйти из приложения, чтобы приступить к использованию."
#: pyanaconda/ui/gui/spokes/installation_source.py:73
msgid "Setting up installation source..."
--
2.44.0

@ -0,0 +1,98 @@
From 667ff8db6e0a78ee05cf41b768da8ec8fbc23858 Mon Sep 17 00:00:00 2001
From: tigro <tigro@msvsphere-os.ru>
Date: Mon, 25 Dec 2023 14:51:32 +0300
Subject: [PATCH 15/15] Drop sphere url
---
po/ru.po | 16 ++++++++--------
pyanaconda/core/constants.py | 6 +++---
2 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/po/ru.po b/po/ru.po
index f9ad24e..4619491 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -463,11 +463,11 @@ msgstr ""
msgid ""
"This hardware (or a combination thereof) is not supported by MSVSphere. "
"For more information on supported hardware, please refer to "
-"https://msvsphere-os.ru."
+"documentation."
msgstr ""
"Это аппаратное обеспечение (или их комбинация) не поддерживается "
"операционной системой. Для получения дополнительной информации о поддерживаемом "
-"оборудовании см. https://msvsphere-os.ru."
+"оборудовании см. документацию."
#: pyanaconda/core/constants.py:163
msgid ""
@@ -486,29 +486,29 @@ msgid ""
"Simultaneous Multithreading (SMT) technology can provide performance "
"improvements for certain workloads, but introduces several publicly "
"disclosed security issues. You have the option of disabling SMT, which may "
-"impact performance. If you choose to leave SMT enabled, please read https://"
-"docs.msvsphere-os.ru/knowledge-base/security/smt.html to understand your potential risks and learn about other "
+"impact performance. If you choose to leave SMT enabled, please read "
+"documentation to understand your potential risks and learn about other "
"ways to mitigate these risks."
msgstr ""
"Технология одновременной многопоточности (SMT) может обеспечить повышение "
"производительности при определенных рабочих нагрузках, но привносит "
"несколько известных проблем безопасности. Вы можете отключить SMT, что может "
"повлиять на производительность. Если вы решите оставить SMT включенным, "
-"прочитайте https://docs.msvsphere-os.ru/knowledge-base/security/smt.html для понимания потенциальных рисков и "
+"прочитайте документацию для понимания потенциальных рисков и "
"чтобы узнать о других способах снижения этих рисков."
#: pyanaconda/core/constants.py:183
msgid ""
"Simultaneous Multithreading (SMT) may improve performance for certain "
"workloads, but introduces several publicly disclosed security issues. You "
-"can disable SMT, which may impact performance. Please read https://docs.msvsphere-os.ru/"
-"knowledge-base/security/smt.html to understand potential risks and learn about ways to mitigate "
+"can disable SMT, which may impact performance. Please read "
+"documentation to understand potential risks and learn about ways to mitigate "
"these risks."
msgstr ""
"Одновременная многопоточность (SMT) может увеличить производительность при "
"определенных рабочих нагрузках, но привносит несколько известных проблем "
"безопасности. Можно отключить SMT, что может повлиять на производительность. "
-"Прочитайте https://docs.msvsphere-os.ru/knowledge-base/security/smt.html для понимания потенциальных рисков и "
+"Прочитайте документацию для понимания потенциальных рисков и "
"чтобы узнать о способах снижения этих рисков."
#: pyanaconda/core/constants.py:199
diff --git a/pyanaconda/core/constants.py b/pyanaconda/core/constants.py
index b00c276..1b6aee3 100644
--- a/pyanaconda/core/constants.py
+++ b/pyanaconda/core/constants.py
@@ -161,7 +161,7 @@ WARNING_SUPPORT_REMOVED = N_(
WARNING_HARDWARE_UNSUPPORTED = N_(
"This hardware (or a combination thereof) is not supported by MSVSphere. For more information "
- "on supported hardware, please refer to https://msvsphere-os.ru."
+ "on supported hardware, please refer to documentation."
)
# Storage messages
@@ -180,7 +180,7 @@ WARNING_SMT_ENABLED_GUI = N_(
"improvements for certain workloads, but introduces several publicly "
"disclosed security issues. You have the option of disabling SMT, which "
"may impact performance. If you choose to leave SMT enabled, please read "
- "https://docs.msvsphere-os.ru/knowledge-base/security/smt.html to understand your potential risks and learn "
+ "documentation to understand your potential risks and learn "
"about other ways to mitigate these risks."
)
@@ -189,7 +189,7 @@ WARNING_SMT_ENABLED_TUI = N_(
"Simultaneous Multithreading (SMT) may improve performance for certain "
"workloads, but introduces several publicly disclosed security issues. "
"You can disable SMT, which may impact performance. Please read "
- "https://docs.msvsphere-os.ru/knowledge-base/security/smt.html to understand potential risks and learn about "
+ "documentation to understand potential risks and learn about "
"ways to mitigate these risks."
)
--
2.43.0

@ -0,0 +1,25 @@
From b9fe4624a8f34bac765fd2788abebfec429cc0a2 Mon Sep 17 00:00:00 2001
From: tigro <tigro@msvsphere-os.ru>
Date: Mon, 12 Aug 2024 12:29:06 +0300
Subject: [PATCH 16/16] Set LatGrkCyr-8x16 as default font instead of eurlatgr
---
pyanaconda/core/constants.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pyanaconda/core/constants.py b/pyanaconda/core/constants.py
index 78577cb..0bd5227 100644
--- a/pyanaconda/core/constants.py
+++ b/pyanaconda/core/constants.py
@@ -78,7 +78,7 @@ DEFAULT_LANG = "ru_RU.UTF-8"
# we use Russian by default for UI
DEFAULT_HELP_LANG = "en_US.UTF-8"
-DEFAULT_VC_FONT = "eurlatgr"
+DEFAULT_VC_FONT = "LatGrkCyr-8x16"
DEFAULT_KEYBOARD = "us"
--
2.46.0

@ -0,0 +1,488 @@
From 2716b292b9d42961222fd645c6b2d281d46d6688 Mon Sep 17 00:00:00 2001
From: Dmitry Samoylik <Dmitriy.Samoylik@softline.com>
Date: Thu, 26 Sep 2024 16:57:48 +0300
Subject: [PATCH] Implement show EULA before installation
---
data/anaconda.conf | 4 +-
pyanaconda/core/configuration/license.py | 2 -
pyanaconda/core/eula.py | 23 ++++
pyanaconda/ui/categories/eula.py | 14 +++
pyanaconda/ui/gui/spokes/eula.glade | 136 +++++++++++++++++++++++
pyanaconda/ui/gui/spokes/eula.py | 107 ++++++++++++++++++
pyanaconda/ui/tui/spokes/eula.py | 128 +++++++++++++++++++++
7 files changed, 409 insertions(+), 5 deletions(-)
create mode 100644 pyanaconda/core/eula.py
create mode 100644 pyanaconda/ui/categories/eula.py
create mode 100644 pyanaconda/ui/gui/spokes/eula.glade
create mode 100644 pyanaconda/ui/gui/spokes/eula.py
create mode 100644 pyanaconda/ui/tui/spokes/eula.py
diff --git a/data/anaconda.conf b/data/anaconda.conf
index b5878e3..c15e99d 100644
--- a/data/anaconda.conf
+++ b/data/anaconda.conf
@@ -308,9 +308,7 @@ password_policies =
# If the given distribution has an EULA & feels the need to
# tell the user about it fill in this variable by a path
# pointing to a file with the EULA on the installed system.
-#
-# This is currently used just to show the path to the file to
-# the user at the end of the installation.
+
eula =
diff --git a/pyanaconda/core/configuration/license.py b/pyanaconda/core/configuration/license.py
index 04c44bf..a51f52a 100644
--- a/pyanaconda/core/configuration/license.py
+++ b/pyanaconda/core/configuration/license.py
@@ -31,7 +31,5 @@ class LicenseSection(Section):
tell the user about it fill in this variable by a path
pointing to a file with the EULA on the installed system.
- This is currently used just to show the path to the file to
- the user at the end of the installation.
"""
return self._get_option("eula", str)
diff --git a/pyanaconda/core/eula.py b/pyanaconda/core/eula.py
new file mode 100644
index 0000000..15a393e
--- /dev/null
+++ b/pyanaconda/core/eula.py
@@ -0,0 +1,23 @@
+import os
+from pyanaconda.core.configuration.anaconda import conf
+
+def get_license_file_name():
+ """Get filename of the license file best matching current localization settings.
+ :return: filename of the license file or None if no license file found
+ :rtype: str or None
+ """
+ if not conf.license.eula:
+ return None
+
+ if not os.path.exists(conf.license.eula):
+ return None
+
+ return conf.license.eula
+
+
+def eula_available():
+ """Report if it looks like there is an EULA available on the system.
+ :return: True if an EULA seems to be available, False otherwise
+ :rtype: bool
+ """
+ return bool(get_license_file_name())
diff --git a/pyanaconda/ui/categories/eula.py b/pyanaconda/ui/categories/eula.py
new file mode 100644
index 0000000..0a4fe96
--- /dev/null
+++ b/pyanaconda/ui/categories/eula.py
@@ -0,0 +1,14 @@
+from pyanaconda.ui.categories import SpokeCategory
+from pyanaconda.core.i18n import _
+
+__all__ = ["LicensingCategory"]
+
+class LicensingCategory(SpokeCategory):
+
+ @staticmethod
+ def get_title():
+ return _("LICENSING")
+
+ @staticmethod
+ def get_sort_order():
+ return 900
diff --git a/pyanaconda/ui/gui/spokes/eula.glade b/pyanaconda/ui/gui/spokes/eula.glade
new file mode 100644
index 0000000..1d340f0
--- /dev/null
+++ b/pyanaconda/ui/gui/spokes/eula.glade
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.6 -->
+ <!-- interface-requires AnacondaWidgets 1.0 -->
+ <object class="GtkTextBuffer" id="eulaBuffer">
+ <property name="text">The license will go here</property>
+ </object>
+ <object class="AnacondaSpokeWindow" id="eulaWindow">
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="window_name" translatable="yes">License Information</property>
+ <signal name="button-clicked" handler="on_back_clicked" swapped="no"/>
+ <child internal-child="main_box">
+ <object class="GtkBox" id="AnacondaSpokeWindow-main_box1">
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child internal-child="nav_box">
+ <object class="GtkEventBox" id="AnacondaSpokeWindow-nav_box1">
+ <property name="can_focus">False</property>
+ <child internal-child="nav_area">
+ <object class="GtkGrid" id="AnacondaSpokeWindow-nav_area1">
+ <property name="can_focus">False</property>
+ <property name="margin_left">6</property>
+ <property name="margin_right">6</property>
+ <property name="margin_top">6</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child internal-child="alignment">
+ <object class="GtkAlignment" id="AnacondaSpokeWindow-alignment1">
+ <property name="can_focus">False</property>
+ <property name="xscale">0.8</property>
+ <property name="yscale">0.8</property>
+ <child internal-child="action_area">
+ <object class="GtkBox" id="mainBox">
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="licenseAgreementLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="margin_top">24</property>
+ <property name="margin_bottom">6</property>
+ <property name="label" translatable="yes">License Agreement:</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="eulaBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkScrolledWindow" id="eulaScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTextView" id="eulaView">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="margin_bottom">18</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="vscroll_policy">natural</property>
+ <property name="pixels_above_lines">12</property>
+ <property name="editable">False</property>
+ <property name="wrap_mode">word</property>
+ <property name="left_margin">12</property>
+ <property name="right_margin">12</property>
+ <property name="cursor_visible">False</property>
+ <property name="buffer">eulaBuffer</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="agreeCheckButton">
+ <property name="label" translatable="yes">I _accept the license agreement</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="xalign">0</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_check_button_toggled" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/pyanaconda/ui/gui/spokes/eula.py b/pyanaconda/ui/gui/spokes/eula.py
new file mode 100644
index 0000000..a487c6b
--- /dev/null
+++ b/pyanaconda/ui/gui/spokes/eula.py
@@ -0,0 +1,107 @@
+import logging
+
+from pyanaconda.ui.common import FirstbootOnlySpokeMixIn
+from pyanaconda.ui.gui.spokes import NormalSpoke
+from pyanaconda.core.i18n import _, CN_
+from pyanaconda.core import eula
+from pyanaconda.ui.categories.eula import LicensingCategory
+from pyanaconda.anaconda_loggers import get_module_logger
+from pykickstart.constants import FIRSTBOOT_RECONFIG
+
+log = get_module_logger(__name__)
+__all__ = ["EULASpoke"]
+
+
+class EULASpoke(FirstbootOnlySpokeMixIn, NormalSpoke):
+ """The EULA spoke"""
+
+ builderObjects = ["eulaBuffer", "eulaWindow"]
+ mainWidgetName = "eulaWindow"
+ uiFile = "spokes/eula.glade"
+ icon = "application-certificate-symbolic"
+ title = CN_("GUI|Spoke", "_License Information")
+ category = LicensingCategory
+
+ @staticmethod
+ def get_screen_id():
+ """Return a unique id of this UI screen."""
+ return "license-information"
+
+ def initialize(self):
+ log.debug("initializing the EULA spoke")
+ NormalSpoke.initialize(self)
+
+ self._have_eula = True
+ self._eula_buffer = self.builder.get_object("eulaBuffer")
+ self._agree_check_button = self.builder.get_object("agreeCheckButton")
+ self._agree_label = self._agree_check_button.get_child()
+ self._agree_text = self._agree_label.get_text()
+
+ log.debug("looking for the license file")
+ license_file = eula.get_license_file_name()
+ if not license_file:
+ log.error("no license found")
+ self._have_eula = False
+ self._eula_buffer.set_text(_("No license found"))
+ return
+
+ # if there is "eula <...>" in kickstart, use its value
+ if self.data.eula.agreed is not None:
+ self._agree_check_button.set_active(self.data.eula.agreed)
+
+ self._eula_buffer.set_text("")
+ itr = self._eula_buffer.get_iter_at_offset(0)
+ log.debug("opening the license file")
+ with open(license_file, "r") as fobj:
+ # insert the first line without prefixing with space
+ try:
+ first_line = next(fobj)
+ except StopIteration:
+ # nothing in the file
+ return
+ self._eula_buffer.insert(itr, first_line.strip())
+
+ # EULA file may be preformatted for the console, we want to let Gtk
+ # format it (blank lines should be preserved)
+ for line in fobj:
+ stripped_line = line.strip()
+ if stripped_line:
+ self._eula_buffer.insert(itr, " " + stripped_line)
+ else:
+ self._eula_buffer.insert(itr, "\n\n")
+
+ def refresh(self):
+ self._agree_check_button.set_sensitive(self._have_eula)
+ self._agree_check_button.set_active(self.data.eula.agreed)
+
+ def apply(self):
+ self.data.eula.agreed = self._agree_check_button.get_active()
+
+ @property
+ def completed(self):
+ return not self._have_eula or self.data.eula.agreed
+
+ @property
+ def status(self):
+ if not self._have_eula:
+ return _("No license found")
+
+ return _("License accepted") if self.data.eula.agreed else _("License not accepted")
+
+ @classmethod
+ def should_run(cls, environment, data):
+ if eula.eula_available():
+ # don't run if we are in initial-setup in reconfig mode and the EULA has already been accepted
+ if FirstbootOnlySpokeMixIn.should_run(environment, data) and data and data.firstboot.firstboot == FIRSTBOOT_RECONFIG and data.eula.agreed:
+ log.debug("not running license spoke: reconfig mode & license already accepted")
+ return False
+ return True
+ return False
+
+ def on_check_button_toggled(self, *args):
+ if self._agree_check_button.get_active():
+ log.debug("license is now accepted")
+ self._agree_label.set_markup("<b>%s</b>" % self._agree_text)
+ else:
+ log.debug("license no longer accepted")
+ self._agree_label.set_markup(self._agree_text)
diff --git a/pyanaconda/ui/tui/spokes/eula.py b/pyanaconda/ui/tui/spokes/eula.py
new file mode 100644
index 0000000..a3e8e62
--- /dev/null
+++ b/pyanaconda/ui/tui/spokes/eula.py
@@ -0,0 +1,128 @@
+import logging
+
+from pyanaconda.ui.tui.spokes import NormalTUISpoke
+from simpleline.render.widgets import TextWidget, CheckboxWidget
+from simpleline.render.containers import ListRowContainer
+from simpleline.render.screen import UIScreen, InputState
+from simpleline.render.screen_handler import ScreenHandler
+from pyanaconda.ui.common import FirstbootOnlySpokeMixIn
+from pyanaconda.core import eula
+from pyanaconda.ui.categories.eula import LicensingCategory
+from pyanaconda.core.i18n import _, N_
+from pykickstart.constants import FIRSTBOOT_RECONFIG
+
+log = logging.getLogger("initial-setup")
+
+__all__ = ["EULASpoke"]
+
+
+class EULASpoke(FirstbootOnlySpokeMixIn, NormalTUISpoke):
+ """The EULA spoke providing ways to read the license and agree/disagree with it."""
+
+ category = LicensingCategory
+
+ @staticmethod
+ def get_screen_id():
+ """Return a unique id of this UI screen."""
+ return "license-information"
+
+ def __init__(self, *args, **kwargs):
+ NormalTUISpoke.__init__(self, *args, **kwargs)
+ self.title = _("License information")
+ self._container = None
+
+ def initialize(self):
+ NormalTUISpoke.initialize(self)
+
+ def refresh(self, args=None):
+ NormalTUISpoke.refresh(self, args)
+
+ self._container = ListRowContainer(1)
+
+ log.debug("license found")
+ # make the options aligned to the same column (the checkbox has the
+ # '[ ]' prepended)
+ self._container.add(TextWidget("%s\n" % _("Read the License Agreement")),
+ self._show_license_screen_callback)
+
+ self._container.add(CheckboxWidget(title=_("I accept the license agreement"),
+ completed=self.data.eula.agreed),
+ self._license_accepted_callback)
+ self.window.add_with_separator(self._container)
+
+ @property
+ def completed(self):
+ # Either there is no EULA available, or user agrees/disagrees with it.
+ return self.data.eula.agreed
+
+ @property
+ def mandatory(self):
+ # This spoke is always mandatory.
+ return True
+
+ @property
+ def status(self):
+ return _("License accepted") if self.data.eula.agreed else _("License not accepted")
+
+ @classmethod
+ def should_run(cls, environment, data):
+ if eula.eula_available():
+ # don't run if we are in initial-setup in reconfig mode and the EULA has already been accepted
+ if FirstbootOnlySpokeMixIn.should_run(environment, data) and data and data.firstboot.firstboot == FIRSTBOOT_RECONFIG and data.eula.agreed:
+ log.debug("not running license spoke: reconfig mode & license already accepted")
+ return False
+ return True
+ return False
+
+ def apply(self):
+ # nothing needed here, the agreed field is changed in the input method
+ pass
+
+ def input(self, args, key):
+ if not self._container.process_user_input(key):
+ return key
+
+ return InputState.PROCESSED
+
+ @staticmethod
+ def _show_license_screen_callback(data):
+ # show license
+ log.debug("showing the license")
+ eula_screen = LicenseScreen()
+ ScreenHandler.push_screen(eula_screen)
+
+ def _license_accepted_callback(self, data):
+ # toggle EULA agreed checkbox by changing ksdata
+ log.debug("license accepted state changed to: %s", self.data.eula.agreed)
+ self.data.eula.agreed = not self.data.eula.agreed
+ self.redraw()
+
+
+class LicenseScreen(UIScreen):
+ """Screen showing the License without any input from user requested."""
+
+ def __init__(self):
+ super().__init__()
+
+ self._license_file = eula.get_license_file_name()
+
+ def refresh(self, args=None):
+ super().refresh(args)
+
+ # read the license file and make it one long string so that it can be
+ # processed by the TextWidget to fit in the screen in a best possible
+ # way
+ log.debug("reading the license file")
+ with open(self._license_file, 'r') as f:
+ license_text = f.read()
+
+ self.window.add_with_separator(TextWidget(license_text))
+
+ def input(self, args, key):
+ """ Handle user input. """
+ return InputState.PROCESSED_AND_CLOSE
+
+ def prompt(self, args=None):
+ # we don't want to prompt user, just close the screen
+ self.close()
+ return None
--
2.39.2

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save