d-installer 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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