d-installer 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +29 -0
  3. data/Gemfile.lock +75 -0
  4. data/bin/d-installer +74 -0
  5. data/etc/d-installer.yaml +284 -0
  6. data/lib/dinstaller/can_ask_question.rb +48 -0
  7. data/lib/dinstaller/cmdline_args.rb +80 -0
  8. data/lib/dinstaller/cockpit_manager.rb +176 -0
  9. data/lib/dinstaller/config.rb +128 -0
  10. data/lib/dinstaller/config_reader.rb +164 -0
  11. data/lib/dinstaller/dbus/base_object.rb +58 -0
  12. data/lib/dinstaller/dbus/clients/base.rb +71 -0
  13. data/lib/dinstaller/dbus/clients/language.rb +86 -0
  14. data/lib/dinstaller/dbus/clients/manager.rb +76 -0
  15. data/lib/dinstaller/dbus/clients/software.rb +185 -0
  16. data/lib/dinstaller/dbus/clients/users.rb +112 -0
  17. data/lib/dinstaller/dbus/clients/with_progress.rb +56 -0
  18. data/lib/dinstaller/dbus/clients/with_service_status.rb +75 -0
  19. data/lib/dinstaller/dbus/clients.rb +34 -0
  20. data/lib/dinstaller/dbus/interfaces/progress.rb +113 -0
  21. data/lib/dinstaller/dbus/interfaces/service_status.rb +89 -0
  22. data/lib/dinstaller/dbus/language.rb +93 -0
  23. data/lib/dinstaller/dbus/language_service.rb +92 -0
  24. data/lib/dinstaller/dbus/manager.rb +147 -0
  25. data/lib/dinstaller/dbus/manager_service.rb +132 -0
  26. data/lib/dinstaller/dbus/question.rb +176 -0
  27. data/lib/dinstaller/dbus/questions.rb +124 -0
  28. data/lib/dinstaller/dbus/service_runner.rb +97 -0
  29. data/lib/dinstaller/dbus/service_status.rb +87 -0
  30. data/lib/dinstaller/dbus/software/manager.rb +131 -0
  31. data/lib/dinstaller/dbus/software/proposal.rb +82 -0
  32. data/lib/dinstaller/dbus/software.rb +31 -0
  33. data/lib/dinstaller/dbus/software_service.rb +86 -0
  34. data/lib/dinstaller/dbus/storage/proposal.rb +170 -0
  35. data/lib/dinstaller/dbus/storage.rb +30 -0
  36. data/lib/dinstaller/dbus/users.rb +132 -0
  37. data/lib/dinstaller/dbus/users_service.rb +92 -0
  38. data/lib/dinstaller/dbus/with_service_status.rb +48 -0
  39. data/lib/dinstaller/dbus/y2dir/manager/modules/Package.rb +51 -0
  40. data/lib/dinstaller/dbus/y2dir/manager/modules/PackagesProposal.rb +62 -0
  41. data/lib/dinstaller/dbus/y2dir/modules/Autologin.rb +214 -0
  42. data/lib/dinstaller/dbus/y2dir/software/modules/SpaceCalculation.rb +44 -0
  43. data/lib/dinstaller/dbus.rb +11 -0
  44. data/lib/dinstaller/errors.rb +28 -0
  45. data/lib/dinstaller/installation_phase.rb +106 -0
  46. data/lib/dinstaller/language.rb +73 -0
  47. data/lib/dinstaller/luks_activation_question.rb +92 -0
  48. data/lib/dinstaller/manager.rb +261 -0
  49. data/lib/dinstaller/network.rb +53 -0
  50. data/lib/dinstaller/package_callbacks.rb +69 -0
  51. data/lib/dinstaller/progress.rb +149 -0
  52. data/lib/dinstaller/question.rb +103 -0
  53. data/lib/dinstaller/questions_manager.rb +145 -0
  54. data/lib/dinstaller/security.rb +96 -0
  55. data/lib/dinstaller/service_status_recorder.rb +58 -0
  56. data/lib/dinstaller/software.rb +232 -0
  57. data/lib/dinstaller/storage/actions.rb +90 -0
  58. data/lib/dinstaller/storage/callbacks/activate.rb +93 -0
  59. data/lib/dinstaller/storage/callbacks/activate_luks.rb +93 -0
  60. data/lib/dinstaller/storage/callbacks/activate_multipath.rb +77 -0
  61. data/lib/dinstaller/storage/callbacks.rb +30 -0
  62. data/lib/dinstaller/storage/manager.rb +104 -0
  63. data/lib/dinstaller/storage/proposal.rb +197 -0
  64. data/lib/dinstaller/storage.rb +30 -0
  65. data/lib/dinstaller/users.rb +156 -0
  66. data/lib/dinstaller/with_progress.rb +63 -0
  67. data/lib/dinstaller.rb +5 -0
  68. data/share/dbus.conf +38 -0
  69. data/share/dbus.service +5 -0
  70. data/share/systemd.service +14 -0
  71. metadata +295 -0
@@ -0,0 +1,62 @@
1
+ # Copyright (c) [2022] SUSE LLC
2
+ #
3
+ # All Rights Reserved.
4
+ #
5
+ # This program is free software; you can redistribute it and/or modify it
6
+ # under the terms of version 2 of the GNU General Public License as published
7
+ # by the Free Software Foundation.
8
+ #
9
+ # This program is distributed in the hope that it will be useful, but WITHOUT
10
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12
+ # more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License along
15
+ # with this program; if not, contact SUSE LLC.
16
+ #
17
+ # To contact SUSE LLC about this file by physical or electronic mail, you may
18
+ # find current contact information at www.suse.com.
19
+
20
+ require "yast"
21
+ require "dinstaller/dbus/clients/software"
22
+
23
+ # :nodoc:
24
+ module Yast
25
+ # Replacement for the Yast::PackagesProposal module
26
+ class PackagesProposalClass < Module
27
+ def main
28
+ puts "Loading mocked module #{__FILE__}"
29
+ @client = DInstaller::DBus::Clients::Software.new
30
+ end
31
+
32
+ # @see https://github.com/yast/yast-yast2/blob/b8cd178b7f341f6e3438782cb703f4a3ab0529ed/library/general/src/modules/PackagesProposal.rb#L118
33
+ def AddResolvables(unique_id, type, resolvables, optional: false)
34
+ client.add_resolvables(unique_id, type, resolvables || [], optional: optional)
35
+ true
36
+ end
37
+
38
+ # @see https://github.com/yast/yast-yast2/blob/b8cd178b7f341f6e3438782cb703f4a3ab0529ed/library/general/src/modules/PackagesProposal.rb#L145
39
+ def SetResolvables(unique_id, type, resolvables, optional: false)
40
+ client.set_resolvables(unique_id, type, resolvables || [], optional: optional)
41
+ true
42
+ end
43
+
44
+ # @see https://github.com/yast/yast-yast2/blob/b8cd178b7f341f6e3438782cb703f4a3ab0529ed/library/general/src/modules/PackagesProposal.rb#L285
45
+ def GetResolvables(unique_id, type, optional: false)
46
+ client.get_resolvables(unique_id, type, optional: optional)
47
+ end
48
+
49
+ # @see https://github.com/yast/yast-yast2/blob/b8cd178b7f341f6e3438782cb703f4a3ab0529ed/library/general/src/modules/PackagesProposal.rb#L177
50
+ def RemoveResolvables(unique_id, type, resolvables, optional: false)
51
+ client.remove_resolvables(unique_id, type, resolvables || [], optional: optional)
52
+ true
53
+ end
54
+
55
+ private
56
+
57
+ attr_reader :client
58
+ end
59
+
60
+ PackagesProposal = PackagesProposalClass.new
61
+ PackagesProposal.main
62
+ end
@@ -0,0 +1,214 @@
1
+ # ------------------------------------------------------------------------------
2
+ # Copyright (c) 2006-2012 Novell, Inc. All Rights Reserved.
3
+ #
4
+ #
5
+ # This program is free software; you can redistribute it and/or modify it under
6
+ # the terms of version 2 of the GNU General Public License as published by the
7
+ # Free Software Foundation.
8
+ #
9
+ # This program is distributed in the hope that it will be useful, but WITHOUT
10
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11
+ # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License along with
14
+ # this program; if not, contact Novell, Inc.
15
+ #
16
+ # To contact Novell about this file by physical or electronic mail, you may find
17
+ # current contact information at www.novell.com.
18
+ # ------------------------------------------------------------------------------
19
+
20
+ # File: modules/Autologin.ycp
21
+ # Package: yast2
22
+ # Summary: Autologin read/write routines
23
+ # Author: Jiri Suchomel <jsuchome@suse.cz>
24
+ # Flags: Stable
25
+ #
26
+ # $Id$
27
+ require "yast"
28
+ require "dinstaller/dbus/clients/software"
29
+
30
+ module Yast
31
+ class AutologinClass < Module
32
+ include Yast::Logger
33
+
34
+ # Display managers that support autologin.
35
+ # Notice that xdm does NOT support it!
36
+ #
37
+ # "autologin-support" is a pseudo-"provides" that maintainers of display
38
+ # manager packages can add to indicate that the package has that
39
+ # capability.
40
+ DISPLAY_MANAGERS = ["autologin-support", "kdm", "gdm", "sddm", "lightdm"].freeze
41
+
42
+ def main
43
+ textdomain "pam"
44
+
45
+ Yast.import "Popup"
46
+
47
+ # User to log in automaticaly
48
+ @user = ""
49
+
50
+ # Login without passwords?
51
+ @pw_less = false
52
+
53
+ # Is autologin used? Usualy true when user is not empty, but for the first
54
+ # time (during installation), this can be true by default although user is ""
55
+ # (depends on the control file)
56
+ @used = false
57
+
58
+ # Autologin settings modified?
59
+ @modified = false
60
+
61
+ # Pkg stuff initialized?
62
+ @pkg_initialized = false
63
+
64
+ # Software service client
65
+ @dbus_client = nil
66
+ end
67
+
68
+ def available
69
+ @available = supported? if @available.nil?
70
+ @available
71
+ end
72
+
73
+ # Read autologin settings
74
+ # @return used?
75
+ def Read
76
+ if SCR.Read(path(".target.size"), "/etc/sysconfig/displaymanager") == -1
77
+ @available = false
78
+ @user = ""
79
+ @used = false
80
+ return false
81
+ end
82
+
83
+ @available = supported?
84
+ @user = Convert.to_string(
85
+ SCR.Read(path(".sysconfig.displaymanager.DISPLAYMANAGER_AUTOLOGIN"))
86
+ )
87
+ @pw_less = Convert.to_string(
88
+ SCR.Read(
89
+ path(".sysconfig.displaymanager.DISPLAYMANAGER_PASSWORD_LESS_LOGIN")
90
+ )
91
+ ) == "yes"
92
+
93
+ @user = "" if @user.nil? || @user == ""
94
+
95
+ @used = @user != ""
96
+ @used
97
+ end
98
+
99
+ # Write autologin settings
100
+ # @param [Boolean] write_only when true, suseconfig script will not be run
101
+ # @return written anything?
102
+ def Write(_write_only)
103
+ return false if !available || !@modified
104
+
105
+ Builtins.y2milestone(
106
+ "writing user %1 for autologin; pw_less is %2",
107
+ @user,
108
+ @pw_less
109
+ )
110
+
111
+ SCR.Write(
112
+ path(".sysconfig.displaymanager.DISPLAYMANAGER_AUTOLOGIN"),
113
+ @user
114
+ )
115
+ SCR.Write(
116
+ path(".sysconfig.displaymanager.DISPLAYMANAGER_PASSWORD_LESS_LOGIN"),
117
+ @pw_less ? "yes" : "no"
118
+ )
119
+ SCR.Write(path(".sysconfig.displaymanager"), nil)
120
+
121
+ @modified = false
122
+ true
123
+ end
124
+
125
+ # Disable autologin
126
+ def Disable
127
+ @user = ""
128
+ @pw_less = false
129
+ @used = false
130
+ @modified = true
131
+
132
+ nil
133
+ end
134
+
135
+ # Wrapper for setting the 'used' variable
136
+ def Use(use)
137
+ if @used != use
138
+ @used = use
139
+ @modified = true
140
+ end
141
+
142
+ nil
143
+ end
144
+
145
+ # Disable autologin and write it (used probably for automatic
146
+ # disabling without asking)
147
+ # @param [Boolean] write_only when true, suseconfig script will not be run
148
+ # @return written anything?
149
+ def DisableAndWrite(write_only)
150
+ Disable()
151
+ Write(write_only)
152
+ end
153
+
154
+ # Ask if autologin should be disabled (and disable it in such case)
155
+ # @param [String] new The reason for disabling autologin (e.g. new set of users)
156
+ # @return Is autologin used?
157
+ def AskForDisabling(new)
158
+ # popup text (%1 is user name, %2 is additional info,
159
+ # like "Now LDAP was enabled")
160
+ question = Builtins.sformat(
161
+ _(
162
+ "The automatic login feature is enabled for user %1.\n" +
163
+ "%2\n" +
164
+ "Disable automatic login?"
165
+ ),
166
+ @user,
167
+ new
168
+ )
169
+
170
+ Disable() if @used && Popup.YesNo(question)
171
+ @used
172
+ end
173
+
174
+ # Check if autologin is supported with the currently selected or installed
175
+ # packages.
176
+ #
177
+ # @return Boolean
178
+ def supported?
179
+ supported = dbus_client.provisions_selected?(DISPLAY_MANAGERS).any?
180
+
181
+ if supported
182
+ log.info("Autologin is supported")
183
+ else
184
+ log.info("Autologin is not supported: No package provides any of #{DISPLAY_MANAGERS}")
185
+ end
186
+
187
+ supported
188
+ end
189
+
190
+ publish variable: :user, type: "string"
191
+ publish variable: :pw_less, type: "boolean"
192
+ publish variable: :used, type: "boolean"
193
+ publish variable: :modified, type: "boolean"
194
+ publish function: :Read, type: "boolean ()"
195
+ publish function: :Write, type: "boolean (boolean)"
196
+ publish function: :Disable, type: "void ()"
197
+ publish function: :Use, type: "void (boolean)"
198
+ publish function: :supported?, type: "boolean ()"
199
+ publish function: :DisableAndWrite, type: "boolean (boolean)"
200
+ publish function: :AskForDisabling, type: "boolean (string)"
201
+
202
+ private
203
+
204
+ # Software service client
205
+ #
206
+ # @return [DInstaller::DBus::Clients::Software] Software service client
207
+ def dbus_client
208
+ @dbus_client ||= DInstaller::DBus::Clients::Software.new
209
+ end
210
+ end
211
+
212
+ Autologin = AutologinClass.new
213
+ Autologin.main
214
+ end
@@ -0,0 +1,44 @@
1
+ # Copyright (c) [2022] SUSE LLC
2
+ #
3
+ # All Rights Reserved.
4
+ #
5
+ # This program is free software; you can redistribute it and/or modify it
6
+ # under the terms of version 2 of the GNU General Public License as published
7
+ # by the Free Software Foundation.
8
+ #
9
+ # This program is distributed in the hope that it will be useful, but WITHOUT
10
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12
+ # more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License along
15
+ # with this program; if not, contact SUSE LLC.
16
+ #
17
+ # To contact SUSE LLC about this file by physical or electronic mail, you may
18
+ # find current contact information at www.suse.com.
19
+
20
+ require "yast"
21
+
22
+ # :nodoc:
23
+ module Yast
24
+ # Replacement for the Yast::SpaceCalculation module.
25
+ class SpaceCalculationClass < Module
26
+ def main
27
+ puts "Loading mocked module #{__FILE__}"
28
+ end
29
+
30
+ # @see https://github.com/yast/yast-packager/blob/master/src/modules/SpaceCalculation.rb#L711
31
+ def GetPartitionInfo; end
32
+
33
+ # @see https://github.com/yast/yast-packager/blob/master/src/modules/SpaceCalculation.rb#L860
34
+ def CheckDiskSize; end
35
+
36
+ # @see https://github.com/yast/yast-packager/blob/master/src/modules/SpaceCalculation.rb#L60
37
+ def GetFailedMounts
38
+ []
39
+ end
40
+ end
41
+
42
+ SpaceCalculation = SpaceCalculationClass.new
43
+ SpaceCalculation.main
44
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DInstaller
4
+ # Namespace for DBus API
5
+ module DBus
6
+ end
7
+ end
8
+
9
+ require "dinstaller/dbus/manager"
10
+ require "dinstaller/dbus/language"
11
+ require "dinstaller/dbus/software"
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (c) [2022] SUSE LLC
4
+ #
5
+ # All Rights Reserved.
6
+ #
7
+ # This program is free software; you can redistribute it and/or modify it
8
+ # under the terms of version 2 of the GNU General Public License as published
9
+ # by the Free Software Foundation.
10
+ #
11
+ # This program is distributed in the hope that it will be useful, but WITHOUT
12
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14
+ # more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License along
17
+ # with this program; if not, contact SUSE LLC.
18
+ #
19
+ # To contact SUSE LLC about this file by physical or electronic mail, you may
20
+ # find current contact information at www.suse.com.
21
+
22
+ module DInstaller
23
+ # Module containing common errors
24
+ module Errors
25
+ # Invalid value given by the user
26
+ class InvalidValue < StandardError; end
27
+ end
28
+ end
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (c) [2022] SUSE LLC
4
+ #
5
+ # All Rights Reserved.
6
+ #
7
+ # This program is free software; you can redistribute it and/or modify it
8
+ # under the terms of version 2 of the GNU General Public License as published
9
+ # by the Free Software Foundation.
10
+ #
11
+ # This program is distributed in the hope that it will be useful, but WITHOUT
12
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14
+ # more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License along
17
+ # with this program; if not, contact SUSE LLC.
18
+ #
19
+ # To contact SUSE LLC about this file by physical or electronic mail, you may
20
+ # find current contact information at www.suse.com.
21
+
22
+ module DInstaller
23
+ # Represents the installation phase of the manager service and allows to configure callbacks to be
24
+ # called when the installation phase value changes
25
+ class InstallationPhase
26
+ # Possible installation phase values
27
+ STARTUP = "startup"
28
+ CONFIG = "config"
29
+ INSTALL = "install"
30
+
31
+ def initialize
32
+ @on_change_callbacks = []
33
+ end
34
+
35
+ # Whether the current installation phase value is startup
36
+ #
37
+ # @return [Boolean]
38
+ def startup?
39
+ value == STARTUP
40
+ end
41
+
42
+ # Whether the current installation phase value is config
43
+ #
44
+ # @return [Boolean]
45
+ def config?
46
+ value == CONFIG
47
+ end
48
+
49
+ # Whether the current installation phase value is install
50
+ #
51
+ # @return [Boolean]
52
+ def install?
53
+ value == INSTALL
54
+ end
55
+
56
+ # Sets the installation phase value to startup
57
+ #
58
+ # @note Callbacks are called.
59
+ #
60
+ # @return [self]
61
+ def startup
62
+ change_to(STARTUP)
63
+ self
64
+ end
65
+
66
+ # Sets the installation phase value to config
67
+ #
68
+ # @note Callbacks are called.
69
+ #
70
+ # @return [self]
71
+ def config
72
+ change_to(CONFIG)
73
+ self
74
+ end
75
+
76
+ # Sets the installation phase value to install
77
+ #
78
+ # @note Callbacks are called.
79
+ #
80
+ # @return [self]
81
+ def install
82
+ change_to(INSTALL)
83
+ self
84
+ end
85
+
86
+ # Registers callbacks to be called when the installation phase value changes
87
+ #
88
+ # @param block [Proc]
89
+ def on_change(&block)
90
+ @on_change_callbacks << block
91
+ end
92
+
93
+ private
94
+
95
+ # @return [STARTUP, CONFIG, INSTALL]
96
+ attr_reader :value
97
+
98
+ # Changes the installation phase value and runs the callbacks
99
+ #
100
+ # @param value [STARTUP, CONFIG, INSTALL]
101
+ def change_to(value)
102
+ @value = value
103
+ @on_change_callbacks.each(&:call)
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (c) [2022] SUSE LLC
4
+ #
5
+ # All Rights Reserved.
6
+ #
7
+ # This program is free software; you can redistribute it and/or modify it
8
+ # under the terms of version 2 of the GNU General Public License as published
9
+ # by the Free Software Foundation.
10
+ #
11
+ # This program is distributed in the hope that it will be useful, but WITHOUT
12
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14
+ # more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License along
17
+ # with this program; if not, contact SUSE LLC.
18
+ #
19
+ # To contact SUSE LLC about this file by physical or electronic mail, you may
20
+ # find current contact information at www.suse.com.
21
+
22
+ require "yast"
23
+ require "dinstaller/errors"
24
+
25
+ Yast.import "Language"
26
+
27
+ module DInstaller
28
+ # Backend for handling language settings
29
+ class Language
30
+ # @return [Hash<Array<String,Array<String>>>] Known languages, where the key
31
+ # is the language code and value is an array containing the translated name,
32
+ # the english name, etc.
33
+ attr_reader :languages
34
+
35
+ def initialize(logger)
36
+ @logger = logger
37
+ @languages = []
38
+ end
39
+
40
+ # Probes the available system languages
41
+ def probe
42
+ logger.info "Probing languages"
43
+ @languages = Yast::Language.GetLanguagesMap(true)
44
+ end
45
+
46
+ # Writes the language settings
47
+ def finish
48
+ Yast::Language.Save
49
+ end
50
+
51
+ # Sets the language
52
+ #
53
+ # @param name [String] Language code
54
+ # @raise Errors::InvalidValue
55
+ def language=(name)
56
+ raise Errors::InvalidValue unless languages.include?(name)
57
+
58
+ Yast::Language.Set(name)
59
+ Yast::Language.languages = Yast::Language.RemoveSuffix(name)
60
+ end
61
+
62
+ # Returns the selected language
63
+ #
64
+ # @return [String] Language code
65
+ def language
66
+ Yast::Language.language
67
+ end
68
+
69
+ private
70
+
71
+ attr_reader :logger
72
+ end
73
+ end
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (c) [2022] SUSE LLC
4
+ #
5
+ # All Rights Reserved.
6
+ #
7
+ # This program is free software; you can redistribute it and/or modify it
8
+ # under the terms of version 2 of the GNU General Public License as published
9
+ # by the Free Software Foundation.
10
+ #
11
+ # This program is distributed in the hope that it will be useful, but WITHOUT
12
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14
+ # more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License along
17
+ # with this program; if not, contact SUSE LLC.
18
+ #
19
+ # To contact SUSE LLC about this file by physical or electronic mail, you may
20
+ # find current contact information at www.suse.com.
21
+
22
+ require "dinstaller/question"
23
+
24
+ module DInstaller
25
+ # This class represent a question to ask whether to activate a LUKS device
26
+ #
27
+ # Clients have to answer one of these options:
28
+ # * skip: to skip the activation of the LUKS device
29
+ # * decrypt: to activate the device using the provided password
30
+ #
31
+ # @example
32
+ # question = LuksActivationQuestion.new("/dev/sda1", label: "mydata", size: "10 GiB")
33
+ # question.password = "n0ts3cr3t"
34
+ #
35
+ # question.answer = :skip # in case you do not want to activate the device
36
+ #
37
+ # question.answer = :decrypt # in case you want to decrypt with the given password
38
+ class LuksActivationQuestion < Question
39
+ # Current attempt to decrypt the device
40
+ #
41
+ # @return [Integer]
42
+ attr_reader :attempt
43
+
44
+ # Constructor
45
+ #
46
+ # @param device [String] name of the device to be activated (e.g., "/dev/sda1")
47
+ # @param label [String, nil] label of the device
48
+ # @param size [String, nil] size of the device (e.g., "5 GiB")
49
+ def initialize(device, label: nil, size: nil, attempt: 1)
50
+ @device = device
51
+ @label = label
52
+ @size = size
53
+ @attempt = attempt
54
+
55
+ super(generate_text, options: [:skip, :decrypt])
56
+ end
57
+
58
+ # Password to activate the LUKS device
59
+ #
60
+ # @return [String, nil] nil means a password has not been provided yet
61
+ attr_accessor :password
62
+
63
+ private
64
+
65
+ # @return [String]
66
+ attr_reader :device
67
+
68
+ # @return [String, nil]
69
+ attr_reader :label
70
+
71
+ # @return [String, nil]
72
+ attr_reader :size
73
+
74
+ # Generate the text for the question
75
+ #
76
+ # @return [String]
77
+ def generate_text
78
+ "The device #{device_info} is encrypted. Do you want to decrypt it?"
79
+ end
80
+
81
+ # Device information to include in the question
82
+ #
83
+ # @return [String]
84
+ def device_info
85
+ info = [device]
86
+ info << label unless label.to_s.empty?
87
+ info << "(#{size})" unless size.to_s.empty?
88
+
89
+ info.join(" ")
90
+ end
91
+ end
92
+ end