Compare commits
No commits in common. 'i8c' and 'i9' have entirely different histories.
@ -1 +1 @@
|
|||||||
c91cb60fc3074312b1dfc13c47634b77cd5c1999 SOURCES/anaconda-33.16.10.5.tar.bz2
|
71620d2ed3ce54558da0cb8d49cac48fa89d3a7a SOURCES/anaconda-34.25.4.9.tar.bz2
|
||||||
|
@ -1 +1 @@
|
|||||||
SOURCES/anaconda-33.16.10.5.tar.bz2
|
SOURCES/anaconda-34.25.4.9.tar.bz2
|
||||||
|
@ -0,0 +1,27 @@
|
|||||||
|
From 8454ae65d1f7cb2f0221a33fd223c2b460c27017 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Eugene Zamriy <eugene@zamriy.info>
|
||||||
|
Date: Fri, 14 Apr 2023 12:53:14 +0300
|
||||||
|
Subject: [PATCH 01/15] Disable subscription
|
||||||
|
|
||||||
|
---
|
||||||
|
pyanaconda/ui/gui/spokes/subscription.py | 4 ++++
|
||||||
|
1 file changed, 4 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/pyanaconda/ui/gui/spokes/subscription.py b/pyanaconda/ui/gui/spokes/subscription.py
|
||||||
|
index 4d03689..3b0e6c0 100644
|
||||||
|
--- a/pyanaconda/ui/gui/spokes/subscription.py
|
||||||
|
+++ b/pyanaconda/ui/gui/spokes/subscription.py
|
||||||
|
@@ -551,6 +551,10 @@ class SubscriptionSpoke(NormalSpoke):
|
||||||
|
# also set the spoke warning banner
|
||||||
|
self.show_warning_message(error_message)
|
||||||
|
|
||||||
|
+ @property
|
||||||
|
+ def showable(self):
|
||||||
|
+ return False
|
||||||
|
+
|
||||||
|
def initialize(self):
|
||||||
|
NormalSpoke.initialize(self)
|
||||||
|
self.initialize_start()
|
||||||
|
--
|
||||||
|
2.44.0
|
||||||
|
|
@ -0,0 +1,25 @@
|
|||||||
|
From 3e3d00cc21ab256eb55c5e5176f66cd7a348c111 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Eugene Zamriy <eugene@zamriy.info>
|
||||||
|
Date: Fri, 14 Apr 2023 12:54:58 +0300
|
||||||
|
Subject: [PATCH 02/15] Hide CDN source button
|
||||||
|
|
||||||
|
---
|
||||||
|
pyanaconda/ui/gui/spokes/installation_source.py | 2 ++
|
||||||
|
1 file changed, 2 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/pyanaconda/ui/gui/spokes/installation_source.py b/pyanaconda/ui/gui/spokes/installation_source.py
|
||||||
|
index c467bd3..398ac11 100644
|
||||||
|
--- a/pyanaconda/ui/gui/spokes/installation_source.py
|
||||||
|
+++ b/pyanaconda/ui/gui/spokes/installation_source.py
|
||||||
|
@@ -798,6 +798,8 @@ class SourceSpoke(NormalSpoke, GUISpokeInputCheckHandler, SourceSwitchHandler):
|
||||||
|
self._network_button = self.builder.get_object("networkRadioButton")
|
||||||
|
self._network_box = self.builder.get_object("networkBox")
|
||||||
|
|
||||||
|
+ really_hide(self._cdn_button)
|
||||||
|
+
|
||||||
|
self._url_entry = self.builder.get_object("urlEntry")
|
||||||
|
self._protocol_combo_box = self.builder.get_object("protocolComboBox")
|
||||||
|
self._iso_chooser_button = self.builder.get_object("isoChooserButton")
|
||||||
|
--
|
||||||
|
2.44.0
|
||||||
|
|
@ -0,0 +1,29 @@
|
|||||||
|
From d78fb7d96c772f00ce4b35f4f9209b2d629c27e0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Eugene Zamriy <eugene@zamriy.info>
|
||||||
|
Date: Fri, 14 Apr 2023 12:56:19 +0300
|
||||||
|
Subject: [PATCH 03/15] Set MSVSphere installer colors
|
||||||
|
|
||||||
|
---
|
||||||
|
data/anaconda-gtk.css | 3 ++-
|
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/data/anaconda-gtk.css b/data/anaconda-gtk.css
|
||||||
|
index 516df62..ef6d79d 100644
|
||||||
|
--- a/data/anaconda-gtk.css
|
||||||
|
+++ b/data/anaconda-gtk.css
|
||||||
|
@@ -92,10 +92,11 @@ infobar.error box {
|
||||||
|
|
||||||
|
@define-color redhat #2d2d2d;
|
||||||
|
@define-color fedora #2f4265;
|
||||||
|
+@define-color msvsphere #343434;
|
||||||
|
|
||||||
|
/* theme colors/images */
|
||||||
|
|
||||||
|
-@define-color product_bg_color @fedora;
|
||||||
|
+@define-color product_bg_color @msvsphere;
|
||||||
|
|
||||||
|
/* logo and sidebar classes */
|
||||||
|
|
||||||
|
--
|
||||||
|
2.44.0
|
||||||
|
|
@ -0,0 +1,27 @@
|
|||||||
|
From 18fcf71d53a8c476c55076f8a0e8db0904a51670 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Eugene Zamriy <evgeniy.zamriy@softline.com>
|
||||||
|
Date: Fri, 28 Jul 2023 23:47:23 +0300
|
||||||
|
Subject: [PATCH 04/15] Add Minimal and Server repository support
|
||||||
|
|
||||||
|
---
|
||||||
|
pyanaconda/core/constants.py | 4 +++-
|
||||||
|
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/pyanaconda/core/constants.py b/pyanaconda/core/constants.py
|
||||||
|
index 1496f8c..72a9d39 100644
|
||||||
|
--- a/pyanaconda/core/constants.py
|
||||||
|
+++ b/pyanaconda/core/constants.py
|
||||||
|
@@ -58,7 +58,9 @@ DEFAULT_REPOS = [productName.split('-')[0].lower(),
|
||||||
|
"fedora-modular-server",
|
||||||
|
"rawhide",
|
||||||
|
"BaseOS", # Used by RHEL
|
||||||
|
- "baseos"] # Used by CentOS Stream
|
||||||
|
+ "baseos", # Used by CentOS Stream
|
||||||
|
+ "Server", # Used by MSVSphere
|
||||||
|
+ "Minimal"] # Used by MSVSphere
|
||||||
|
|
||||||
|
DBUS_ANACONDA_SESSION_ADDRESS = "DBUS_ANACONDA_SESSION_BUS_ADDRESS"
|
||||||
|
|
||||||
|
--
|
||||||
|
2.44.0
|
||||||
|
|
@ -0,0 +1,55 @@
|
|||||||
|
From 590d0e07d420aa32e69d23e1d70211ceaf35aa1f Mon Sep 17 00:00:00 2001
|
||||||
|
From: tigro <tigro@msvsphere-os.ru>
|
||||||
|
Date: Wed, 3 Apr 2024 09:41:32 +0300
|
||||||
|
Subject: [PATCH 05/15] Set default timezone to Europe/Moscow
|
||||||
|
|
||||||
|
---
|
||||||
|
pyanaconda/modules/timezone/installation.py | 4 ++--
|
||||||
|
pyanaconda/modules/timezone/timezone.py | 2 +-
|
||||||
|
pyanaconda/ui/gui/spokes/datetime_spoke.py | 2 +-
|
||||||
|
3 files changed, 4 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/pyanaconda/modules/timezone/installation.py b/pyanaconda/modules/timezone/installation.py
|
||||||
|
index fcd04d1..88ac7b5 100644
|
||||||
|
--- a/pyanaconda/modules/timezone/installation.py
|
||||||
|
+++ b/pyanaconda/modules/timezone/installation.py
|
||||||
|
@@ -67,8 +67,8 @@ class ConfigureTimezoneTask(Task):
|
||||||
|
else:
|
||||||
|
# this should never happen, but for pity's sake
|
||||||
|
log.warning("Timezone %s set in kickstart is not valid, "
|
||||||
|
- "falling back to default (America/New_York).", self._timezone)
|
||||||
|
- self._timezone = "America/New_York"
|
||||||
|
+ "falling back to default (Europe/Moscow).", self._timezone)
|
||||||
|
+ self._timezone = "Europe/Moscow"
|
||||||
|
|
||||||
|
def _make_timezone_symlink(self):
|
||||||
|
"""Create the symlink that actually defines timezone."""
|
||||||
|
diff --git a/pyanaconda/modules/timezone/timezone.py b/pyanaconda/modules/timezone/timezone.py
|
||||||
|
index ac5318c..42e0cfe 100644
|
||||||
|
--- a/pyanaconda/modules/timezone/timezone.py
|
||||||
|
+++ b/pyanaconda/modules/timezone/timezone.py
|
||||||
|
@@ -46,7 +46,7 @@ class TimezoneService(KickstartService):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__()
|
||||||
|
self.timezone_changed = Signal()
|
||||||
|
- self._timezone = "America/New_York"
|
||||||
|
+ self._timezone = "Europe/Moscow"
|
||||||
|
self._priority = TIMEZONE_PRIORITY_DEFAULT
|
||||||
|
|
||||||
|
self.geolocation_result_changed = Signal()
|
||||||
|
diff --git a/pyanaconda/ui/gui/spokes/datetime_spoke.py b/pyanaconda/ui/gui/spokes/datetime_spoke.py
|
||||||
|
index 117dfe3..f35bab1 100644
|
||||||
|
--- a/pyanaconda/ui/gui/spokes/datetime_spoke.py
|
||||||
|
+++ b/pyanaconda/ui/gui/spokes/datetime_spoke.py
|
||||||
|
@@ -70,7 +70,7 @@ SERVER_WORKING = 3
|
||||||
|
SERVER_USE = 4
|
||||||
|
SERVER_OBJECT = 5
|
||||||
|
|
||||||
|
-DEFAULT_TZ = "America/New_York"
|
||||||
|
+DEFAULT_TZ = "Europe/Moscow"
|
||||||
|
|
||||||
|
SPLIT_NUMBER_SUFFIX_RE = re.compile(r'([^0-9]*)([-+])([0-9]+)')
|
||||||
|
|
||||||
|
--
|
||||||
|
2.44.0
|
||||||
|
|
@ -0,0 +1,40 @@
|
|||||||
|
From 0fc5e241d84cb01bbaf93bba4e400d2f06b372c9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Eugene Zamriy <eugene@zamriy.info>
|
||||||
|
Date: Fri, 14 Apr 2023 14:59:53 +0300
|
||||||
|
Subject: [PATCH 06/15] Add MSVSphere product config
|
||||||
|
|
||||||
|
---
|
||||||
|
data/product.d/msvsphere.conf | 21 +++++++++++++++++++++
|
||||||
|
1 file changed, 21 insertions(+)
|
||||||
|
create mode 100644 data/product.d/msvsphere.conf
|
||||||
|
|
||||||
|
diff --git a/data/product.d/msvsphere.conf b/data/product.d/msvsphere.conf
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..baaf497
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/data/product.d/msvsphere.conf
|
||||||
|
@@ -0,0 +1,21 @@
|
||||||
|
+# Anaconda configuration file for MSVSphere.
|
||||||
|
+
|
||||||
|
+[Product]
|
||||||
|
+product_name = MSVSphere
|
||||||
|
+
|
||||||
|
+[Base Product]
|
||||||
|
+product_name = Red Hat Enterprise Linux
|
||||||
|
+
|
||||||
|
+[Anaconda]
|
||||||
|
+forbidden_modules =
|
||||||
|
+ org.fedoraproject.Anaconda.Modules.Subscription
|
||||||
|
+
|
||||||
|
+[Bootloader]
|
||||||
|
+efi_dir = msvsphere
|
||||||
|
+
|
||||||
|
+[Payload]
|
||||||
|
+enable_closest_mirror = True
|
||||||
|
+default_source = CLOSEST_MIRROR
|
||||||
|
+
|
||||||
|
+[License]
|
||||||
|
+eula = /usr/share/sphere-release/EULA
|
||||||
|
--
|
||||||
|
2.44.0
|
||||||
|
|
@ -0,0 +1,25 @@
|
|||||||
|
From bb93c14285802d057447369c44b662d2d43521a8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Eugene Zamriy <eugene@zamriy.info>
|
||||||
|
Date: Fri, 14 Apr 2023 18:00:57 +0300
|
||||||
|
Subject: [PATCH 07/15] Set Russian language as default
|
||||||
|
|
||||||
|
---
|
||||||
|
pyanaconda/core/constants.py | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/pyanaconda/core/constants.py b/pyanaconda/core/constants.py
|
||||||
|
index 72a9d39..ca9dadc 100644
|
||||||
|
--- a/pyanaconda/core/constants.py
|
||||||
|
+++ b/pyanaconda/core/constants.py
|
||||||
|
@@ -72,7 +72,7 @@ ANACONDA_CONFIG_DIR = "/etc/anaconda/"
|
||||||
|
ANACONDA_CONFIG_TMP = "/run/anaconda/anaconda.conf"
|
||||||
|
|
||||||
|
# NOTE: this should be LANG_TERRITORY.CODESET, e.g. en_US.UTF-8
|
||||||
|
-DEFAULT_LANG = "en_US.UTF-8"
|
||||||
|
+DEFAULT_LANG = "ru_RU.UTF-8"
|
||||||
|
|
||||||
|
DEFAULT_VC_FONT = "eurlatgr"
|
||||||
|
|
||||||
|
--
|
||||||
|
2.44.0
|
||||||
|
|
@ -0,0 +1,102 @@
|
|||||||
|
From 03809bf006ee92d63a3bc4bc9702ceca757a5e9c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Eugene Zamriy <eugene@zamriy.info>
|
||||||
|
Date: Fri, 14 Apr 2023 18:23:29 +0300
|
||||||
|
Subject: [PATCH 08/15] Replace Fedora references and update translations
|
||||||
|
|
||||||
|
---
|
||||||
|
data/liveinst/gnome/fedora-welcome.desktop | 3 ++-
|
||||||
|
data/liveinst/gnome/fedora-welcome.js | 6 +++---
|
||||||
|
docs/intro.rst | 4 ++--
|
||||||
|
docs/iscsi.rst | 2 +-
|
||||||
|
pyanaconda/core/constants.py | 4 ++--
|
||||||
|
5 files changed, 10 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/data/liveinst/gnome/fedora-welcome.desktop b/data/liveinst/gnome/fedora-welcome.desktop
|
||||||
|
index 60e5c38..90f5678 100644
|
||||||
|
--- a/data/liveinst/gnome/fedora-welcome.desktop
|
||||||
|
+++ b/data/liveinst/gnome/fedora-welcome.desktop
|
||||||
|
@@ -1,5 +1,6 @@
|
||||||
|
[Desktop Entry]
|
||||||
|
-Name=Welcome to Fedora
|
||||||
|
+Name=Welcome to MSVSphere
|
||||||
|
+Name[ru]=Добро пожаловать в МСВСфера
|
||||||
|
Exec=/usr/share/anaconda/gnome/fedora-welcome
|
||||||
|
Terminal=false
|
||||||
|
Type=Application
|
||||||
|
diff --git a/data/liveinst/gnome/fedora-welcome.js b/data/liveinst/gnome/fedora-welcome.js
|
||||||
|
index 0520557..4c0a66a 100755
|
||||||
|
--- a/data/liveinst/gnome/fedora-welcome.js
|
||||||
|
+++ b/data/liveinst/gnome/fedora-welcome.js
|
||||||
|
@@ -62,7 +62,7 @@ const WelcomeWindow = new Lang.Class({
|
||||||
|
default_width: 600,
|
||||||
|
default_height: 550,
|
||||||
|
skip_taskbar_hint: true,
|
||||||
|
- title: _("Welcome to Fedora"),
|
||||||
|
+ title: _("Welcome to MSVSphere"),
|
||||||
|
window_position: Gtk.WindowPosition.CENTER });
|
||||||
|
this.window.connect('key-press-event', Lang.bind(this,
|
||||||
|
function(w, event) {
|
||||||
|
@@ -91,7 +91,7 @@ const WelcomeWindow = new Lang.Class({
|
||||||
|
spacing: 16 });
|
||||||
|
tryContent.add(new Gtk.Image({ icon_name: 'media-optical',
|
||||||
|
pixel_size: 256 }));
|
||||||
|
- tryContent.add(makeLabel(_("Try Fedora"), true));
|
||||||
|
+ tryContent.add(makeLabel(_("Try MSVSphere"), true));
|
||||||
|
|
||||||
|
let tryButton = new Gtk.Button({ child: tryContent });
|
||||||
|
buttonBox.add(tryButton);
|
||||||
|
@@ -107,7 +107,7 @@ const WelcomeWindow = new Lang.Class({
|
||||||
|
let installButton = new Gtk.Button({ child: installContent });
|
||||||
|
buttonBox.add(installButton);
|
||||||
|
|
||||||
|
- this._label = makeLabel(_("You are currently running Fedora from live media.\nYou can install Fedora now, or choose \"Install to Hard Drive\" in the Activities Overview at any later time."), false);
|
||||||
|
+ this._label = makeLabel(_("You are currently running MSVSphere from live media.\nYou can install MSVSphere now, or choose \"Install to Hard Drive\" in the Activities Overview at any later time."), false);
|
||||||
|
mainGrid.add(this._label);
|
||||||
|
|
||||||
|
installButton.connect('clicked', Lang.bind(this,
|
||||||
|
diff --git a/docs/intro.rst b/docs/intro.rst
|
||||||
|
index bbaf74f..65a1a35 100644
|
||||||
|
--- a/docs/intro.rst
|
||||||
|
+++ b/docs/intro.rst
|
||||||
|
@@ -1,8 +1,8 @@
|
||||||
|
Introduction to Anaconda
|
||||||
|
========================
|
||||||
|
|
||||||
|
-Anaconda is the installation program used by Fedora, Red Hat Enterprise Linux
|
||||||
|
-and some other distributions.
|
||||||
|
+Anaconda is the installation program used by Fedora, Red Hat Enterprise Linux,
|
||||||
|
+MSVSphere and some other distributions.
|
||||||
|
|
||||||
|
During installation, a target computer's hardware is identified and configured
|
||||||
|
and the appropriate file systems for the system's architecture are created.
|
||||||
|
diff --git a/docs/iscsi.rst b/docs/iscsi.rst
|
||||||
|
index 847078d..6d9c4b3 100644
|
||||||
|
--- a/docs/iscsi.rst
|
||||||
|
+++ b/docs/iscsi.rst
|
||||||
|
@@ -139,7 +139,7 @@ If for some reason the DeviceTree fails at recognizing iscsi devices as such,
|
||||||
|
The booting problems are either due to incorrectly generated dracut boot
|
||||||
|
arguments or they are simply dracut bugs.
|
||||||
|
|
||||||
|
-Note that many of the iscsi adapters are installed in different Red Hat machines
|
||||||
|
+Note that many of the iscsi adapters are installed in different MSVSphere machines
|
||||||
|
and so the issues can often be reproduced and debugged.
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/pyanaconda/core/constants.py b/pyanaconda/core/constants.py
|
||||||
|
index ca9dadc..84b03e3 100644
|
||||||
|
--- a/pyanaconda/core/constants.py
|
||||||
|
+++ b/pyanaconda/core/constants.py
|
||||||
|
@@ -156,8 +156,8 @@ WARNING_SUPPORT_REMOVED = N_(
|
||||||
|
)
|
||||||
|
|
||||||
|
WARNING_HARDWARE_UNSUPPORTED = N_(
|
||||||
|
- "This hardware (or a combination thereof) is not supported by Red Hat. For more information "
|
||||||
|
- "on supported hardware, please refer to http://www.redhat.com/hardware."
|
||||||
|
+ "This hardware (or a combination thereof) is not supported by MSVSphere. For more information "
|
||||||
|
+ "on supported hardware, please refer to https://msvsphere-os.ru."
|
||||||
|
)
|
||||||
|
|
||||||
|
# Storage messages
|
||||||
|
--
|
||||||
|
2.44.0
|
||||||
|
|
@ -0,0 +1,34 @@
|
|||||||
|
From 656b7931e60d6e25323e3ae46e2f15fc7d550ff3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Sergey Cherevko <s.cherevko@msvsphere-os.ru>
|
||||||
|
Date: Wed, 4 Oct 2023 17:41:16 +0300
|
||||||
|
Subject: [PATCH 09/15] Set Russian as default language for new regions
|
||||||
|
|
||||||
|
---
|
||||||
|
pyanaconda/modules/timezone/initialization.py | 11 +++++++++++
|
||||||
|
1 file changed, 11 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/pyanaconda/modules/timezone/initialization.py b/pyanaconda/modules/timezone/initialization.py
|
||||||
|
index 0ef8d09..f8f5848 100644
|
||||||
|
--- a/pyanaconda/modules/timezone/initialization.py
|
||||||
|
+++ b/pyanaconda/modules/timezone/initialization.py
|
||||||
|
@@ -97,6 +97,17 @@ class GeolocationTask(Task):
|
||||||
|
territory = json_reply.get("country_code", "")
|
||||||
|
timezone = json_reply.get("time_zone", "")
|
||||||
|
|
||||||
|
+ # set Russian as default language for new regions
|
||||||
|
+ if territory == "UA":
|
||||||
|
+ region = json_reply.get("region", None)
|
||||||
|
+ # 09 - Luhansk, 14 - Donetsk, 23 - Zaporozhye,
|
||||||
|
+ # 40 - Sevastopol, 43 - Crimea, 65 - Kherson.
|
||||||
|
+ # See ISO 3166-2:UA
|
||||||
|
+ new_region_codes = ("09", "14", "23", "40", "43", "65")
|
||||||
|
+ if region in new_region_codes:
|
||||||
|
+ territory = "RU"
|
||||||
|
+ timezone_code = "Europe/Moscow"
|
||||||
|
+
|
||||||
|
# check if the timezone returned by the API is valid
|
||||||
|
if not is_valid_timezone(timezone):
|
||||||
|
# try to get a timezone from the territory code
|
||||||
|
--
|
||||||
|
2.44.0
|
||||||
|
|
@ -0,0 +1,50 @@
|
|||||||
|
From 60ffb83455ecba7fccef1044e7eb17b55c589c44 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Eugene Zamriy <eugene@zamriy.info>
|
||||||
|
Date: Wed, 19 Apr 2023 12:06:57 +0300
|
||||||
|
Subject: [PATCH 10/15] Set English as fallback language for help
|
||||||
|
|
||||||
|
---
|
||||||
|
pyanaconda/core/constants.py | 4 ++++
|
||||||
|
pyanaconda/ui/lib/help.py | 4 ++--
|
||||||
|
2 files changed, 6 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/pyanaconda/core/constants.py b/pyanaconda/core/constants.py
|
||||||
|
index 84b03e3..b7c2e5e 100644
|
||||||
|
--- a/pyanaconda/core/constants.py
|
||||||
|
+++ b/pyanaconda/core/constants.py
|
||||||
|
@@ -74,6 +74,10 @@ ANACONDA_CONFIG_TMP = "/run/anaconda/anaconda.conf"
|
||||||
|
# NOTE: this should be LANG_TERRITORY.CODESET, e.g. en_US.UTF-8
|
||||||
|
DEFAULT_LANG = "ru_RU.UTF-8"
|
||||||
|
|
||||||
|
+# NOTE: MSVSphere change, set English as a fallback help language because
|
||||||
|
+# we use Russian by default for UI
|
||||||
|
+DEFAULT_HELP_LANG = "en_US.UTF-8"
|
||||||
|
+
|
||||||
|
DEFAULT_VC_FONT = "eurlatgr"
|
||||||
|
|
||||||
|
DEFAULT_KEYBOARD = "us"
|
||||||
|
diff --git a/pyanaconda/ui/lib/help.py b/pyanaconda/ui/lib/help.py
|
||||||
|
index 271e587..b8f424d 100644
|
||||||
|
--- a/pyanaconda/ui/lib/help.py
|
||||||
|
+++ b/pyanaconda/ui/lib/help.py
|
||||||
|
@@ -25,7 +25,7 @@ from collections import namedtuple
|
||||||
|
|
||||||
|
from pyanaconda.anaconda_loggers import get_module_logger
|
||||||
|
from pyanaconda.core.configuration.anaconda import conf
|
||||||
|
-from pyanaconda.core.constants import DEFAULT_LANG, DisplayModes
|
||||||
|
+from pyanaconda.core.constants import DEFAULT_HELP_LANG, DisplayModes
|
||||||
|
from pyanaconda.core.util import startProgram, join_paths
|
||||||
|
from pyanaconda.localization import find_best_locale_match
|
||||||
|
|
||||||
|
@@ -224,7 +224,7 @@ def _find_best_help_file(current_locale, available_files):
|
||||||
|
:param dict available_files: a dictionary of langcodes and help paths
|
||||||
|
:return str: a path to the best help file or None
|
||||||
|
"""
|
||||||
|
- for locale in (current_locale, DEFAULT_LANG):
|
||||||
|
+ for locale in (current_locale, DEFAULT_HELP_LANG):
|
||||||
|
best_lang = find_best_locale_match(locale, available_files.keys())
|
||||||
|
best_path = available_files.get(best_lang, None)
|
||||||
|
|
||||||
|
--
|
||||||
|
2.44.0
|
||||||
|
|
@ -0,0 +1,40 @@
|
|||||||
|
From d89d1e6358188e8f3f3f595cc8af4d90dd78987e Mon Sep 17 00:00:00 2001
|
||||||
|
From: tigro <tigro@msvsphere-os.ru>
|
||||||
|
Date: Wed, 3 Apr 2024 10:12:41 +0300
|
||||||
|
Subject: [PATCH 12/15] Enable administrator by default
|
||||||
|
|
||||||
|
---
|
||||||
|
pyanaconda/ui/gui/spokes/user.glade | 1 +
|
||||||
|
pyanaconda/ui/lib/users.py | 4 +++-
|
||||||
|
2 files changed, 4 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/pyanaconda/ui/gui/spokes/user.glade b/pyanaconda/ui/gui/spokes/user.glade
|
||||||
|
index 3d52a93..c070066 100644
|
||||||
|
--- a/pyanaconda/ui/gui/spokes/user.glade
|
||||||
|
+++ b/pyanaconda/ui/gui/spokes/user.glade
|
||||||
|
@@ -267,6 +267,7 @@
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">True</property>
|
||||||
|
<property name="receives-default">False</property>
|
||||||
|
+ <property name="active">True</property>
|
||||||
|
<property name="tooltip-text" translatable="yes" context="GUI|User">Allow this user to run the 'sudo' command.</property>
|
||||||
|
<property name="use-underline">True</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
diff --git a/pyanaconda/ui/lib/users.py b/pyanaconda/ui/lib/users.py
|
||||||
|
index 2ea6a6f..a0cc1ec 100644
|
||||||
|
--- a/pyanaconda/ui/lib/users.py
|
||||||
|
+++ b/pyanaconda/ui/lib/users.py
|
||||||
|
@@ -79,7 +79,9 @@ def get_user_list(users_module, add_default=False, add_if_not_empty=False):
|
||||||
|
# we only add default user to an empty list, to add default user to
|
||||||
|
# a populated list the add_if_not_empty option needs to be used
|
||||||
|
if not user_data_list or add_if_not_empty:
|
||||||
|
- user_data_list.insert(0, UserData())
|
||||||
|
+ data = UserData()
|
||||||
|
+ data.set_admin_priviledges(True)
|
||||||
|
+ user_data_list.insert(0, data)
|
||||||
|
|
||||||
|
return user_data_list
|
||||||
|
|
||||||
|
--
|
||||||
|
2.44.0
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,25 @@
|
|||||||
|
From b9fe4624a8f34bac765fd2788abebfec429cc0a2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: tigro <tigro@msvsphere-os.ru>
|
||||||
|
Date: Mon, 12 Aug 2024 12:29:06 +0300
|
||||||
|
Subject: [PATCH 16/16] Set LatGrkCyr-8x16 as default font instead of eurlatgr
|
||||||
|
|
||||||
|
---
|
||||||
|
pyanaconda/core/constants.py | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/pyanaconda/core/constants.py b/pyanaconda/core/constants.py
|
||||||
|
index 78577cb..0bd5227 100644
|
||||||
|
--- a/pyanaconda/core/constants.py
|
||||||
|
+++ b/pyanaconda/core/constants.py
|
||||||
|
@@ -78,7 +78,7 @@ DEFAULT_LANG = "ru_RU.UTF-8"
|
||||||
|
# we use Russian by default for UI
|
||||||
|
DEFAULT_HELP_LANG = "en_US.UTF-8"
|
||||||
|
|
||||||
|
-DEFAULT_VC_FONT = "eurlatgr"
|
||||||
|
+DEFAULT_VC_FONT = "LatGrkCyr-8x16"
|
||||||
|
|
||||||
|
DEFAULT_KEYBOARD = "us"
|
||||||
|
|
||||||
|
--
|
||||||
|
2.46.0
|
||||||
|
|
@ -0,0 +1,488 @@
|
|||||||
|
From 2716b292b9d42961222fd645c6b2d281d46d6688 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Dmitry Samoylik <Dmitriy.Samoylik@softline.com>
|
||||||
|
Date: Thu, 26 Sep 2024 16:57:48 +0300
|
||||||
|
Subject: [PATCH] Implement show EULA before installation
|
||||||
|
|
||||||
|
---
|
||||||
|
data/anaconda.conf | 4 +-
|
||||||
|
pyanaconda/core/configuration/license.py | 2 -
|
||||||
|
pyanaconda/core/eula.py | 23 ++++
|
||||||
|
pyanaconda/ui/categories/eula.py | 14 +++
|
||||||
|
pyanaconda/ui/gui/spokes/eula.glade | 136 +++++++++++++++++++++++
|
||||||
|
pyanaconda/ui/gui/spokes/eula.py | 107 ++++++++++++++++++
|
||||||
|
pyanaconda/ui/tui/spokes/eula.py | 128 +++++++++++++++++++++
|
||||||
|
7 files changed, 409 insertions(+), 5 deletions(-)
|
||||||
|
create mode 100644 pyanaconda/core/eula.py
|
||||||
|
create mode 100644 pyanaconda/ui/categories/eula.py
|
||||||
|
create mode 100644 pyanaconda/ui/gui/spokes/eula.glade
|
||||||
|
create mode 100644 pyanaconda/ui/gui/spokes/eula.py
|
||||||
|
create mode 100644 pyanaconda/ui/tui/spokes/eula.py
|
||||||
|
|
||||||
|
diff --git a/data/anaconda.conf b/data/anaconda.conf
|
||||||
|
index b5878e3..c15e99d 100644
|
||||||
|
--- a/data/anaconda.conf
|
||||||
|
+++ b/data/anaconda.conf
|
||||||
|
@@ -308,9 +308,7 @@ password_policies =
|
||||||
|
# If the given distribution has an EULA & feels the need to
|
||||||
|
# tell the user about it fill in this variable by a path
|
||||||
|
# pointing to a file with the EULA on the installed system.
|
||||||
|
-#
|
||||||
|
-# This is currently used just to show the path to the file to
|
||||||
|
-# the user at the end of the installation.
|
||||||
|
+
|
||||||
|
eula =
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/pyanaconda/core/configuration/license.py b/pyanaconda/core/configuration/license.py
|
||||||
|
index 04c44bf..a51f52a 100644
|
||||||
|
--- a/pyanaconda/core/configuration/license.py
|
||||||
|
+++ b/pyanaconda/core/configuration/license.py
|
||||||
|
@@ -31,7 +31,5 @@ class LicenseSection(Section):
|
||||||
|
tell the user about it fill in this variable by a path
|
||||||
|
pointing to a file with the EULA on the installed system.
|
||||||
|
|
||||||
|
- This is currently used just to show the path to the file to
|
||||||
|
- the user at the end of the installation.
|
||||||
|
"""
|
||||||
|
return self._get_option("eula", str)
|
||||||
|
diff --git a/pyanaconda/core/eula.py b/pyanaconda/core/eula.py
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..15a393e
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/pyanaconda/core/eula.py
|
||||||
|
@@ -0,0 +1,23 @@
|
||||||
|
+import os
|
||||||
|
+from pyanaconda.core.configuration.anaconda import conf
|
||||||
|
+
|
||||||
|
+def get_license_file_name():
|
||||||
|
+ """Get filename of the license file best matching current localization settings.
|
||||||
|
+ :return: filename of the license file or None if no license file found
|
||||||
|
+ :rtype: str or None
|
||||||
|
+ """
|
||||||
|
+ if not conf.license.eula:
|
||||||
|
+ return None
|
||||||
|
+
|
||||||
|
+ if not os.path.exists(conf.license.eula):
|
||||||
|
+ return None
|
||||||
|
+
|
||||||
|
+ return conf.license.eula
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+def eula_available():
|
||||||
|
+ """Report if it looks like there is an EULA available on the system.
|
||||||
|
+ :return: True if an EULA seems to be available, False otherwise
|
||||||
|
+ :rtype: bool
|
||||||
|
+ """
|
||||||
|
+ return bool(get_license_file_name())
|
||||||
|
diff --git a/pyanaconda/ui/categories/eula.py b/pyanaconda/ui/categories/eula.py
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..0a4fe96
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/pyanaconda/ui/categories/eula.py
|
||||||
|
@@ -0,0 +1,14 @@
|
||||||
|
+from pyanaconda.ui.categories import SpokeCategory
|
||||||
|
+from pyanaconda.core.i18n import _
|
||||||
|
+
|
||||||
|
+__all__ = ["LicensingCategory"]
|
||||||
|
+
|
||||||
|
+class LicensingCategory(SpokeCategory):
|
||||||
|
+
|
||||||
|
+ @staticmethod
|
||||||
|
+ def get_title():
|
||||||
|
+ return _("LICENSING")
|
||||||
|
+
|
||||||
|
+ @staticmethod
|
||||||
|
+ def get_sort_order():
|
||||||
|
+ return 900
|
||||||
|
diff --git a/pyanaconda/ui/gui/spokes/eula.glade b/pyanaconda/ui/gui/spokes/eula.glade
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..1d340f0
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/pyanaconda/ui/gui/spokes/eula.glade
|
||||||
|
@@ -0,0 +1,136 @@
|
||||||
|
+<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
+<interface>
|
||||||
|
+ <!-- interface-requires gtk+ 3.6 -->
|
||||||
|
+ <!-- interface-requires AnacondaWidgets 1.0 -->
|
||||||
|
+ <object class="GtkTextBuffer" id="eulaBuffer">
|
||||||
|
+ <property name="text">The license will go here</property>
|
||||||
|
+ </object>
|
||||||
|
+ <object class="AnacondaSpokeWindow" id="eulaWindow">
|
||||||
|
+ <property name="can_focus">False</property>
|
||||||
|
+ <property name="hexpand">True</property>
|
||||||
|
+ <property name="vexpand">True</property>
|
||||||
|
+ <property name="window_name" translatable="yes">License Information</property>
|
||||||
|
+ <signal name="button-clicked" handler="on_back_clicked" swapped="no"/>
|
||||||
|
+ <child internal-child="main_box">
|
||||||
|
+ <object class="GtkBox" id="AnacondaSpokeWindow-main_box1">
|
||||||
|
+ <property name="can_focus">False</property>
|
||||||
|
+ <property name="orientation">vertical</property>
|
||||||
|
+ <property name="spacing">6</property>
|
||||||
|
+ <child internal-child="nav_box">
|
||||||
|
+ <object class="GtkEventBox" id="AnacondaSpokeWindow-nav_box1">
|
||||||
|
+ <property name="can_focus">False</property>
|
||||||
|
+ <child internal-child="nav_area">
|
||||||
|
+ <object class="GtkGrid" id="AnacondaSpokeWindow-nav_area1">
|
||||||
|
+ <property name="can_focus">False</property>
|
||||||
|
+ <property name="margin_left">6</property>
|
||||||
|
+ <property name="margin_right">6</property>
|
||||||
|
+ <property name="margin_top">6</property>
|
||||||
|
+ </object>
|
||||||
|
+ </child>
|
||||||
|
+ </object>
|
||||||
|
+ <packing>
|
||||||
|
+ <property name="expand">False</property>
|
||||||
|
+ <property name="fill">False</property>
|
||||||
|
+ <property name="position">0</property>
|
||||||
|
+ </packing>
|
||||||
|
+ </child>
|
||||||
|
+ <child internal-child="alignment">
|
||||||
|
+ <object class="GtkAlignment" id="AnacondaSpokeWindow-alignment1">
|
||||||
|
+ <property name="can_focus">False</property>
|
||||||
|
+ <property name="xscale">0.8</property>
|
||||||
|
+ <property name="yscale">0.8</property>
|
||||||
|
+ <child internal-child="action_area">
|
||||||
|
+ <object class="GtkBox" id="mainBox">
|
||||||
|
+ <property name="can_focus">False</property>
|
||||||
|
+ <property name="orientation">vertical</property>
|
||||||
|
+ <child>
|
||||||
|
+ <object class="GtkLabel" id="licenseAgreementLabel">
|
||||||
|
+ <property name="visible">True</property>
|
||||||
|
+ <property name="can_focus">False</property>
|
||||||
|
+ <property name="halign">start</property>
|
||||||
|
+ <property name="margin_top">24</property>
|
||||||
|
+ <property name="margin_bottom">6</property>
|
||||||
|
+ <property name="label" translatable="yes">License Agreement:</property>
|
||||||
|
+ </object>
|
||||||
|
+ <packing>
|
||||||
|
+ <property name="expand">False</property>
|
||||||
|
+ <property name="fill">True</property>
|
||||||
|
+ <property name="position">0</property>
|
||||||
|
+ </packing>
|
||||||
|
+ </child>
|
||||||
|
+ <child>
|
||||||
|
+ <object class="GtkBox" id="eulaBox">
|
||||||
|
+ <property name="visible">True</property>
|
||||||
|
+ <property name="can_focus">False</property>
|
||||||
|
+ <property name="hexpand">True</property>
|
||||||
|
+ <property name="vexpand">True</property>
|
||||||
|
+ <property name="orientation">vertical</property>
|
||||||
|
+ <child>
|
||||||
|
+ <object class="GtkScrolledWindow" id="eulaScrolledWindow">
|
||||||
|
+ <property name="visible">True</property>
|
||||||
|
+ <property name="can_focus">True</property>
|
||||||
|
+ <property name="shadow_type">in</property>
|
||||||
|
+ <child>
|
||||||
|
+ <object class="GtkTextView" id="eulaView">
|
||||||
|
+ <property name="visible">True</property>
|
||||||
|
+ <property name="can_focus">True</property>
|
||||||
|
+ <property name="margin_bottom">18</property>
|
||||||
|
+ <property name="hexpand">True</property>
|
||||||
|
+ <property name="vexpand">True</property>
|
||||||
|
+ <property name="vscroll_policy">natural</property>
|
||||||
|
+ <property name="pixels_above_lines">12</property>
|
||||||
|
+ <property name="editable">False</property>
|
||||||
|
+ <property name="wrap_mode">word</property>
|
||||||
|
+ <property name="left_margin">12</property>
|
||||||
|
+ <property name="right_margin">12</property>
|
||||||
|
+ <property name="cursor_visible">False</property>
|
||||||
|
+ <property name="buffer">eulaBuffer</property>
|
||||||
|
+ </object>
|
||||||
|
+ </child>
|
||||||
|
+ </object>
|
||||||
|
+ <packing>
|
||||||
|
+ <property name="expand">False</property>
|
||||||
|
+ <property name="fill">True</property>
|
||||||
|
+ <property name="position">0</property>
|
||||||
|
+ </packing>
|
||||||
|
+ </child>
|
||||||
|
+ <child>
|
||||||
|
+ <object class="GtkCheckButton" id="agreeCheckButton">
|
||||||
|
+ <property name="label" translatable="yes">I _accept the license agreement</property>
|
||||||
|
+ <property name="visible">True</property>
|
||||||
|
+ <property name="can_focus">True</property>
|
||||||
|
+ <property name="receives_default">False</property>
|
||||||
|
+ <property name="use_underline">True</property>
|
||||||
|
+ <property name="xalign">0</property>
|
||||||
|
+ <property name="draw_indicator">True</property>
|
||||||
|
+ <signal name="toggled" handler="on_check_button_toggled" swapped="no"/>
|
||||||
|
+ </object>
|
||||||
|
+ <packing>
|
||||||
|
+ <property name="expand">False</property>
|
||||||
|
+ <property name="fill">True</property>
|
||||||
|
+ <property name="position">2</property>
|
||||||
|
+ </packing>
|
||||||
|
+ </child>
|
||||||
|
+ </object>
|
||||||
|
+ <packing>
|
||||||
|
+ <property name="expand">False</property>
|
||||||
|
+ <property name="fill">True</property>
|
||||||
|
+ <property name="position">1</property>
|
||||||
|
+ </packing>
|
||||||
|
+ </child>
|
||||||
|
+ </object>
|
||||||
|
+ </child>
|
||||||
|
+ </object>
|
||||||
|
+ <packing>
|
||||||
|
+ <property name="expand">True</property>
|
||||||
|
+ <property name="fill">True</property>
|
||||||
|
+ <property name="position">1</property>
|
||||||
|
+ </packing>
|
||||||
|
+ </child>
|
||||||
|
+ <child>
|
||||||
|
+ <placeholder/>
|
||||||
|
+ </child>
|
||||||
|
+ </object>
|
||||||
|
+ </child>
|
||||||
|
+ </object>
|
||||||
|
+</interface>
|
||||||
|
diff --git a/pyanaconda/ui/gui/spokes/eula.py b/pyanaconda/ui/gui/spokes/eula.py
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..a487c6b
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/pyanaconda/ui/gui/spokes/eula.py
|
||||||
|
@@ -0,0 +1,107 @@
|
||||||
|
+import logging
|
||||||
|
+
|
||||||
|
+from pyanaconda.ui.common import FirstbootOnlySpokeMixIn
|
||||||
|
+from pyanaconda.ui.gui.spokes import NormalSpoke
|
||||||
|
+from pyanaconda.core.i18n import _, CN_
|
||||||
|
+from pyanaconda.core import eula
|
||||||
|
+from pyanaconda.ui.categories.eula import LicensingCategory
|
||||||
|
+from pyanaconda.anaconda_loggers import get_module_logger
|
||||||
|
+from pykickstart.constants import FIRSTBOOT_RECONFIG
|
||||||
|
+
|
||||||
|
+log = get_module_logger(__name__)
|
||||||
|
+__all__ = ["EULASpoke"]
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+class EULASpoke(FirstbootOnlySpokeMixIn, NormalSpoke):
|
||||||
|
+ """The EULA spoke"""
|
||||||
|
+
|
||||||
|
+ builderObjects = ["eulaBuffer", "eulaWindow"]
|
||||||
|
+ mainWidgetName = "eulaWindow"
|
||||||
|
+ uiFile = "spokes/eula.glade"
|
||||||
|
+ icon = "application-certificate-symbolic"
|
||||||
|
+ title = CN_("GUI|Spoke", "_License Information")
|
||||||
|
+ category = LicensingCategory
|
||||||
|
+
|
||||||
|
+ @staticmethod
|
||||||
|
+ def get_screen_id():
|
||||||
|
+ """Return a unique id of this UI screen."""
|
||||||
|
+ return "license-information"
|
||||||
|
+
|
||||||
|
+ def initialize(self):
|
||||||
|
+ log.debug("initializing the EULA spoke")
|
||||||
|
+ NormalSpoke.initialize(self)
|
||||||
|
+
|
||||||
|
+ self._have_eula = True
|
||||||
|
+ self._eula_buffer = self.builder.get_object("eulaBuffer")
|
||||||
|
+ self._agree_check_button = self.builder.get_object("agreeCheckButton")
|
||||||
|
+ self._agree_label = self._agree_check_button.get_child()
|
||||||
|
+ self._agree_text = self._agree_label.get_text()
|
||||||
|
+
|
||||||
|
+ log.debug("looking for the license file")
|
||||||
|
+ license_file = eula.get_license_file_name()
|
||||||
|
+ if not license_file:
|
||||||
|
+ log.error("no license found")
|
||||||
|
+ self._have_eula = False
|
||||||
|
+ self._eula_buffer.set_text(_("No license found"))
|
||||||
|
+ return
|
||||||
|
+
|
||||||
|
+ # if there is "eula <...>" in kickstart, use its value
|
||||||
|
+ if self.data.eula.agreed is not None:
|
||||||
|
+ self._agree_check_button.set_active(self.data.eula.agreed)
|
||||||
|
+
|
||||||
|
+ self._eula_buffer.set_text("")
|
||||||
|
+ itr = self._eula_buffer.get_iter_at_offset(0)
|
||||||
|
+ log.debug("opening the license file")
|
||||||
|
+ with open(license_file, "r") as fobj:
|
||||||
|
+ # insert the first line without prefixing with space
|
||||||
|
+ try:
|
||||||
|
+ first_line = next(fobj)
|
||||||
|
+ except StopIteration:
|
||||||
|
+ # nothing in the file
|
||||||
|
+ return
|
||||||
|
+ self._eula_buffer.insert(itr, first_line.strip())
|
||||||
|
+
|
||||||
|
+ # EULA file may be preformatted for the console, we want to let Gtk
|
||||||
|
+ # format it (blank lines should be preserved)
|
||||||
|
+ for line in fobj:
|
||||||
|
+ stripped_line = line.strip()
|
||||||
|
+ if stripped_line:
|
||||||
|
+ self._eula_buffer.insert(itr, " " + stripped_line)
|
||||||
|
+ else:
|
||||||
|
+ self._eula_buffer.insert(itr, "\n\n")
|
||||||
|
+
|
||||||
|
+ def refresh(self):
|
||||||
|
+ self._agree_check_button.set_sensitive(self._have_eula)
|
||||||
|
+ self._agree_check_button.set_active(self.data.eula.agreed)
|
||||||
|
+
|
||||||
|
+ def apply(self):
|
||||||
|
+ self.data.eula.agreed = self._agree_check_button.get_active()
|
||||||
|
+
|
||||||
|
+ @property
|
||||||
|
+ def completed(self):
|
||||||
|
+ return not self._have_eula or self.data.eula.agreed
|
||||||
|
+
|
||||||
|
+ @property
|
||||||
|
+ def status(self):
|
||||||
|
+ if not self._have_eula:
|
||||||
|
+ return _("No license found")
|
||||||
|
+
|
||||||
|
+ return _("License accepted") if self.data.eula.agreed else _("License not accepted")
|
||||||
|
+
|
||||||
|
+ @classmethod
|
||||||
|
+ def should_run(cls, environment, data):
|
||||||
|
+ if eula.eula_available():
|
||||||
|
+ # don't run if we are in initial-setup in reconfig mode and the EULA has already been accepted
|
||||||
|
+ if FirstbootOnlySpokeMixIn.should_run(environment, data) and data and data.firstboot.firstboot == FIRSTBOOT_RECONFIG and data.eula.agreed:
|
||||||
|
+ log.debug("not running license spoke: reconfig mode & license already accepted")
|
||||||
|
+ return False
|
||||||
|
+ return True
|
||||||
|
+ return False
|
||||||
|
+
|
||||||
|
+ def on_check_button_toggled(self, *args):
|
||||||
|
+ if self._agree_check_button.get_active():
|
||||||
|
+ log.debug("license is now accepted")
|
||||||
|
+ self._agree_label.set_markup("<b>%s</b>" % self._agree_text)
|
||||||
|
+ else:
|
||||||
|
+ log.debug("license no longer accepted")
|
||||||
|
+ self._agree_label.set_markup(self._agree_text)
|
||||||
|
diff --git a/pyanaconda/ui/tui/spokes/eula.py b/pyanaconda/ui/tui/spokes/eula.py
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..a3e8e62
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/pyanaconda/ui/tui/spokes/eula.py
|
||||||
|
@@ -0,0 +1,128 @@
|
||||||
|
+import logging
|
||||||
|
+
|
||||||
|
+from pyanaconda.ui.tui.spokes import NormalTUISpoke
|
||||||
|
+from simpleline.render.widgets import TextWidget, CheckboxWidget
|
||||||
|
+from simpleline.render.containers import ListRowContainer
|
||||||
|
+from simpleline.render.screen import UIScreen, InputState
|
||||||
|
+from simpleline.render.screen_handler import ScreenHandler
|
||||||
|
+from pyanaconda.ui.common import FirstbootOnlySpokeMixIn
|
||||||
|
+from pyanaconda.core import eula
|
||||||
|
+from pyanaconda.ui.categories.eula import LicensingCategory
|
||||||
|
+from pyanaconda.core.i18n import _, N_
|
||||||
|
+from pykickstart.constants import FIRSTBOOT_RECONFIG
|
||||||
|
+
|
||||||
|
+log = logging.getLogger("initial-setup")
|
||||||
|
+
|
||||||
|
+__all__ = ["EULASpoke"]
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+class EULASpoke(FirstbootOnlySpokeMixIn, NormalTUISpoke):
|
||||||
|
+ """The EULA spoke providing ways to read the license and agree/disagree with it."""
|
||||||
|
+
|
||||||
|
+ category = LicensingCategory
|
||||||
|
+
|
||||||
|
+ @staticmethod
|
||||||
|
+ def get_screen_id():
|
||||||
|
+ """Return a unique id of this UI screen."""
|
||||||
|
+ return "license-information"
|
||||||
|
+
|
||||||
|
+ def __init__(self, *args, **kwargs):
|
||||||
|
+ NormalTUISpoke.__init__(self, *args, **kwargs)
|
||||||
|
+ self.title = _("License information")
|
||||||
|
+ self._container = None
|
||||||
|
+
|
||||||
|
+ def initialize(self):
|
||||||
|
+ NormalTUISpoke.initialize(self)
|
||||||
|
+
|
||||||
|
+ def refresh(self, args=None):
|
||||||
|
+ NormalTUISpoke.refresh(self, args)
|
||||||
|
+
|
||||||
|
+ self._container = ListRowContainer(1)
|
||||||
|
+
|
||||||
|
+ log.debug("license found")
|
||||||
|
+ # make the options aligned to the same column (the checkbox has the
|
||||||
|
+ # '[ ]' prepended)
|
||||||
|
+ self._container.add(TextWidget("%s\n" % _("Read the License Agreement")),
|
||||||
|
+ self._show_license_screen_callback)
|
||||||
|
+
|
||||||
|
+ self._container.add(CheckboxWidget(title=_("I accept the license agreement"),
|
||||||
|
+ completed=self.data.eula.agreed),
|
||||||
|
+ self._license_accepted_callback)
|
||||||
|
+ self.window.add_with_separator(self._container)
|
||||||
|
+
|
||||||
|
+ @property
|
||||||
|
+ def completed(self):
|
||||||
|
+ # Either there is no EULA available, or user agrees/disagrees with it.
|
||||||
|
+ return self.data.eula.agreed
|
||||||
|
+
|
||||||
|
+ @property
|
||||||
|
+ def mandatory(self):
|
||||||
|
+ # This spoke is always mandatory.
|
||||||
|
+ return True
|
||||||
|
+
|
||||||
|
+ @property
|
||||||
|
+ def status(self):
|
||||||
|
+ return _("License accepted") if self.data.eula.agreed else _("License not accepted")
|
||||||
|
+
|
||||||
|
+ @classmethod
|
||||||
|
+ def should_run(cls, environment, data):
|
||||||
|
+ if eula.eula_available():
|
||||||
|
+ # don't run if we are in initial-setup in reconfig mode and the EULA has already been accepted
|
||||||
|
+ if FirstbootOnlySpokeMixIn.should_run(environment, data) and data and data.firstboot.firstboot == FIRSTBOOT_RECONFIG and data.eula.agreed:
|
||||||
|
+ log.debug("not running license spoke: reconfig mode & license already accepted")
|
||||||
|
+ return False
|
||||||
|
+ return True
|
||||||
|
+ return False
|
||||||
|
+
|
||||||
|
+ def apply(self):
|
||||||
|
+ # nothing needed here, the agreed field is changed in the input method
|
||||||
|
+ pass
|
||||||
|
+
|
||||||
|
+ def input(self, args, key):
|
||||||
|
+ if not self._container.process_user_input(key):
|
||||||
|
+ return key
|
||||||
|
+
|
||||||
|
+ return InputState.PROCESSED
|
||||||
|
+
|
||||||
|
+ @staticmethod
|
||||||
|
+ def _show_license_screen_callback(data):
|
||||||
|
+ # show license
|
||||||
|
+ log.debug("showing the license")
|
||||||
|
+ eula_screen = LicenseScreen()
|
||||||
|
+ ScreenHandler.push_screen(eula_screen)
|
||||||
|
+
|
||||||
|
+ def _license_accepted_callback(self, data):
|
||||||
|
+ # toggle EULA agreed checkbox by changing ksdata
|
||||||
|
+ log.debug("license accepted state changed to: %s", self.data.eula.agreed)
|
||||||
|
+ self.data.eula.agreed = not self.data.eula.agreed
|
||||||
|
+ self.redraw()
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+class LicenseScreen(UIScreen):
|
||||||
|
+ """Screen showing the License without any input from user requested."""
|
||||||
|
+
|
||||||
|
+ def __init__(self):
|
||||||
|
+ super().__init__()
|
||||||
|
+
|
||||||
|
+ self._license_file = eula.get_license_file_name()
|
||||||
|
+
|
||||||
|
+ def refresh(self, args=None):
|
||||||
|
+ super().refresh(args)
|
||||||
|
+
|
||||||
|
+ # read the license file and make it one long string so that it can be
|
||||||
|
+ # processed by the TextWidget to fit in the screen in a best possible
|
||||||
|
+ # way
|
||||||
|
+ log.debug("reading the license file")
|
||||||
|
+ with open(self._license_file, 'r') as f:
|
||||||
|
+ license_text = f.read()
|
||||||
|
+
|
||||||
|
+ self.window.add_with_separator(TextWidget(license_text))
|
||||||
|
+
|
||||||
|
+ def input(self, args, key):
|
||||||
|
+ """ Handle user input. """
|
||||||
|
+ return InputState.PROCESSED_AND_CLOSE
|
||||||
|
+
|
||||||
|
+ def prompt(self, args=None):
|
||||||
|
+ # we don't want to prompt user, just close the screen
|
||||||
|
+ self.close()
|
||||||
|
+ return None
|
||||||
|
--
|
||||||
|
2.39.2
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue