d-installer-cli 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.
- checksums.yaml +7 -0
- data/Gemfile +30 -0
- data/Gemfile.lock +84 -0
- data/bin/dinstallerctl +26 -0
- data/lib/dinstaller_cli/clients/storage.rb +73 -0
- data/lib/dinstaller_cli/clients.rb +29 -0
- data/lib/dinstaller_cli/commands/config.rb +150 -0
- data/lib/dinstaller_cli/commands/ensure_config_phase.rb +47 -0
- data/lib/dinstaller_cli/commands/language.rb +49 -0
- data/lib/dinstaller_cli/commands/main.rb +95 -0
- data/lib/dinstaller_cli/commands/root_user.rb +54 -0
- data/lib/dinstaller_cli/commands/software.rb +49 -0
- data/lib/dinstaller_cli/commands/storage.rb +62 -0
- data/lib/dinstaller_cli/commands/user.rb +65 -0
- data/lib/dinstaller_cli/commands.rb +28 -0
- data/lib/dinstaller_cli/install_config.rb +148 -0
- data/lib/dinstaller_cli/install_config_reader.rb +134 -0
- data/lib/dinstaller_cli.rb +26 -0
- metadata +193 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 48606df15fc96fd4e85ef3c1573754b2d8f241e6e58dcb7d35c8a88e9b42b118
|
|
4
|
+
data.tar.gz: 5d23994c98a7960d50c1601f96883bb6de8c416a2aa46a35131562283e7b5f12
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 276c5c9b9be236e8c7c842a26116f7395e1d14ca8edab1cec8b25750567ec22c3e276bdcaa6d2190aa6c725a03cd9c25e022d869ad34f6cb4f83cc5f5b8600c5
|
|
7
|
+
data.tar.gz: 797e746976ede6ebf7c9cb7d069ef49a157eae55089aadcb04ac6ae18fb4b28bb6e555ad6668f3fa1d48c97ede966f4a0145c96aaf4f4c85b9bd9551be693372
|
data/Gemfile
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
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
|
+
source "https://rubygems.org"
|
|
23
|
+
|
|
24
|
+
gem "d-installer", path: "../service"
|
|
25
|
+
|
|
26
|
+
gemspec
|
|
27
|
+
|
|
28
|
+
group :development do
|
|
29
|
+
gem "byebug"
|
|
30
|
+
end
|
data/Gemfile.lock
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
PATH
|
|
2
|
+
remote: ../service
|
|
3
|
+
specs:
|
|
4
|
+
d-installer (0.4.2)
|
|
5
|
+
cfa (~> 1.0.2)
|
|
6
|
+
cfa_grub2 (~> 2.0.0)
|
|
7
|
+
cheetah (~> 1.0.0)
|
|
8
|
+
eventmachine (~> 1.2.7)
|
|
9
|
+
fast_gettext (~> 2.2.0)
|
|
10
|
+
nokogiri (~> 1.13.1)
|
|
11
|
+
rexml (~> 3.2.5)
|
|
12
|
+
ruby-dbus (~> 0.18.1)
|
|
13
|
+
|
|
14
|
+
PATH
|
|
15
|
+
remote: .
|
|
16
|
+
specs:
|
|
17
|
+
d-installer-cli (0.4.2)
|
|
18
|
+
d-installer (= 0.4.2)
|
|
19
|
+
fast_gettext (~> 2.2.0)
|
|
20
|
+
ruby-dbus (~> 0.18.1)
|
|
21
|
+
thor (~> 1.2, >= 1.2.1)
|
|
22
|
+
|
|
23
|
+
GEM
|
|
24
|
+
remote: https://rubygems.org/
|
|
25
|
+
specs:
|
|
26
|
+
abstract_method (1.2.1)
|
|
27
|
+
byebug (11.1.3)
|
|
28
|
+
cfa (1.0.2)
|
|
29
|
+
ruby-augeas
|
|
30
|
+
cfa_grub2 (2.0.0)
|
|
31
|
+
cfa (~> 1.0)
|
|
32
|
+
cheetah (1.0.0)
|
|
33
|
+
abstract_method (~> 1.2)
|
|
34
|
+
diff-lcs (1.5.0)
|
|
35
|
+
docile (1.4.0)
|
|
36
|
+
eventmachine (1.2.7)
|
|
37
|
+
fast_gettext (2.2.0)
|
|
38
|
+
nokogiri (1.13.8-x86_64-linux)
|
|
39
|
+
racc (~> 1.4)
|
|
40
|
+
packaging_rake_tasks (1.5.1)
|
|
41
|
+
rake
|
|
42
|
+
racc (1.6.0)
|
|
43
|
+
rake (13.0.6)
|
|
44
|
+
rexml (3.2.5)
|
|
45
|
+
rspec (3.11.0)
|
|
46
|
+
rspec-core (~> 3.11.0)
|
|
47
|
+
rspec-expectations (~> 3.11.0)
|
|
48
|
+
rspec-mocks (~> 3.11.0)
|
|
49
|
+
rspec-core (3.11.0)
|
|
50
|
+
rspec-support (~> 3.11.0)
|
|
51
|
+
rspec-expectations (3.11.0)
|
|
52
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
53
|
+
rspec-support (~> 3.11.0)
|
|
54
|
+
rspec-mocks (3.11.1)
|
|
55
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
56
|
+
rspec-support (~> 3.11.0)
|
|
57
|
+
rspec-support (3.11.0)
|
|
58
|
+
ruby-augeas (0.5.0)
|
|
59
|
+
ruby-dbus (0.18.1)
|
|
60
|
+
rexml
|
|
61
|
+
simplecov (0.21.2)
|
|
62
|
+
docile (~> 1.1)
|
|
63
|
+
simplecov-html (~> 0.11)
|
|
64
|
+
simplecov_json_formatter (~> 0.1)
|
|
65
|
+
simplecov-html (0.12.3)
|
|
66
|
+
simplecov-lcov (0.8.0)
|
|
67
|
+
simplecov_json_formatter (0.1.4)
|
|
68
|
+
thor (1.2.1)
|
|
69
|
+
|
|
70
|
+
PLATFORMS
|
|
71
|
+
x86_64-linux
|
|
72
|
+
|
|
73
|
+
DEPENDENCIES
|
|
74
|
+
byebug
|
|
75
|
+
d-installer!
|
|
76
|
+
d-installer-cli!
|
|
77
|
+
packaging_rake_tasks (~> 1.5.1)
|
|
78
|
+
rake (~> 13.0.6)
|
|
79
|
+
rspec (~> 3.11.0)
|
|
80
|
+
simplecov (~> 0.21.2)
|
|
81
|
+
simplecov-lcov (~> 0.8.0)
|
|
82
|
+
|
|
83
|
+
BUNDLED WITH
|
|
84
|
+
2.3.7
|
data/bin/dinstallerctl
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
# frozen_string_literal: true
|
|
4
|
+
|
|
5
|
+
# Copyright (c) [2022] SUSE LLC
|
|
6
|
+
#
|
|
7
|
+
# All Rights Reserved.
|
|
8
|
+
#
|
|
9
|
+
# This program is free software; you can redistribute it and/or modify it
|
|
10
|
+
# under the terms of version 2 of the GNU General Public License as published
|
|
11
|
+
# by the Free Software Foundation.
|
|
12
|
+
#
|
|
13
|
+
# This program is distributed in the hope that it will be useful, but WITHOUT
|
|
14
|
+
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
16
|
+
# more details.
|
|
17
|
+
#
|
|
18
|
+
# You should have received a copy of the GNU General Public License along
|
|
19
|
+
# with this program; if not, contact SUSE LLC.
|
|
20
|
+
#
|
|
21
|
+
# To contact SUSE LLC about this file by physical or electronic mail, you may
|
|
22
|
+
# find current contact information at www.suse.com.
|
|
23
|
+
|
|
24
|
+
require "dinstaller_cli/commands/main"
|
|
25
|
+
|
|
26
|
+
DInstallerCli::Commands::Main.start(ARGV)
|
|
@@ -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 "dinstaller/dbus/clients/base"
|
|
23
|
+
|
|
24
|
+
module DInstallerCli
|
|
25
|
+
module Clients
|
|
26
|
+
# D-Bus client for storage configuration
|
|
27
|
+
class Storage < DInstaller::DBus::Clients::Base
|
|
28
|
+
def initialize
|
|
29
|
+
super
|
|
30
|
+
|
|
31
|
+
@dbus_proposal = service.object("/org/opensuse/DInstaller/Storage/Proposal1")
|
|
32
|
+
@dbus_proposal.introspect
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def service_name
|
|
36
|
+
@service_name ||= "org.opensuse.DInstaller"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Devices available for the installation
|
|
40
|
+
#
|
|
41
|
+
# @return [Array<String>] name of the devices
|
|
42
|
+
def available_devices
|
|
43
|
+
dbus_proposal["org.opensuse.DInstaller.Storage.Proposal1"]["AvailableDevices"].map(&:first)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Devices selected for the installation
|
|
47
|
+
#
|
|
48
|
+
# @return [Array<String>] name of the devices
|
|
49
|
+
def candidate_devices
|
|
50
|
+
dbus_proposal["org.opensuse.DInstaller.Storage.Proposal1"]["CandidateDevices"]
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Actions to perform in the storage devices
|
|
54
|
+
#
|
|
55
|
+
# @return [Array<String>]
|
|
56
|
+
def actions
|
|
57
|
+
dbus_proposal["org.opensuse.DInstaller.Storage.Proposal1"]["Actions"].map { |a| a["Text"] }
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Calculates the storage proposal with the given devices
|
|
61
|
+
#
|
|
62
|
+
# @param candidate_devices [Array<String>] name of the new candidate devices
|
|
63
|
+
def calculate(candidate_devices)
|
|
64
|
+
dbus_proposal.Calculate({ "CandidateDevices" => candidate_devices })
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
private
|
|
68
|
+
|
|
69
|
+
# @return [::DBus::Object]
|
|
70
|
+
attr_reader :dbus_proposal
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
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 DInstallerCli
|
|
23
|
+
# D-Bus clients
|
|
24
|
+
module Clients
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
require "dinstaller_cli/clients/language"
|
|
29
|
+
require "dinstaller_cli/clients/storage"
|
|
@@ -0,0 +1,150 @@
|
|
|
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 "thor"
|
|
23
|
+
require "dinstaller_cli/install_config"
|
|
24
|
+
require "dinstaller_cli/install_config_reader"
|
|
25
|
+
require "dinstaller_cli/clients/storage"
|
|
26
|
+
require "dinstaller/dbus/clients/language"
|
|
27
|
+
require "dinstaller/dbus/clients/software"
|
|
28
|
+
require "dinstaller/dbus/clients/users"
|
|
29
|
+
|
|
30
|
+
module DInstallerCli
|
|
31
|
+
module Commands
|
|
32
|
+
# Subcommand to configure the installation
|
|
33
|
+
class Config < Thor
|
|
34
|
+
desc "load <config>", "Load a config file and apply the configuration"
|
|
35
|
+
def load(config_source)
|
|
36
|
+
config = InstallConfigReader.new(config_source).read
|
|
37
|
+
configure_installation(config)
|
|
38
|
+
rescue DInstallerCli::InstallConfigReader::Error
|
|
39
|
+
say_error("error: invalid configuration")
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
desc "dump", "Dump the current installation config to stdout"
|
|
43
|
+
def dump
|
|
44
|
+
say(current_config.dump)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
private
|
|
48
|
+
|
|
49
|
+
# Configures the installation according to the given config
|
|
50
|
+
#
|
|
51
|
+
# Performs D-Bus calls to configure the proper services.
|
|
52
|
+
#
|
|
53
|
+
# @param config [InstallConfig]
|
|
54
|
+
def configure_installation(config)
|
|
55
|
+
software_client.select_product(config.product) if config.product
|
|
56
|
+
language_client.select_languages(config.languages) if config.languages.any?
|
|
57
|
+
storage_client.calculate(config.disks) if config.disks.any?
|
|
58
|
+
|
|
59
|
+
configure_user(config.user) if config.user
|
|
60
|
+
configure_root(config.root) if config.root
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Configures the user
|
|
64
|
+
#
|
|
65
|
+
# Performs D-Bus calls to configure the users service.
|
|
66
|
+
#
|
|
67
|
+
# @param user_config [InstallConfig::User]
|
|
68
|
+
def configure_user(user_config)
|
|
69
|
+
user_name = user_config.name || ""
|
|
70
|
+
|
|
71
|
+
return if user_name.empty?
|
|
72
|
+
|
|
73
|
+
users_client.create_first_user(user_config.name,
|
|
74
|
+
fullname: user_config.fullname,
|
|
75
|
+
password: user_config.password,
|
|
76
|
+
autologin: user_config.autologin)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Configures the root user
|
|
80
|
+
#
|
|
81
|
+
# Performs D-Bus calls to configure the users service.
|
|
82
|
+
#
|
|
83
|
+
# @param root_config [InstallConfig::Root]
|
|
84
|
+
def configure_root(root_config)
|
|
85
|
+
users_client.root_password = root_config.password if root_config.password
|
|
86
|
+
users_client.root_ssh_key = root_config.ssh_key if root_config.ssh_key
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Generates an installation config with the current configured values
|
|
90
|
+
#
|
|
91
|
+
# @return [InstallConfig]
|
|
92
|
+
def current_config
|
|
93
|
+
InstallConfig.new.tap do |config|
|
|
94
|
+
product = software_client.selected_product
|
|
95
|
+
|
|
96
|
+
config.product = product unless product.empty?
|
|
97
|
+
config.languages = language_client.selected_languages
|
|
98
|
+
config.disks = storage_client.candidate_devices
|
|
99
|
+
|
|
100
|
+
config.user = current_user_config
|
|
101
|
+
config.root = current_root_config
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# Generates a user config with the current configured values
|
|
106
|
+
#
|
|
107
|
+
# @note The password is not recovered
|
|
108
|
+
#
|
|
109
|
+
# @return [InstallConfig::User]
|
|
110
|
+
def current_user_config
|
|
111
|
+
fullname, name, autologin = users_client.first_user
|
|
112
|
+
|
|
113
|
+
InstallConfig::User.new.tap do |user|
|
|
114
|
+
user.name = name unless name.empty?
|
|
115
|
+
user.fullname = fullname unless fullname.empty?
|
|
116
|
+
user.autologin = autologin
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Generates a root config with the current configured values
|
|
121
|
+
#
|
|
122
|
+
# @note The password is not recovered
|
|
123
|
+
#
|
|
124
|
+
# @return [InstallConfig::Root]
|
|
125
|
+
def current_root_config
|
|
126
|
+
ssh_key = users_client.root_ssh_key
|
|
127
|
+
|
|
128
|
+
InstallConfig::Root.new.tap do |root|
|
|
129
|
+
root.ssh_key = ssh_key unless ssh_key.empty?
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def language_client
|
|
134
|
+
@language_client ||= DInstaller::DBus::Clients::Language.new
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def software_client
|
|
138
|
+
@software_client ||= DInstaller::DBus::Clients::Software.new
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def storage_client
|
|
142
|
+
@storage_client ||= Clients::Storage.new
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def users_client
|
|
146
|
+
@users_client ||= DInstaller::DBus::Clients::Users.new
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
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/installation_phase"
|
|
23
|
+
|
|
24
|
+
module DInstallerCli
|
|
25
|
+
module Commands
|
|
26
|
+
# Mixin that provides methods to ensure a specific installation phase while running code
|
|
27
|
+
#
|
|
28
|
+
# @note Requires a #manager_client method that returns an instance of
|
|
29
|
+
# {DInstaller::DBus::Clients::Manager}.
|
|
30
|
+
module EnsureConfigPhase
|
|
31
|
+
# Ensures the config phase is executed before calling the given block
|
|
32
|
+
#
|
|
33
|
+
# @param block [Proc]
|
|
34
|
+
def ensure_config_phase(&block)
|
|
35
|
+
manager_client.probe unless config_phase?
|
|
36
|
+
block.call
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Whether the manager client is in config phase
|
|
40
|
+
#
|
|
41
|
+
# @return [Boolean]
|
|
42
|
+
def config_phase?
|
|
43
|
+
manager_client.current_installation_phase == DInstaller::InstallationPhase::CONFIG
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
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 "thor"
|
|
23
|
+
require "dinstaller/dbus/clients/language"
|
|
24
|
+
|
|
25
|
+
module DInstallerCli
|
|
26
|
+
module Commands
|
|
27
|
+
# Subcommand to manage language settings
|
|
28
|
+
class Language < Thor
|
|
29
|
+
desc "available", "List available languages for the installation"
|
|
30
|
+
def available
|
|
31
|
+
languages = client.available_languages.map { |l| l.join(" - ") }
|
|
32
|
+
languages.each { |l| say(l) }
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
desc "selected [<id>...]", "Select the languages to install in the target system"
|
|
36
|
+
long_desc "Use without arguments to see the currently selected languages."
|
|
37
|
+
def selected(*ids)
|
|
38
|
+
client.select_languages(ids) if ids.any?
|
|
39
|
+
client.selected_languages.each { |l| say(l) }
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
private
|
|
43
|
+
|
|
44
|
+
def client
|
|
45
|
+
@client ||= DInstaller::DBus::Clients::Language.new
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,95 @@
|
|
|
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 "thor"
|
|
23
|
+
require "dinstaller_cli/commands/config"
|
|
24
|
+
require "dinstaller_cli/commands/language"
|
|
25
|
+
require "dinstaller_cli/commands/software"
|
|
26
|
+
require "dinstaller_cli/commands/storage"
|
|
27
|
+
require "dinstaller_cli/commands/root_user"
|
|
28
|
+
require "dinstaller_cli/commands/user"
|
|
29
|
+
require "dinstaller_cli/commands/ensure_config_phase"
|
|
30
|
+
require "dinstaller/dbus/clients/manager"
|
|
31
|
+
require "dinstaller/dbus/clients/software"
|
|
32
|
+
|
|
33
|
+
module DInstallerCli
|
|
34
|
+
module Commands
|
|
35
|
+
# Main command
|
|
36
|
+
class Main < Thor
|
|
37
|
+
include EnsureConfigPhase
|
|
38
|
+
|
|
39
|
+
def self.exit_on_failure?
|
|
40
|
+
true
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
desc "install", "Perform the installation"
|
|
44
|
+
def install
|
|
45
|
+
answer = ask("Do you want to start the installation?", limited_to: ["y", "n"])
|
|
46
|
+
return unless answer == "y"
|
|
47
|
+
|
|
48
|
+
register_callbacks
|
|
49
|
+
ensure_config_phase { manager_client.commit }
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
desc "config SUBCOMMAND", "Manage configuration of the installation"
|
|
53
|
+
subcommand "config", Config
|
|
54
|
+
|
|
55
|
+
desc "language SUBCOMMAND", "Manage language configuration"
|
|
56
|
+
subcommand "language", Language
|
|
57
|
+
|
|
58
|
+
desc "software SUBCOMMAND", "Manage software configuration"
|
|
59
|
+
subcommand "software", Software
|
|
60
|
+
|
|
61
|
+
desc "storage SUBCOMMAND", "Manage storage configuration"
|
|
62
|
+
subcommand "storage", Storage
|
|
63
|
+
|
|
64
|
+
desc "rootuser SUBCOMMAND", "Manage root user configuration"
|
|
65
|
+
subcommand "rootuser", RootUser
|
|
66
|
+
|
|
67
|
+
desc "user SUBCOMMAND", "Manage first user configuration"
|
|
68
|
+
subcommand "user", User
|
|
69
|
+
|
|
70
|
+
private
|
|
71
|
+
|
|
72
|
+
def manager_client
|
|
73
|
+
@manager_client ||= DInstaller::DBus::Clients::Manager.new
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def software_client
|
|
77
|
+
@software_client ||= DInstaller::DBus::Clients::Software.new
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Registers callbacks
|
|
81
|
+
def register_callbacks
|
|
82
|
+
# Callback to show the main progress
|
|
83
|
+
manager_client.on_progress_change do |total_steps, current_step, message, finished|
|
|
84
|
+
feedback = finished ? "Done" : "(#{current_step}/#{total_steps}) #{message}"
|
|
85
|
+
say(feedback)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Callback to show the software progress
|
|
89
|
+
software_client.on_progress_change do |_, _, message, finished|
|
|
90
|
+
say("--> #{message}") unless finished
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
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 "thor"
|
|
23
|
+
require "dinstaller/dbus/clients/users"
|
|
24
|
+
|
|
25
|
+
module DInstallerCli
|
|
26
|
+
module Commands
|
|
27
|
+
# Subcommand to manage root user settings
|
|
28
|
+
class RootUser < Thor
|
|
29
|
+
desc "ssh_key [<key>]", "Set the SSH key for root"
|
|
30
|
+
long_desc "Use without arguments to see the current SSH key value."
|
|
31
|
+
def ssh_key(key = nil)
|
|
32
|
+
client.root_ssh_key = key if key
|
|
33
|
+
say(client.root_ssh_key)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
desc "password [<plain password>]", "Set the root password"
|
|
37
|
+
def password(password = nil)
|
|
38
|
+
client.root_password = password if password
|
|
39
|
+
say("<secret>") if client.root_password?
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
desc "clear", "Clear root configuration"
|
|
43
|
+
def clear
|
|
44
|
+
client.remove_root_info
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
private
|
|
48
|
+
|
|
49
|
+
def client
|
|
50
|
+
@client ||= DInstaller::DBus::Clients::Users.new
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
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 "thor"
|
|
23
|
+
require "dinstaller/dbus/clients/software"
|
|
24
|
+
|
|
25
|
+
module DInstallerCli
|
|
26
|
+
module Commands
|
|
27
|
+
# Subcommand to manage software settings
|
|
28
|
+
class Software < Thor
|
|
29
|
+
desc "available_products", "List available products for the installation"
|
|
30
|
+
def available_products
|
|
31
|
+
products = client.available_products.map { |l| l.join(" - ") }
|
|
32
|
+
products.each { |p| say(p) }
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
desc "selected_product [<id>]", "Select the product to install in the target system"
|
|
36
|
+
long_desc "Use without arguments to see the currently selected product."
|
|
37
|
+
def selected_product(id = nil)
|
|
38
|
+
client.select_product(id) if id
|
|
39
|
+
say(client.selected_product)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
private
|
|
43
|
+
|
|
44
|
+
def client
|
|
45
|
+
@client ||= DInstaller::DBus::Clients::Software.new
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
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 "thor"
|
|
23
|
+
require "dinstaller_cli/commands/ensure_config_phase"
|
|
24
|
+
require "dinstaller_cli/clients/storage"
|
|
25
|
+
require "dinstaller/dbus/clients/manager"
|
|
26
|
+
|
|
27
|
+
module DInstallerCli
|
|
28
|
+
module Commands
|
|
29
|
+
# Subcommand to manage storage settings
|
|
30
|
+
class Storage < Thor
|
|
31
|
+
include EnsureConfigPhase
|
|
32
|
+
|
|
33
|
+
desc "available_devices", "List available devices for the installation"
|
|
34
|
+
def available_devices
|
|
35
|
+
storage_client.available_devices.each { |d| say(d) }
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
desc "selected_devices [<device>...]", "Select devices for the installation"
|
|
39
|
+
long_desc "Use without arguments to see the currently selected devices."
|
|
40
|
+
def selected_devices(*devices)
|
|
41
|
+
return storage_client.candidate_devices.each { |d| say(d) } if devices.none?
|
|
42
|
+
|
|
43
|
+
ensure_config_phase { storage_client.calculate(devices) }
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
desc "actions", "List the storage actions to perform"
|
|
47
|
+
def actions
|
|
48
|
+
storage_client.actions.each { |a| say(a) }
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
private
|
|
52
|
+
|
|
53
|
+
def storage_client
|
|
54
|
+
@storage_client ||= Clients::Storage.new
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def manager_client
|
|
58
|
+
@manager_client ||= DInstaller::DBus::Clients::Manager.new
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
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 "thor"
|
|
23
|
+
require "dinstaller/dbus/clients/users"
|
|
24
|
+
|
|
25
|
+
module DInstallerCli
|
|
26
|
+
module Commands
|
|
27
|
+
# Subcommand to manage first user settings
|
|
28
|
+
class User < Thor
|
|
29
|
+
desc "set <name>", "Configure the user that will be created during the installation"
|
|
30
|
+
option :fullname, banner: "<full-name>", desc: "Set the user's full name"
|
|
31
|
+
option :password, banner: "<plain-password>", desc: "Set the user's password"
|
|
32
|
+
option :autologin, type: :boolean, default: false,
|
|
33
|
+
desc: "Enable/disable user autologin (disabled by default)"
|
|
34
|
+
def set(name)
|
|
35
|
+
client.create_first_user(name,
|
|
36
|
+
fullname: options[:fullname],
|
|
37
|
+
password: options[:password],
|
|
38
|
+
autologin: options[:autologin])
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
desc "show", "Show the user configuration"
|
|
42
|
+
def show
|
|
43
|
+
full_name, name, autologin = client.first_user
|
|
44
|
+
|
|
45
|
+
return if name.empty?
|
|
46
|
+
|
|
47
|
+
say("Full Name: #{full_name}\n" \
|
|
48
|
+
"Name: #{name}\n" \
|
|
49
|
+
"Autologin: #{autologin ? "yes" : "no"}\n" \
|
|
50
|
+
"Password: <secret>")
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
desc "clear", "Clear the user configuration"
|
|
54
|
+
def clear
|
|
55
|
+
client.remove_first_user
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
private
|
|
59
|
+
|
|
60
|
+
def client
|
|
61
|
+
@client ||= DInstaller::DBus::Clients::Users.new
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -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 DInstallerCli
|
|
23
|
+
# Module containing all commands
|
|
24
|
+
module Commands
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
require "dinstaller_cli/commands/main"
|
|
@@ -0,0 +1,148 @@
|
|
|
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 "yaml"
|
|
23
|
+
|
|
24
|
+
module DInstallerCli
|
|
25
|
+
# Class to represent the installation config
|
|
26
|
+
class InstallConfig
|
|
27
|
+
# Product to install
|
|
28
|
+
#
|
|
29
|
+
# @return [String, nil] id of the product (e.g., "Tumbleweed")
|
|
30
|
+
attr_accessor :product
|
|
31
|
+
|
|
32
|
+
# Languages to install
|
|
33
|
+
#
|
|
34
|
+
# @return [Array<String>] ids of the languages (e.g., ["en_UK", "es_ES"])
|
|
35
|
+
attr_accessor :languages
|
|
36
|
+
|
|
37
|
+
# Target devices
|
|
38
|
+
#
|
|
39
|
+
# @return [Array<String>] device names (e.g., ["/dev/vda"])
|
|
40
|
+
attr_accessor :disks
|
|
41
|
+
|
|
42
|
+
# User config
|
|
43
|
+
#
|
|
44
|
+
# @return [InstallConfig::User, nil]
|
|
45
|
+
attr_accessor :user
|
|
46
|
+
|
|
47
|
+
# Root config
|
|
48
|
+
#
|
|
49
|
+
# @return [InstallConfig::Root, nil]
|
|
50
|
+
attr_accessor :root
|
|
51
|
+
|
|
52
|
+
def initialize
|
|
53
|
+
@product = nil
|
|
54
|
+
@languages = []
|
|
55
|
+
@disks = []
|
|
56
|
+
@user = nil
|
|
57
|
+
@root = nil
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Dumps the settings in YAML format
|
|
61
|
+
#
|
|
62
|
+
# @return [String]
|
|
63
|
+
def dump
|
|
64
|
+
to_h.to_yaml
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Converts the settings to hash
|
|
68
|
+
#
|
|
69
|
+
# @return [Hash]
|
|
70
|
+
def to_h
|
|
71
|
+
{
|
|
72
|
+
"product" => product,
|
|
73
|
+
"languages" => languages,
|
|
74
|
+
"disks" => disks,
|
|
75
|
+
"user" => user&.to_h || {},
|
|
76
|
+
"root" => root&.to_h || {}
|
|
77
|
+
}
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Class to represent the user config
|
|
81
|
+
class User
|
|
82
|
+
# @param [String, nil]
|
|
83
|
+
attr_accessor :name
|
|
84
|
+
|
|
85
|
+
# @param [String, nil]
|
|
86
|
+
attr_accessor :fullname
|
|
87
|
+
|
|
88
|
+
# @param [String, nil]
|
|
89
|
+
attr_accessor :password
|
|
90
|
+
|
|
91
|
+
# @param [Boolean]
|
|
92
|
+
attr_accessor :autologin
|
|
93
|
+
|
|
94
|
+
# Constructor
|
|
95
|
+
#
|
|
96
|
+
# @param name [String] user name
|
|
97
|
+
# @param fullname [String, nil] full user name
|
|
98
|
+
# @param password [String, nil] user password
|
|
99
|
+
# @param autologin [Boolean] user autologin option
|
|
100
|
+
def initialize(name: nil, fullname: nil, password: nil, autologin: false)
|
|
101
|
+
@name = name
|
|
102
|
+
@fullname = fullname
|
|
103
|
+
@password = password
|
|
104
|
+
@autologin = autologin
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Converts the settings to hash
|
|
108
|
+
#
|
|
109
|
+
# @return [Hash]
|
|
110
|
+
def to_h
|
|
111
|
+
{
|
|
112
|
+
"name" => name,
|
|
113
|
+
"fullname" => fullname,
|
|
114
|
+
"autologin" => autologin,
|
|
115
|
+
"password" => password
|
|
116
|
+
}
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Class to represent the root user config
|
|
121
|
+
class Root
|
|
122
|
+
# @return [String, nil]
|
|
123
|
+
attr_accessor :password
|
|
124
|
+
|
|
125
|
+
# @return [String, nil]
|
|
126
|
+
attr_accessor :ssh_key
|
|
127
|
+
|
|
128
|
+
# Constructor
|
|
129
|
+
#
|
|
130
|
+
# @param password [String, nil]
|
|
131
|
+
# @param ssh_key [String, nil]
|
|
132
|
+
def initialize(password: nil, ssh_key: nil)
|
|
133
|
+
@password = password
|
|
134
|
+
@ssh_key = ssh_key
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# Converts the settings to hash
|
|
138
|
+
#
|
|
139
|
+
# @return [Hash]
|
|
140
|
+
def to_h
|
|
141
|
+
{
|
|
142
|
+
"ssh_key" => ssh_key,
|
|
143
|
+
"password" => password
|
|
144
|
+
}
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|
|
@@ -0,0 +1,134 @@
|
|
|
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 "yaml"
|
|
23
|
+
require "dinstaller_cli/install_config"
|
|
24
|
+
|
|
25
|
+
module DInstallerCli
|
|
26
|
+
# Class for generating the config of the installation from a YAML file
|
|
27
|
+
#
|
|
28
|
+
# The YAML file has the following structure:
|
|
29
|
+
#
|
|
30
|
+
# product: <product-id>
|
|
31
|
+
#
|
|
32
|
+
# languages:
|
|
33
|
+
# - <language-id>
|
|
34
|
+
# - <language-id>
|
|
35
|
+
#
|
|
36
|
+
# disks:
|
|
37
|
+
# - <device-name>
|
|
38
|
+
# - <device-name>
|
|
39
|
+
#
|
|
40
|
+
# user:
|
|
41
|
+
# name: <name>
|
|
42
|
+
# fullname: <fullname>
|
|
43
|
+
# password: <password>
|
|
44
|
+
# autologin: <autologin>
|
|
45
|
+
#
|
|
46
|
+
# root:
|
|
47
|
+
# password: <password>
|
|
48
|
+
# ssh_key: <key>
|
|
49
|
+
#
|
|
50
|
+
# @example
|
|
51
|
+
# config = InstallConfigReader.new("example.yaml").read
|
|
52
|
+
# config.languages #=> ["en_US", "es_ES"]
|
|
53
|
+
# config.disks #=> ["/dev/vda"]
|
|
54
|
+
# config.user #=> #<InstallConfig::User>
|
|
55
|
+
# config.user.name #=> "john"
|
|
56
|
+
class InstallConfigReader
|
|
57
|
+
# Error reading or loading the config file
|
|
58
|
+
class Error < RuntimeError; end
|
|
59
|
+
|
|
60
|
+
# Constructor
|
|
61
|
+
#
|
|
62
|
+
# @param source [String] path of the config file
|
|
63
|
+
def initialize(source)
|
|
64
|
+
@source = source
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Reads the config file and generates an installation config
|
|
68
|
+
#
|
|
69
|
+
# @raise [Error] see {#load_content}
|
|
70
|
+
#
|
|
71
|
+
# @return [InstallConfig]
|
|
72
|
+
def read
|
|
73
|
+
content = load_content
|
|
74
|
+
config_from(content)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
private
|
|
78
|
+
|
|
79
|
+
# Path to the config file
|
|
80
|
+
#
|
|
81
|
+
# @return [String]
|
|
82
|
+
attr_reader :source
|
|
83
|
+
|
|
84
|
+
# Creates an install config from the content of the YAML config file
|
|
85
|
+
#
|
|
86
|
+
# @param content [Hash] content of the config file
|
|
87
|
+
# @return [InstallConfig]
|
|
88
|
+
def config_from(content)
|
|
89
|
+
InstallConfig.new.tap do |config|
|
|
90
|
+
product = content["product"]
|
|
91
|
+
languages = content["languages"]
|
|
92
|
+
disks = content["disks"]
|
|
93
|
+
user = content["user"]
|
|
94
|
+
root = content["root"]
|
|
95
|
+
|
|
96
|
+
config.product = product if product
|
|
97
|
+
config.languages = languages if languages
|
|
98
|
+
config.disks = disks if disks
|
|
99
|
+
config.user = user_config_from(user) if user
|
|
100
|
+
config.root = root_config_from(root) if root
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Generates a user config according to the user section of the YAML config file
|
|
105
|
+
#
|
|
106
|
+
# @param user_content [Hash] user section
|
|
107
|
+
# @return [InstallConfig::User]
|
|
108
|
+
def user_config_from(user_content)
|
|
109
|
+
InstallConfig::User.new(
|
|
110
|
+
name: user_content["name"],
|
|
111
|
+
fullname: user_content["fullname"],
|
|
112
|
+
password: user_content["password"],
|
|
113
|
+
autologin: user_content["autologin"]
|
|
114
|
+
)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# Generates a root config according to the root section of the YAML config file
|
|
118
|
+
#
|
|
119
|
+
# @param root_content [Hash] root section
|
|
120
|
+
# @return [InstallConfig::Root]
|
|
121
|
+
def root_config_from(root_content)
|
|
122
|
+
InstallConfig::Root.new(password: root_content["password"], ssh_key: root_content["ssh_key"])
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# Loads the content of the YAML config file
|
|
126
|
+
#
|
|
127
|
+
# @raise [Error] if the file cannot be loaded
|
|
128
|
+
def load_content
|
|
129
|
+
YAML.load_file(source)
|
|
130
|
+
rescue StandardError => e
|
|
131
|
+
raise Error, e.message
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
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
|
+
# DInstaller CLI module
|
|
23
|
+
module DInstallerCli
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
require "dinstaller_cli/commands"
|
metadata
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: d-installer-cli
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.4.2
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- YaST Team
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2022-08-01 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: packaging_rake_tasks
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: 1.5.1
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: 1.5.1
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: rake
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: 13.0.6
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: 13.0.6
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: rspec
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - "~>"
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: 3.11.0
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: 3.11.0
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: simplecov
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - "~>"
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: 0.21.2
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - "~>"
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: 0.21.2
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: simplecov-lcov
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - "~>"
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: 0.8.0
|
|
76
|
+
type: :development
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - "~>"
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: 0.8.0
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: d-installer
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - '='
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: 0.4.2
|
|
90
|
+
type: :runtime
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - '='
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: 0.4.2
|
|
97
|
+
- !ruby/object:Gem::Dependency
|
|
98
|
+
name: fast_gettext
|
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
|
100
|
+
requirements:
|
|
101
|
+
- - "~>"
|
|
102
|
+
- !ruby/object:Gem::Version
|
|
103
|
+
version: 2.2.0
|
|
104
|
+
type: :runtime
|
|
105
|
+
prerelease: false
|
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
+
requirements:
|
|
108
|
+
- - "~>"
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
version: 2.2.0
|
|
111
|
+
- !ruby/object:Gem::Dependency
|
|
112
|
+
name: ruby-dbus
|
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
|
114
|
+
requirements:
|
|
115
|
+
- - "~>"
|
|
116
|
+
- !ruby/object:Gem::Version
|
|
117
|
+
version: 0.18.1
|
|
118
|
+
type: :runtime
|
|
119
|
+
prerelease: false
|
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
+
requirements:
|
|
122
|
+
- - "~>"
|
|
123
|
+
- !ruby/object:Gem::Version
|
|
124
|
+
version: 0.18.1
|
|
125
|
+
- !ruby/object:Gem::Dependency
|
|
126
|
+
name: thor
|
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
|
128
|
+
requirements:
|
|
129
|
+
- - "~>"
|
|
130
|
+
- !ruby/object:Gem::Version
|
|
131
|
+
version: '1.2'
|
|
132
|
+
- - ">="
|
|
133
|
+
- !ruby/object:Gem::Version
|
|
134
|
+
version: 1.2.1
|
|
135
|
+
type: :runtime
|
|
136
|
+
prerelease: false
|
|
137
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
138
|
+
requirements:
|
|
139
|
+
- - "~>"
|
|
140
|
+
- !ruby/object:Gem::Version
|
|
141
|
+
version: '1.2'
|
|
142
|
+
- - ">="
|
|
143
|
+
- !ruby/object:Gem::Version
|
|
144
|
+
version: 1.2.1
|
|
145
|
+
description: Command line interface for D-Installer service
|
|
146
|
+
email: yast-devel@opensuse.org
|
|
147
|
+
executables:
|
|
148
|
+
- dinstallerctl
|
|
149
|
+
extensions: []
|
|
150
|
+
extra_rdoc_files: []
|
|
151
|
+
files:
|
|
152
|
+
- Gemfile
|
|
153
|
+
- Gemfile.lock
|
|
154
|
+
- bin/dinstallerctl
|
|
155
|
+
- lib/dinstaller_cli.rb
|
|
156
|
+
- lib/dinstaller_cli/clients.rb
|
|
157
|
+
- lib/dinstaller_cli/clients/storage.rb
|
|
158
|
+
- lib/dinstaller_cli/commands.rb
|
|
159
|
+
- lib/dinstaller_cli/commands/config.rb
|
|
160
|
+
- lib/dinstaller_cli/commands/ensure_config_phase.rb
|
|
161
|
+
- lib/dinstaller_cli/commands/language.rb
|
|
162
|
+
- lib/dinstaller_cli/commands/main.rb
|
|
163
|
+
- lib/dinstaller_cli/commands/root_user.rb
|
|
164
|
+
- lib/dinstaller_cli/commands/software.rb
|
|
165
|
+
- lib/dinstaller_cli/commands/storage.rb
|
|
166
|
+
- lib/dinstaller_cli/commands/user.rb
|
|
167
|
+
- lib/dinstaller_cli/install_config.rb
|
|
168
|
+
- lib/dinstaller_cli/install_config_reader.rb
|
|
169
|
+
homepage: https://github.com/yast/d-installer
|
|
170
|
+
licenses:
|
|
171
|
+
- GPL-2.0-only
|
|
172
|
+
metadata:
|
|
173
|
+
rubygems_mfa_required: 'true'
|
|
174
|
+
post_install_message:
|
|
175
|
+
rdoc_options: []
|
|
176
|
+
require_paths:
|
|
177
|
+
- lib
|
|
178
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
179
|
+
requirements:
|
|
180
|
+
- - ">="
|
|
181
|
+
- !ruby/object:Gem::Version
|
|
182
|
+
version: 2.5.0
|
|
183
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
184
|
+
requirements:
|
|
185
|
+
- - ">="
|
|
186
|
+
- !ruby/object:Gem::Version
|
|
187
|
+
version: '0'
|
|
188
|
+
requirements: []
|
|
189
|
+
rubygems_version: 3.3.7
|
|
190
|
+
signing_key:
|
|
191
|
+
specification_version: 4
|
|
192
|
+
summary: D-Installer CLI
|
|
193
|
+
test_files: []
|