Compare commits

...

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

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

2
.gitignore vendored

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

@ -1,17 +1,17 @@
From 8454ae65d1f7cb2f0221a33fd223c2b460c27017 Mon Sep 17 00:00:00 2001 From 4d59d92ea86ed70866896bfdbf49a83b162016be Mon Sep 17 00:00:00 2001
From: Eugene Zamriy <eugene@zamriy.info> From: tigro <tigro@msvsphere-os.ru>
Date: Fri, 14 Apr 2023 12:53:14 +0300 Date: Tue, 19 Dec 2023 11:24:22 +0300
Subject: [PATCH 01/15] Disable subscription Subject: [PATCH 01/14] Disable subscription
--- ---
pyanaconda/ui/gui/spokes/subscription.py | 4 ++++ pyanaconda/ui/gui/spokes/subscription.py | 4 ++++
1 file changed, 4 insertions(+) 1 file changed, 4 insertions(+)
diff --git a/pyanaconda/ui/gui/spokes/subscription.py b/pyanaconda/ui/gui/spokes/subscription.py diff --git a/pyanaconda/ui/gui/spokes/subscription.py b/pyanaconda/ui/gui/spokes/subscription.py
index 4d03689..3b0e6c0 100644 index f4ee772..27d6b42 100644
--- a/pyanaconda/ui/gui/spokes/subscription.py --- a/pyanaconda/ui/gui/spokes/subscription.py
+++ b/pyanaconda/ui/gui/spokes/subscription.py +++ b/pyanaconda/ui/gui/spokes/subscription.py
@@ -551,6 +551,10 @@ class SubscriptionSpoke(NormalSpoke): @@ -547,6 +547,10 @@ class SubscriptionSpoke(NormalSpoke):
# also set the spoke warning banner # also set the spoke warning banner
self.show_warning_message(error_message) self.show_warning_message(error_message)
@ -23,5 +23,5 @@ index 4d03689..3b0e6c0 100644
NormalSpoke.initialize(self) NormalSpoke.initialize(self)
self.initialize_start() self.initialize_start()
-- --
2.44.0 2.39.3

@ -1,17 +1,17 @@
From 3e3d00cc21ab256eb55c5e5176f66cd7a348c111 Mon Sep 17 00:00:00 2001 From 2013ba5f3258e388864d0dd47d49cf5c05308867 Mon Sep 17 00:00:00 2001
From: Eugene Zamriy <eugene@zamriy.info> From: tigro <tigro@msvsphere-os.ru>
Date: Fri, 14 Apr 2023 12:54:58 +0300 Date: Tue, 19 Dec 2023 11:25:09 +0300
Subject: [PATCH 02/15] Hide CDN source button Subject: [PATCH 02/14] Hide CDN source button
--- ---
pyanaconda/ui/gui/spokes/installation_source.py | 2 ++ pyanaconda/ui/gui/spokes/installation_source.py | 2 ++
1 file changed, 2 insertions(+) 1 file changed, 2 insertions(+)
diff --git a/pyanaconda/ui/gui/spokes/installation_source.py b/pyanaconda/ui/gui/spokes/installation_source.py diff --git a/pyanaconda/ui/gui/spokes/installation_source.py b/pyanaconda/ui/gui/spokes/installation_source.py
index c467bd3..398ac11 100644 index d0d4da7..4d1c659 100644
--- a/pyanaconda/ui/gui/spokes/installation_source.py --- a/pyanaconda/ui/gui/spokes/installation_source.py
+++ b/pyanaconda/ui/gui/spokes/installation_source.py +++ b/pyanaconda/ui/gui/spokes/installation_source.py
@@ -798,6 +798,8 @@ class SourceSpoke(NormalSpoke, GUISpokeInputCheckHandler, SourceSwitchHandler): @@ -704,6 +704,8 @@ class SourceSpoke(NormalSpoke, GUISpokeInputCheckHandler, SourceSwitchHandler):
self._network_button = self.builder.get_object("networkRadioButton") self._network_button = self.builder.get_object("networkRadioButton")
self._network_box = self.builder.get_object("networkBox") self._network_box = self.builder.get_object("networkBox")
@ -21,5 +21,5 @@ index c467bd3..398ac11 100644
self._protocol_combo_box = self.builder.get_object("protocolComboBox") self._protocol_combo_box = self.builder.get_object("protocolComboBox")
self._iso_chooser_button = self.builder.get_object("isoChooserButton") self._iso_chooser_button = self.builder.get_object("isoChooserButton")
-- --
2.44.0 2.39.3

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

@ -1,17 +1,17 @@
From 18fcf71d53a8c476c55076f8a0e8db0904a51670 Mon Sep 17 00:00:00 2001 From c8221db2c44911d38a06e91c203d791ef07c841c Mon Sep 17 00:00:00 2001
From: Eugene Zamriy <evgeniy.zamriy@softline.com> From: tigro <tigro@msvsphere-os.ru>
Date: Fri, 28 Jul 2023 23:47:23 +0300 Date: Tue, 19 Dec 2023 11:28:41 +0300
Subject: [PATCH 04/15] Add Minimal and Server repository support Subject: [PATCH 04/14] Add Minimal and Server repository support
--- ---
pyanaconda/core/constants.py | 4 +++- pyanaconda/core/constants.py | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-) 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/pyanaconda/core/constants.py b/pyanaconda/core/constants.py diff --git a/pyanaconda/core/constants.py b/pyanaconda/core/constants.py
index 1496f8c..72a9d39 100644 index 0ab2627..bcc5270 100644
--- a/pyanaconda/core/constants.py --- a/pyanaconda/core/constants.py
+++ b/pyanaconda/core/constants.py +++ b/pyanaconda/core/constants.py
@@ -58,7 +58,9 @@ DEFAULT_REPOS = [productName.split('-')[0].lower(), @@ -61,7 +61,9 @@ DEFAULT_REPOS = [productName.split('-')[0].lower(),
"fedora-modular-server", "fedora-modular-server",
"rawhide", "rawhide",
"BaseOS", # Used by RHEL "BaseOS", # Used by RHEL
@ -20,8 +20,8 @@ index 1496f8c..72a9d39 100644
+ "Server", # Used by MSVSphere + "Server", # Used by MSVSphere
+ "Minimal"] # Used by MSVSphere + "Minimal"] # Used by MSVSphere
DBUS_ANACONDA_SESSION_ADDRESS = "DBUS_ANACONDA_SESSION_BUS_ADDRESS" # Get list of repo names which should be used as updates repos
DEFAULT_UPDATE_REPOS = ["updates",
-- --
2.44.0 2.39.3

@ -1,7 +1,7 @@
From 590d0e07d420aa32e69d23e1d70211ceaf35aa1f Mon Sep 17 00:00:00 2001 From e661a97359b307477babe614b6f48f3c9a0c99d8 Mon Sep 17 00:00:00 2001
From: tigro <tigro@msvsphere-os.ru> From: tigro <tigro@msvsphere-os.ru>
Date: Wed, 3 Apr 2024 09:41:32 +0300 Date: Tue, 19 Dec 2023 11:34:46 +0300
Subject: [PATCH 05/15] Set default timezone to Europe/Moscow Subject: [PATCH 05/14] Set default timezone to Europe/Moscow
--- ---
pyanaconda/modules/timezone/installation.py | 4 ++-- pyanaconda/modules/timezone/installation.py | 4 ++--
@ -10,7 +10,7 @@ Subject: [PATCH 05/15] Set default timezone to Europe/Moscow
3 files changed, 4 insertions(+), 4 deletions(-) 3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/pyanaconda/modules/timezone/installation.py b/pyanaconda/modules/timezone/installation.py diff --git a/pyanaconda/modules/timezone/installation.py b/pyanaconda/modules/timezone/installation.py
index fcd04d1..88ac7b5 100644 index a766000..fd7fa5b 100644
--- a/pyanaconda/modules/timezone/installation.py --- a/pyanaconda/modules/timezone/installation.py
+++ b/pyanaconda/modules/timezone/installation.py +++ b/pyanaconda/modules/timezone/installation.py
@@ -67,8 +67,8 @@ class ConfigureTimezoneTask(Task): @@ -67,8 +67,8 @@ class ConfigureTimezoneTask(Task):
@ -25,25 +25,25 @@ index fcd04d1..88ac7b5 100644
def _make_timezone_symlink(self): def _make_timezone_symlink(self):
"""Create the symlink that actually defines timezone.""" """Create the symlink that actually defines timezone."""
diff --git a/pyanaconda/modules/timezone/timezone.py b/pyanaconda/modules/timezone/timezone.py diff --git a/pyanaconda/modules/timezone/timezone.py b/pyanaconda/modules/timezone/timezone.py
index ac5318c..42e0cfe 100644 index b0fedc4..9782ee7 100644
--- a/pyanaconda/modules/timezone/timezone.py --- a/pyanaconda/modules/timezone/timezone.py
+++ b/pyanaconda/modules/timezone/timezone.py +++ b/pyanaconda/modules/timezone/timezone.py
@@ -46,7 +46,7 @@ class TimezoneService(KickstartService): @@ -39,7 +39,7 @@ class TimezoneService(KickstartService):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.timezone_changed = Signal() self.timezone_changed = Signal()
- self._timezone = "America/New_York" - self._timezone = "America/New_York"
+ self._timezone = "Europe/Moscow" + self._timezone = "Europe/Moscow"
self._priority = TIMEZONE_PRIORITY_DEFAULT
self.geolocation_result_changed = Signal() self.is_utc_changed = Signal()
self._is_utc = False
diff --git a/pyanaconda/ui/gui/spokes/datetime_spoke.py b/pyanaconda/ui/gui/spokes/datetime_spoke.py diff --git a/pyanaconda/ui/gui/spokes/datetime_spoke.py b/pyanaconda/ui/gui/spokes/datetime_spoke.py
index 117dfe3..f35bab1 100644 index bf60750..9dd25ed 100644
--- a/pyanaconda/ui/gui/spokes/datetime_spoke.py --- a/pyanaconda/ui/gui/spokes/datetime_spoke.py
+++ b/pyanaconda/ui/gui/spokes/datetime_spoke.py +++ b/pyanaconda/ui/gui/spokes/datetime_spoke.py
@@ -70,7 +70,7 @@ SERVER_WORKING = 3 @@ -67,7 +67,7 @@ SERVER_POOL = 1
SERVER_USE = 4 SERVER_WORKING = 2
SERVER_OBJECT = 5 SERVER_USE = 3
-DEFAULT_TZ = "America/New_York" -DEFAULT_TZ = "America/New_York"
+DEFAULT_TZ = "Europe/Moscow" +DEFAULT_TZ = "Europe/Moscow"
@ -51,5 +51,5 @@ index 117dfe3..f35bab1 100644
SPLIT_NUMBER_SUFFIX_RE = re.compile(r'([^0-9]*)([-+])([0-9]+)') SPLIT_NUMBER_SUFFIX_RE = re.compile(r'([^0-9]*)([-+])([0-9]+)')
-- --
2.44.0 2.39.3

@ -1,19 +1,20 @@
From 0fc5e241d84cb01bbaf93bba4e400d2f06b372c9 Mon Sep 17 00:00:00 2001 From 96287b6d95bcf8490311ab96154fb1588432132f Mon Sep 17 00:00:00 2001
From: Eugene Zamriy <eugene@zamriy.info> From: tigro <tigro@msvsphere-os.ru>
Date: Fri, 14 Apr 2023 14:59:53 +0300 Date: Tue, 19 Dec 2023 12:00:36 +0300
Subject: [PATCH 06/15] Add MSVSphere product config Subject: [PATCH 06/14] Add MSVSphere product config
--- ---
data/product.d/msvsphere.conf | 21 +++++++++++++++++++++ data/product.d/msvsphere.conf | 30 ++++++++++++++++++++++++++++++
1 file changed, 21 insertions(+) data/product.d/rhel.conf | 1 -
2 files changed, 30 insertions(+), 1 deletion(-)
create mode 100644 data/product.d/msvsphere.conf create mode 100644 data/product.d/msvsphere.conf
diff --git a/data/product.d/msvsphere.conf b/data/product.d/msvsphere.conf diff --git a/data/product.d/msvsphere.conf b/data/product.d/msvsphere.conf
new file mode 100644 new file mode 100644
index 0000000..baaf497 index 0000000..f795db9
--- /dev/null --- /dev/null
+++ b/data/product.d/msvsphere.conf +++ b/data/product.d/msvsphere.conf
@@ -0,0 +1,21 @@ @@ -0,0 +1,30 @@
+# Anaconda configuration file for MSVSphere. +# Anaconda configuration file for MSVSphere.
+ +
+[Product] +[Product]
@ -23,8 +24,17 @@ index 0000000..baaf497
+product_name = Red Hat Enterprise Linux +product_name = Red Hat Enterprise Linux
+ +
+[Anaconda] +[Anaconda]
+forbidden_modules = +# List of enabled Anaconda DBus modules for RHEL.
+ org.fedoraproject.Anaconda.Modules.Subscription +# but without org.fedoraproject.Anaconda.Modules.Subscription
+kickstart_modules =
+ org.fedoraproject.Anaconda.Modules.Timezone
+ org.fedoraproject.Anaconda.Modules.Network
+ org.fedoraproject.Anaconda.Modules.Localization
+ org.fedoraproject.Anaconda.Modules.Security
+ org.fedoraproject.Anaconda.Modules.Users
+ org.fedoraproject.Anaconda.Modules.Payloads
+ org.fedoraproject.Anaconda.Modules.Storage
+ org.fedoraproject.Anaconda.Modules.Services
+ +
+[Bootloader] +[Bootloader]
+efi_dir = msvsphere +efi_dir = msvsphere
@ -35,6 +45,18 @@ index 0000000..baaf497
+ +
+[License] +[License]
+eula = /usr/share/sphere-release/EULA +eula = /usr/share/sphere-release/EULA
diff --git a/data/product.d/rhel.conf b/data/product.d/rhel.conf
index c4de9b6..3f7e282 100644
--- a/data/product.d/rhel.conf
+++ b/data/product.d/rhel.conf
@@ -14,7 +14,6 @@ kickstart_modules =
org.fedoraproject.Anaconda.Modules.Payloads
org.fedoraproject.Anaconda.Modules.Storage
org.fedoraproject.Anaconda.Modules.Services
- org.fedoraproject.Anaconda.Modules.Subscription
[Installation System]
# The detection is disabled since #1645686.
-- --
2.44.0 2.39.3

@ -1,17 +1,17 @@
From bb93c14285802d057447369c44b662d2d43521a8 Mon Sep 17 00:00:00 2001 From 12b96a427587b418f2c069ce258e6583c3c6276c Mon Sep 17 00:00:00 2001
From: Eugene Zamriy <eugene@zamriy.info> From: tigro <tigro@msvsphere-os.ru>
Date: Fri, 14 Apr 2023 18:00:57 +0300 Date: Tue, 19 Dec 2023 12:01:29 +0300
Subject: [PATCH 07/15] Set Russian language as default Subject: [PATCH 07/14] Set Russian language as default
--- ---
pyanaconda/core/constants.py | 2 +- pyanaconda/core/constants.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-) 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pyanaconda/core/constants.py b/pyanaconda/core/constants.py diff --git a/pyanaconda/core/constants.py b/pyanaconda/core/constants.py
index 72a9d39..ca9dadc 100644 index bcc5270..1745ce2 100644
--- a/pyanaconda/core/constants.py --- a/pyanaconda/core/constants.py
+++ b/pyanaconda/core/constants.py +++ b/pyanaconda/core/constants.py
@@ -72,7 +72,7 @@ ANACONDA_CONFIG_DIR = "/etc/anaconda/" @@ -79,7 +79,7 @@ ANACONDA_CONFIG_DIR = "/etc/anaconda/"
ANACONDA_CONFIG_TMP = "/run/anaconda/anaconda.conf" ANACONDA_CONFIG_TMP = "/run/anaconda/anaconda.conf"
# NOTE: this should be LANG_TERRITORY.CODESET, e.g. en_US.UTF-8 # NOTE: this should be LANG_TERRITORY.CODESET, e.g. en_US.UTF-8
@ -21,5 +21,5 @@ index 72a9d39..ca9dadc 100644
DEFAULT_VC_FONT = "eurlatgr" DEFAULT_VC_FONT = "eurlatgr"
-- --
2.44.0 2.39.3

@ -1,102 +0,0 @@
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

@ -1,19 +1,19 @@
From 656b7931e60d6e25323e3ae46e2f15fc7d550ff3 Mon Sep 17 00:00:00 2001 From 58455792e6d21b7b6c7a5119fe1a82af06e00496 Mon Sep 17 00:00:00 2001
From: Sergey Cherevko <s.cherevko@msvsphere-os.ru> From: tigro <tigro@msvsphere-os.ru>
Date: Wed, 4 Oct 2023 17:41:16 +0300 Date: Tue, 19 Dec 2023 12:03:49 +0300
Subject: [PATCH 09/15] Set Russian as default language for new regions Subject: [PATCH 08/14] Set Russian as default language for new regions
--- ---
pyanaconda/modules/timezone/initialization.py | 11 +++++++++++ pyanaconda/geoloc.py | 11 +++++++++++
1 file changed, 11 insertions(+) 1 file changed, 11 insertions(+)
diff --git a/pyanaconda/modules/timezone/initialization.py b/pyanaconda/modules/timezone/initialization.py diff --git a/pyanaconda/geoloc.py b/pyanaconda/geoloc.py
index 0ef8d09..f8f5848 100644 index 4873ea0..a9aa117 100644
--- a/pyanaconda/modules/timezone/initialization.py --- a/pyanaconda/geoloc.py
+++ b/pyanaconda/modules/timezone/initialization.py +++ b/pyanaconda/geoloc.py
@@ -97,6 +97,17 @@ class GeolocationTask(Task): @@ -483,6 +483,17 @@ class FedoraGeoIPProvider(GeolocationBackend):
territory = json_reply.get("country_code", "") timezone_source = "GeoIP"
timezone = json_reply.get("time_zone", "") timezone_code = json_reply.get("time_zone", None)
+ # set Russian as default language for new regions + # set Russian as default language for new regions
+ if territory == "UA": + if territory == "UA":
@ -27,8 +27,8 @@ index 0ef8d09..f8f5848 100644
+ timezone_code = "Europe/Moscow" + timezone_code = "Europe/Moscow"
+ +
# check if the timezone returned by the API is valid # check if the timezone returned by the API is valid
if not is_valid_timezone(timezone): if not is_valid_timezone(timezone_code):
# try to get a timezone from the territory code # try to get a timezone from the territory code
-- --
2.44.0 2.39.3

File diff suppressed because it is too large Load Diff

@ -1,50 +0,0 @@
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

@ -1,680 +0,0 @@
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

@ -1,30 +1,32 @@
From d89d1e6358188e8f3f3f595cc8af4d90dd78987e Mon Sep 17 00:00:00 2001 From 0b57471484b98dd37de0eb6ce95b3cda393aae7c Mon Sep 17 00:00:00 2001
From: tigro <tigro@msvsphere-os.ru> From: tigro <tigro@msvsphere-os.ru>
Date: Wed, 3 Apr 2024 10:12:41 +0300 Date: Tue, 19 Dec 2023 13:53:57 +0300
Subject: [PATCH 12/15] Enable administrator by default Subject: [PATCH 11/14] Enable administrator by default
--- ---
pyanaconda/ui/gui/spokes/user.glade | 1 + pyanaconda/ui/gui/spokes/user.glade | 3 ++-
pyanaconda/ui/lib/users.py | 4 +++- pyanaconda/ui/lib/users.py | 4 +++-
2 files changed, 4 insertions(+), 1 deletion(-) 2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/pyanaconda/ui/gui/spokes/user.glade b/pyanaconda/ui/gui/spokes/user.glade diff --git a/pyanaconda/ui/gui/spokes/user.glade b/pyanaconda/ui/gui/spokes/user.glade
index 3d52a93..c070066 100644 index 69156b1..3409166 100644
--- a/pyanaconda/ui/gui/spokes/user.glade --- a/pyanaconda/ui/gui/spokes/user.glade
+++ b/pyanaconda/ui/gui/spokes/user.glade +++ b/pyanaconda/ui/gui/spokes/user.glade
@@ -267,6 +267,7 @@ @@ -263,7 +263,8 @@
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">True</property> <property name="can_focus">True</property>
<property name="receives-default">False</property> <property name="receives_default">False</property>
- <property name="use_underline">True</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</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> <property name="xalign">0</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="on_admin_toggled" swapped="no"/>
diff --git a/pyanaconda/ui/lib/users.py b/pyanaconda/ui/lib/users.py diff --git a/pyanaconda/ui/lib/users.py b/pyanaconda/ui/lib/users.py
index 2ea6a6f..a0cc1ec 100644 index 31665f0..415a914 100644
--- a/pyanaconda/ui/lib/users.py --- a/pyanaconda/ui/lib/users.py
+++ b/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): @@ -40,7 +40,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 # 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 # a populated list the add_if_not_empty option needs to be used
if not user_data_list or add_if_not_empty: if not user_data_list or add_if_not_empty:
@ -36,5 +38,5 @@ index 2ea6a6f..a0cc1ec 100644
return user_data_list return user_data_list
-- --
2.44.0 2.39.3

@ -0,0 +1,44 @@
From 44aeb5edc044dd6e8af54117c02181d9e9552413 Mon Sep 17 00:00:00 2001
From: Anton Volkov <AV.Volkov@softline.com>
Date: Thu, 8 Feb 2024 20:59:29 +0300
Subject: [PATCH 12/14] Backport bugfixes for keyboard layout:
https://bugzilla.redhat.com/show_bug.cgi?id=1039185
https://bugzilla.redhat.com/show_bug.cgi?id=1912609
---
pyanaconda/keyboard.py | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/pyanaconda/keyboard.py b/pyanaconda/keyboard.py
index 2c3226c..3ab47bc 100644
--- a/pyanaconda/keyboard.py
+++ b/pyanaconda/keyboard.py
@@ -171,8 +171,10 @@ def set_x_keyboard_defaults(localization_proxy, xkl_wrapper):
# store it normalized
new_layouts = [normalize_layout_variant(layouts[0])]
if not langtable.supports_ascii(layouts[0]):
- # does not support typing ASCII chars, append the default layout
- new_layouts.append(DEFAULT_KEYBOARD)
+ # The default keymap setting should have "us" before the native layout
+ # which does not support ascii,
+ # refer: https://bugzilla.redhat.com/show_bug.cgi?id=1039185
+ new_layouts.insert(0, DEFAULT_KEYBOARD)
else:
log.error("Failed to get layout for chosen locale '%s'", locale)
new_layouts = [DEFAULT_KEYBOARD]
@@ -181,6 +183,12 @@ def set_x_keyboard_defaults(localization_proxy, xkl_wrapper):
if conf.system.can_configure_keyboard:
xkl_wrapper.replace_layouts(new_layouts)
+ # the console layout configured should be "native" by default,
+ # setting that explicitly for non-ascii layouts where we prepend "us"
+ # refer: https://bugzilla.redhat.com/show_bug.cgi?id=1912609
+ if len(new_layouts) >= 2 and not langtable.supports_ascii(new_layouts[1]):
+ localization_proxy.SetVirtualConsoleKeymap(new_layouts[1])
+
if len(new_layouts) >= 2 and not localization_proxy.LayoutSwitchOptions:
# initialize layout switching if needed
localization_proxy.SetLayoutSwitchOptions(["grp:alt_shift_toggle"])
--
2.39.3

@ -0,0 +1,262 @@
From e9211745672557570dc16829489556fa58254cbd Mon Sep 17 00:00:00 2001
From: Anton Volkov <AV.Volkov@softline.com>
Date: Tue, 20 Feb 2024 19:38:47 +0300
Subject: [PATCH 13/14] Activate all wired network devices with link in up
state when running interactive installation
---
anaconda.py | 3 +
pyanaconda/modules/network/initialization.py | 44 +++++++++
pyanaconda/modules/network/network.py | 15 ++-
.../modules/network/network_interface.py | 9 ++
pyanaconda/network.py | 91 +++++++++++++++++++
5 files changed, 161 insertions(+), 1 deletion(-)
diff --git a/anaconda.py b/anaconda.py
index bbf801b..ae282e3 100755
--- a/anaconda.py
+++ b/anaconda.py
@@ -516,6 +516,9 @@ if __name__ == "__main__":
# Initialize the network now, in case the display needs it
from pyanaconda.network import initialize_network, wait_for_connecting_NM_thread, wait_for_connected_NM
+ import pyanaconda.network # @UnusedImport
+ pyanaconda.network.interactive_mode = anaconda.interactive_mode
+
initialize_network()
# If required by user, wait for connection before starting the installation.
if opts.waitfornet:
diff --git a/pyanaconda/modules/network/initialization.py b/pyanaconda/modules/network/initialization.py
index f61b88f..dc8035a 100644
--- a/pyanaconda/modules/network/initialization.py
+++ b/pyanaconda/modules/network/initialization.py
@@ -32,6 +32,7 @@ from pyanaconda.modules.network.ifcfg import get_ifcfg_file_of_device, find_ifcf
from pyanaconda.modules.network.device_configuration import supported_wired_device_types, \
virtual_device_types
from pyanaconda.modules.network.utils import guard_by_system_configuration
+from pyanaconda.network import switch_all_network_devices
log = get_module_logger(__name__)
@@ -40,6 +41,49 @@ gi.require_version("NM", "1.0")
from gi.repository import NM
+class SwitchNetworkDevicesTask(Task):
+ """Task for switching all network devices ON"""
+
+ def __init__(self, network_data, supported_devices, bootif, ifname_option_values):
+ """Create a new task.
+
+ :param network_data: kickstart network data to be applied
+ :type: list(NetworkData)
+ :param supported_devices: list of names of supported network devices
+ :type supported_devices: list(str)
+ :param bootif: MAC addres of device to be used for --device=bootif specification
+ :type bootif: str
+ :param ifname_option_values: list of ifname boot option values
+ :type ifname_option_values: list(str)
+ """
+ super().__init__()
+ self._network_data = network_data
+ self._supported_devices = supported_devices
+ self._bootif = bootif
+ self._ifname_option_values = ifname_option_values
+
+ @property
+ def name(self):
+ return "Switch network devices on"
+
+ def for_publication(self):
+ """Return a DBus representation."""
+ return NetworkInitializationTaskInterface(self)
+
+ @guard_by_system_configuration(return_value=[])
+ def run(self):
+ """Run the switching network devices on.
+
+ :returns: names of devices
+ :rtype: list(str)
+ """
+ with nm_client_in_thread() as nm_client:
+ return self._run(nm_client)
+
+ def _run(self, nm_client):
+ return switch_all_network_devices(nm_client)
+
+
class ApplyKickstartTask(Task):
"""Task for application of kickstart network configuration."""
diff --git a/pyanaconda/modules/network/network.py b/pyanaconda/modules/network/network.py
index 1e194c3..d436190 100644
--- a/pyanaconda/modules/network/network.py
+++ b/pyanaconda/modules/network/network.py
@@ -39,7 +39,7 @@ from pyanaconda.modules.network.ifcfg import get_kickstart_network_data, \
get_ifcfg_file, get_ifcfg_files_content
from pyanaconda.modules.network.installation import NetworkInstallationTask, \
ConfigureActivationOnBootTask, HostnameConfigurationTask
-from pyanaconda.modules.network.initialization import ApplyKickstartTask, \
+from pyanaconda.modules.network.initialization import ApplyKickstartTask, SwitchNetworkDevicesTask, \
ConsolidateInitramfsConnectionsTask, SetRealOnbootValuesFromKickstartTask, \
DumpMissingIfcfgFilesTask
from pyanaconda.modules.network.utils import get_default_route_iface
@@ -550,6 +550,19 @@ class NetworkService(KickstartService):
self._ifname_option_values = values
log.debug("ifname boot option values are set to %s", values)
+ def switch_network_devices_with_task(self):
+ """Switch all network devices ON
+
+ :returns: a task switching all network devices ON
+ """
+ supported_devices = [dev_info.device_name for dev_info in self.get_supported_devices()]
+ task = SwitchNetworkDevicesTask(self._original_network_data,
+ supported_devices,
+ self.bootif,
+ self.ifname_option_values)
+ task.succeeded_signal.connect(lambda: self.log_task_result(task, check_result=True))
+ return task
+
def apply_kickstart_with_task(self):
"""Apply kickstart configuration which has not already been applied.
diff --git a/pyanaconda/modules/network/network_interface.py b/pyanaconda/modules/network/network_interface.py
index 6e904ba..27e6e3d 100644
--- a/pyanaconda/modules/network/network_interface.py
+++ b/pyanaconda/modules/network/network_interface.py
@@ -213,6 +213,15 @@ class NetworkInterface(KickstartModuleInterface):
self.implementation.consolidate_initramfs_connections_with_task()
)
+ def SwitchNetworkDevicesWithTask(self) -> ObjPath:
+ """Switch network devices ON
+
+ :returns: DBus path of the task switching network devices ON
+ """
+ return TaskContainer.to_object_path(
+ self.implementation.switch_network_devices_with_task()
+ )
+
def ApplyKickstartWithTask(self) -> ObjPath:
"""Apply kickstart configuration which has not already been applied.
diff --git a/pyanaconda/network.py b/pyanaconda/network.py
index d757934..f7fa48c 100644
--- a/pyanaconda/network.py
+++ b/pyanaconda/network.py
@@ -50,6 +50,8 @@ log = get_module_logger(__name__)
DEFAULT_HOSTNAME = "localhost.localdomain"
+interactive_mode = False
+
network_connected = None
network_connected_condition = threading.Condition()
@@ -272,6 +274,91 @@ def run_network_initialization_task(task_path):
log.debug(msg)
+def switch_all_network_devices(client, activate=True, check_link=True, wait=True):
+ """
+ Switch ON (or OFF) all wired network devices with link in up state.
+ Return list of device names switched ON
+ :param client: Network Manager client object
+ :param activate: True = activate (ON), False = deactivate network devices
+ :param check_link: True = activate network devices with link in up state only
+ :param wait: True = wait for network devices to become active before exiting the function
+ :rtype list(str)
+ """
+ action = "on" if activate else "off"
+ log.debug("start switching all devices %s", action)
+ if not client:
+ log.debug("NM client not available")
+ return []
+ devices = client.get_devices()
+ if not devices:
+ log.debug("No devices found")
+ return []
+ activated_ifaces = get_activated_devices(client)
+ active_connections = client.get_active_connections()
+ active_uuids = set([con.get_uuid() for con in active_connections])
+ changed = False
+ ifaces = set()
+ for device in devices:
+ if not device:
+ continue
+ switched = False
+ iface = device.get_iface()
+ if not device_type_is_supported_wired(device.get_device_type()):
+ log.debug("device %s is not wired, skipping", iface)
+ continue
+ if activate:
+ if iface in activated_ifaces:
+ log.debug("device %s activated already, skipping", iface)
+ continue
+ elif iface not in activated_ifaces:
+ log.debug("device %s not activated already, skipping", iface)
+ continue
+ # check if the link for the device is up
+ if check_link and activate:
+ try:
+ carrier = device.get_carrier()
+ except AttributeError:
+ carrier = None
+ if carrier:
+ log.debug("device %s link is up", iface)
+ else:
+ log.debug("device %s link is down", iface)
+ # skip activating device if link is down
+ continue
+ connections = device.get_available_connections()
+ if not connections:
+ log.debug("No available connections for device %s", iface)
+ continue
+ for con in connections:
+ if not con:
+ continue
+ uuid = con.get_uuid()
+ if activate:
+ if uuid in active_uuids:
+ log.debug("connection %s for device %s is active already, skipping", uuid, iface)
+ continue
+ elif uuid not in active_uuids:
+ log.debug("connection %s for device %s is not active already, skipping", uuid, iface)
+ continue
+ if activate:
+ client.activate_connection_async(con, device, None, None)
+ ifaces.add(iface)
+ else:
+ device.disconnect(None)
+ switched = changed = True
+ if switched:
+ log.info("device %s switched %s", iface, action)
+ if not changed:
+ log.debug("No devices switched %s", action)
+ if wait and ifaces:
+ if wait_for_network_devices(ifaces):
+ log.debug("waiting succeeded: devices are active")
+ else:
+ log.debug("waiting timeout has expired")
+ log.debug("finish switching all devices %s", action)
+ return list(ifaces)
+
+
def initialize_network():
"""Initialize networking."""
if not conf.system.can_configure_network:
@@ -290,6 +377,10 @@ def initialize_network():
run_network_initialization_task(network_proxy.ApplyKickstartWithTask())
run_network_initialization_task(network_proxy.DumpMissingIfcfgFilesWithTask())
run_network_initialization_task(network_proxy.SetRealOnbootValuesFromKickstartWithTask())
+ if interactive_mode:
+ run_network_initialization_task(network_proxy.SwitchNetworkDevicesWithTask())
+ else:
+ log.debug("Not activating all wired network devices in non-interactive mode")
if network_proxy.Hostname == DEFAULT_HOSTNAME:
bootopts_hostname = hostname_from_cmdline(kernel_arguments)
--
2.39.3

@ -1,130 +0,0 @@
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,234 @@
From b6807446c6531753b5b46ec906f8fa4d05f91770 Mon Sep 17 00:00:00 2001
From: Anton Volkov <AV.Volkov@softline.com>
Date: Thu, 22 Feb 2024 12:42:25 +0300
Subject: [PATCH 14/14] Set autoconnect and autoconnect-priority for
connections of all network devices with link in up state
---
pyanaconda/modules/network/initialization.py | 53 +++++++++++++-
pyanaconda/modules/network/network.py | 15 +++-
.../modules/network/network_interface.py | 9 +++
pyanaconda/network.py | 69 +++++++++++++++++++
4 files changed, 144 insertions(+), 2 deletions(-)
diff --git a/pyanaconda/modules/network/initialization.py b/pyanaconda/modules/network/initialization.py
index dc8035a..5530075 100644
--- a/pyanaconda/modules/network/initialization.py
+++ b/pyanaconda/modules/network/initialization.py
@@ -32,7 +32,7 @@ from pyanaconda.modules.network.ifcfg import get_ifcfg_file_of_device, find_ifcf
from pyanaconda.modules.network.device_configuration import supported_wired_device_types, \
virtual_device_types
from pyanaconda.modules.network.utils import guard_by_system_configuration
-from pyanaconda.network import switch_all_network_devices
+from pyanaconda.network import switch_all_network_devices, configure_connections
log = get_module_logger(__name__)
@@ -41,6 +41,57 @@ gi.require_version("NM", "1.0")
from gi.repository import NM
+class SetAutoconnectPriorityTask(Task):
+ """
+ Task for configuring autoconnect and autoconnect-priority for connections of
+ all network devices with link in up state
+ """
+
+ def __init__(self, network_data, supported_devices, bootif, ifname_option_values):
+ """Create a new task.
+
+ :param network_data: kickstart network data to be applied
+ :type: list(NetworkData)
+ :param supported_devices: list of names of supported network devices
+ :type supported_devices: list(str)
+ :param bootif: MAC addres of device to be used for --device=bootif specification
+ :type bootif: str
+ :param ifname_option_values: list of ifname boot option values
+ :type ifname_option_values: list(str)
+ """
+ super().__init__()
+ self._network_data = network_data
+ self._supported_devices = supported_devices
+ self._bootif = bootif
+ self._ifname_option_values = ifname_option_values
+
+ @property
+ def name(self):
+ return "Set autoconnect and autoconnect-priority for connections of network devices with link in up state"
+
+ def for_publication(self):
+ """Return a DBus representation."""
+ return NetworkInitializationTaskInterface(self)
+
+ @guard_by_system_configuration(return_value=[])
+ def run(self):
+ """
+ Run nmcli utility to set autoconnect and autoconnect-priority for
+ connections of network devices with link in up state
+ :returns: names of devices
+ :rtype: list(str)
+ """
+ with nm_client_in_thread() as nm_client:
+ return self._run(nm_client)
+
+ def _run(self, nm_client):
+ settings = {
+ "connection.autoconnect" : "yes",
+ "connection.autoconnect-priority" : "-999"
+ }
+ return configure_connections(nm_client, settings)
+
+
class SwitchNetworkDevicesTask(Task):
"""Task for switching all network devices ON"""
diff --git a/pyanaconda/modules/network/network.py b/pyanaconda/modules/network/network.py
index d436190..c196ac5 100644
--- a/pyanaconda/modules/network/network.py
+++ b/pyanaconda/modules/network/network.py
@@ -40,7 +40,7 @@ from pyanaconda.modules.network.ifcfg import get_kickstart_network_data, \
from pyanaconda.modules.network.installation import NetworkInstallationTask, \
ConfigureActivationOnBootTask, HostnameConfigurationTask
from pyanaconda.modules.network.initialization import ApplyKickstartTask, SwitchNetworkDevicesTask, \
- ConsolidateInitramfsConnectionsTask, SetRealOnbootValuesFromKickstartTask, \
+ ConsolidateInitramfsConnectionsTask, SetRealOnbootValuesFromKickstartTask, SetAutoconnectPriorityTask, \
DumpMissingIfcfgFilesTask
from pyanaconda.modules.network.utils import get_default_route_iface
from pyanaconda.modules.common.structures.network import NetworkDeviceInfo
@@ -550,6 +550,19 @@ class NetworkService(KickstartService):
self._ifname_option_values = values
log.debug("ifname boot option values are set to %s", values)
+ def set_autoconnect_priority_with_task(self):
+ """
+ Set autoconnect and autoconnect-priority for connections of network devices with link in up state
+ :returns: a task configuring autoconnect and autoconnect-priority for all network devices
+ """
+ supported_devices = [dev_info.device_name for dev_info in self.get_supported_devices()]
+ task = SetAutoconnectPriorityTask(self._original_network_data,
+ supported_devices,
+ self.bootif,
+ self.ifname_option_values)
+ task.succeeded_signal.connect(lambda: self.log_task_result(task, check_result=True))
+ return task
+
def switch_network_devices_with_task(self):
"""Switch all network devices ON
diff --git a/pyanaconda/modules/network/network_interface.py b/pyanaconda/modules/network/network_interface.py
index 27e6e3d..52b7b48 100644
--- a/pyanaconda/modules/network/network_interface.py
+++ b/pyanaconda/modules/network/network_interface.py
@@ -213,6 +213,15 @@ class NetworkInterface(KickstartModuleInterface):
self.implementation.consolidate_initramfs_connections_with_task()
)
+ def SetAutoconnectPriorityWithTask(self) -> ObjPath:
+ """Set autoconnect and autoconnect-priority for connections of network devices with link in up state
+
+ :returns: DBus path of the task switching network devices ON
+ """
+ return TaskContainer.to_object_path(
+ self.implementation.set_autoconnect_priority_with_task()
+ )
+
def SwitchNetworkDevicesWithTask(self) -> ObjPath:
"""Switch network devices ON
diff --git a/pyanaconda/network.py b/pyanaconda/network.py
index f7fa48c..7179c19 100644
--- a/pyanaconda/network.py
+++ b/pyanaconda/network.py
@@ -46,6 +46,8 @@ from pyanaconda.modules.common.structures.network import NetworkDeviceInfo
from pyanaconda.modules.common.util import is_module_available
from pyanaconda.anaconda_loggers import get_module_logger
+import subprocess
+
log = get_module_logger(__name__)
DEFAULT_HOSTNAME = "localhost.localdomain"
@@ -274,6 +276,72 @@ def run_network_initialization_task(task_path):
log.debug(msg)
+def configure_connections(client, settings, check_link=True):
+ """
+ Configure connection parameters for all wired network devices with link in up state.
+ Return list of device names affected
+ :param client: Network Manager client object
+ :param settings: dict(str, str) = {name:value} of the setting to configure
+ :param check_link: True = handle network devices with link in up state only
+ :rtype list(str)
+ """
+ log.debug("start configuring autoconnect for all network devices with link in up state")
+ if not client:
+ log.debug("NM client not available")
+ return []
+ devices = client.get_devices()
+ if not devices:
+ log.debug("No devices found")
+ return []
+ if not settings:
+ log.debug("No settings passed")
+ return []
+ changed = False
+ ifaces = set()
+ for device in devices:
+ if not device:
+ continue
+ switched = False
+ iface = device.get_iface()
+ if not device_type_is_supported_wired(device.get_device_type()):
+ log.debug("device %s is not wired, skipping", iface)
+ continue
+ # check if the link for the device is up
+ if check_link:
+ try:
+ carrier = device.get_carrier()
+ except AttributeError:
+ carrier = None
+ if carrier:
+ log.debug("device %s link is up", iface)
+ else:
+ log.debug("device %s link is down", iface)
+ # skip modifying the autoconnect.priority setting for the device if link is down
+ continue
+ connections = device.get_available_connections()
+ if not connections:
+ log.debug("No available connections for device %s", iface)
+ continue
+ for con in connections:
+ if not con:
+ continue
+ uuid = con.get_uuid()
+ cmd_line = ["nmcli", "connection", "modify", "uuid", uuid]
+ for setting_name in settings:
+ setting_value = settings[setting_name]
+ cmd_line.extend([setting_name, setting_value])
+ p = subprocess.run(cmd_line, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, check=False, close_fds=True)
+ log.debug("update settings for connection %s for device %s, nmcli exit code = %s", uuid, iface, str(p.returncode))
+ ifaces.add(iface)
+ switched = changed = True
+ if switched:
+ log.info("connection settings for device %s updated", iface)
+ if not changed:
+ log.debug("No settings for devices updated")
+ log.debug("finish configuring autoconnect for all network devices with link in up state")
+ return list(ifaces)
+
+
def switch_all_network_devices(client, activate=True, check_link=True, wait=True):
"""
Switch ON (or OFF) all wired network devices with link in up state.
@@ -379,6 +447,7 @@ def initialize_network():
run_network_initialization_task(network_proxy.SetRealOnbootValuesFromKickstartWithTask())
if interactive_mode:
run_network_initialization_task(network_proxy.SwitchNetworkDevicesWithTask())
+ run_network_initialization_task(network_proxy.SetAutoconnectPriorityWithTask())
else:
log.debug("Not activating all wired network devices in non-interactive mode")
--
2.39.3

@ -1,98 +0,0 @@
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

@ -1,25 +0,0 @@
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

@ -1,488 +0,0 @@
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