smart_proxy_discovery_image 1.0.9 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: aaf0f3ab7f898a908612d91c5facd39e1956112b
4
- data.tar.gz: 55bdee44f8dbbd6b5431f20b34624063ab665dfc
2
+ SHA256:
3
+ metadata.gz: 43314999e259f9fc1687fc4eb31dce1293010ed14a59d77e343ac0b7491cf503
4
+ data.tar.gz: 91f710c0e4698dc382ea2a5eda4732796b8cb2002de389d4ad0ca189179296bb
5
5
  SHA512:
6
- metadata.gz: 48373330b8a7d67d78228abfb6381a3a2155f3155611f60fb08fb9ef8f306a837d1f8bae5f1e22ed3835df3cb63a8b8b02685328952f647dbcaf121779600d20
7
- data.tar.gz: b18091252c9616cab41674aef1dba44eb5f4e0fd1a6f66aa24d6807c5f8a419e968cddda751095003a00698d26252c534503433e8f0f769e81c8a4ceaf148f20
6
+ metadata.gz: eca1ddeaefcabec8bbd22005b264bea797976c5cce1e660d04d54d48dae255d9fad0129a51f2d32b999766cde12514770d31b6b431432c687820e45b665e7afc
7
+ data.tar.gz: b7f5dcddcbe845fd055df2e7fb540b03691906c52f66b6d80298b84fd85055cccbcee0b029dbfa17dfbe71bc3f72116798229ee0da9baaea9dadad834c2c3097
@@ -17,6 +17,8 @@ module Proxy::DiscoveryImage
17
17
  body_data = request.body.read
18
18
  # change virtual terminal out of newt screen
19
19
  system("chvt", "2")
20
+ is_secureboot = system('mokutil --sb-state|grep enabled')
21
+ logger.debug "Secure boot is #{is_secureboot}"
20
22
  logger.debug "Initiated kexec provisioning with #{body_data}"
21
23
  log_halt(500, "kexec binary was not found") unless (kexec = which('kexec'))
22
24
  begin
@@ -24,15 +26,13 @@ module Proxy::DiscoveryImage
24
26
  rescue JSON::ParserError
25
27
  log_halt 500, "Unable to parse kexec JSON input: #{body_data}"
26
28
  end
27
- logger.debug "Downloading: #{data['kernel']}"
28
- if ::Proxy::HttpDownload.new(data['kernel'], '/tmp/vmlinuz').start.join != 0
29
- log_halt 500, "cannot download kernel for kexec!"
30
- end
31
- logger.debug "Downloading: #{data['initram']}"
32
- if ::Proxy::HttpDownload.new(data['initram'], '/tmp/initrd.img').start.join != 0
33
- log_halt 500, "cannot download initram for kexec!"
34
- end
35
- run_after_response 2, kexec, "--debug", "--force", "--reset-vga", "--append=#{data['append']}", "--initrd=/tmp/initrd.img", "/tmp/vmlinuz", *data['extra']
29
+ args = ["--debug", "--force"]
30
+ args << data['extra'] if data['extra']
31
+ args << "--kexec-file-syscall" if is_secureboot
32
+ args << "--append=#{data['append']}"
33
+ args << "--initrd=/tmp/initrd.img"
34
+ download_and_run_after_response data, 2, kexec, *args, "/tmp/vmlinuz"
35
+
36
36
  { :result => true }.to_json
37
37
  end
38
38
 
@@ -40,9 +40,9 @@ module Proxy::DiscoveryImage
40
40
  # Execute command in a separate thread after 5 seconds to give the server some
41
41
  # time to finish the request. Does *not* execute via a shell.
42
42
  def run_after_response(seconds, *command)
43
- logger.debug "Power API scheduling in #{seconds} seconds: #{command.inspect}"
44
43
  Thread.start do
45
44
  begin
45
+ logger.debug "Power API scheduling in #{seconds} seconds: #{command.inspect}"
46
46
  sleep seconds
47
47
  logger.debug "Power API executing: #{command.inspect}"
48
48
  if (sudo = which('sudo'))
@@ -57,5 +57,32 @@ module Proxy::DiscoveryImage
57
57
  end
58
58
  end
59
59
  end
60
+
61
+ # Variant which also downloads kernel and initramdisk
62
+ def download_and_run_after_response(data, seconds, *command)
63
+ Thread.start do
64
+ begin
65
+ # download kernel and initramdisk
66
+ downloaded = download_file(data, 'kernel', 'vmlinuz', '/tmp') &&
67
+ download_file(data, 'initram', 'initrd.img', '/tmp')
68
+ # wait few seconds just in case the download was fast and perform kexec
69
+ # only perform kexec when both locks were available to prevent subsequent request while downloading
70
+ run_after_response(seconds, *command) if downloaded
71
+ rescue Exception => e
72
+ logger.error "Error during command execution: #{e}"
73
+ end
74
+ end
75
+ end
76
+
77
+ def download_file(data, kind, name, prefix)
78
+ return unless data && (url = data[kind])
79
+
80
+ logger.debug "Downloading: #{url}"
81
+ download_thread = ::Proxy::HttpDownload.new(url, File.join(prefix, name)).start
82
+ logger.error("#{name} is still downloading, ignored") unless download_thread
83
+ download_success = download_thread.join.zero?
84
+ logger.error("cannot download #{name} for kexec") unless download_success
85
+ download_success
86
+ end
60
87
  end
61
88
  end
@@ -1,5 +1,5 @@
1
1
  module Proxy
2
2
  module DiscoveryImage
3
- VERSION = '1.0.9'
3
+ VERSION = '1.3.1'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smart_proxy_discovery_image
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.9
4
+ version: 1.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lukas Zapletal
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-11-02 00:00:00.000000000 Z
11
+ date: 2020-10-23 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |2
14
14
  Smart Proxy plugin providing Image API on discovered nodes. This plugin is only
@@ -30,7 +30,7 @@ files:
30
30
  - lib/smart_proxy_discovery_image/power_api.rb
31
31
  - lib/smart_proxy_discovery_image/version.rb
32
32
  - settings.d/discovery_image.yml.example
33
- homepage: http://github.com/theforeman/smart_proxy_discovery_image
33
+ homepage: https://github.com/theforeman/smart_proxy_discovery_image
34
34
  licenses:
35
35
  - GPL-3.0
36
36
  metadata: {}
@@ -49,8 +49,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
49
49
  - !ruby/object:Gem::Version
50
50
  version: '0'
51
51
  requirements: []
52
- rubyforge_project:
53
- rubygems_version: 2.6.11
52
+ rubygems_version: 3.1.2
54
53
  signing_key:
55
54
  specification_version: 4
56
55
  summary: FDI API for Foreman Smart-Proxy