Skip to content

Commit

Permalink
Fixes #35270 - Enable boot image download
Browse files Browse the repository at this point in the history
* Implement fetch and extract boot image
* Apply correct file permissions
* Introduce and add tests for fetch_boot_image
* Implement classes for file extraction and permission changes
  • Loading branch information
bastian-src committed Jul 26, 2022
1 parent 28b0212 commit 5abea3c
Show file tree
Hide file tree
Showing 7 changed files with 71 additions and 2 deletions.
21 changes: 21 additions & 0 deletions lib/proxy/archive_extract.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
module Proxy
class ArchiveExtract < Proxy::Util::CommandTask
include Util

def initialize(src, dst, skip_existing = true)

args = [which('7z')]

# extract command
args << "x"
# source file
args << src.to_s
# skip existing files
args << "-aos" if skip_existing
# destination directory
args << "-o#{dst}"

super(args)
end
end
end
19 changes: 19 additions & 0 deletions lib/proxy/filesystem_permission.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
module Proxy
class FilesystemPermission < Proxy::Util::CommandTask
include Util

def initialize(dst, permission, include_subfolders = false)

args = [which('chmod')]

# include subfolders
args << "-R" if include_subfolders
# new permission (format: rwxrwxrwx [owner,group,others], for example 755)
args << permission.to_s
# destination directory/file
args << dst.to_s

super(args)
end
end
end
2 changes: 2 additions & 0 deletions lib/smart_proxy_main.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
require 'proxy/dependency_injection'
require 'proxy/util'
require 'proxy/http_download'
require 'proxy/archive_extract'
require 'proxy/filesystem_permission'
require 'proxy/helpers'
require 'proxy/memory_store'
require 'proxy/plugin_validators'
Expand Down
16 changes: 16 additions & 0 deletions modules/tftp/server.rb
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,22 @@ def pxeconfig_file(mac)
end
end

def self.fetch_boot_image(dst, src)

# Verify dst is a valid directory
dst_file = Pathname.new(dst).cleanpath
dst_path = Pathname.new(dst.delete_suffix(".iso"))

FileUtils.mkdir_p dst_path.parent
choose_protocol_and_fetch(src, dst_file).join
# extract iso
extract_task = ::Proxy::ArchiveExtract.new(dst_file, dst_path).start
raise "TFTP image extraction error" unless extract_task.join == 0
# adapt extracted file permission
permission_task = ::Proxy::FilesystemPermission.new(dst_path, "755", true).start
raise "TFTP image extracted file permission error" unless permission_task.join == 0
end

def self.fetch_boot_file(dst, src)
filename = boot_filename(dst, src)
destination = Pathname.new(File.expand_path(filename, Proxy::TFTP::Plugin.settings.tftproot)).cleanpath
Expand Down
4 changes: 4 additions & 0 deletions modules/tftp/tftp_api.rb
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ def create_default(variant)
end
end

post "/fetch_boot_image" do
log_halt(400, "TFTP: Failed to fetch boot file: ") { Proxy::TFTP.fetch_boot_image(params[:path], params[:url]) }
end

post "/fetch_boot_file" do
log_halt(400, "TFTP: Failed to fetch boot file: ") { Proxy::TFTP.fetch_boot_file(params[:prefix], params[:path]) }
end
Expand Down
8 changes: 7 additions & 1 deletion test/tftp/tftp_api_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,13 @@ def test_api_can_fetch_boot_file
assert last_response.ok?
end

def test_api_can_get_servername
def test_api_can_fetch_boot_image
Proxy::TFTP.expects(:fetch_boot_image).with('some/image.iso', 'http://localhost/file.iso').returns(true)
post "/fetch_boot_image", :path => 'some/image.iso', :url => 'http://localhost/file.iso'
assert last_response.ok?
end

def test_api_can_get_servername
Proxy::TFTP::Plugin.settings.stubs(:tftp_servername).returns("servername")
result = get "/serverName"
assert_match /servername/, result.body
Expand Down
3 changes: 2 additions & 1 deletion test/tftp/tftp_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
class TftpTest < Test::Unit::TestCase
def setup
@tftp = Proxy::TFTP::Server.new
Proxy::TFTP::Plugin.load_test_settings(:tftproot => "/some/root")
Proxy::TFTP::Plugin.load_test_settings(:tftproot => "/some/root",
:tftp_image_path => "/another/root")
end

def test_should_have_a_logger
Expand Down

0 comments on commit 5abea3c

Please sign in to comment.