Skip to content

Commit

Permalink
Enable boot image download for iso images
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 class for file extraction
  • Loading branch information
bastian-src committed Jul 27, 2022
1 parent 28b0212 commit 9fdcb20
Show file tree
Hide file tree
Showing 6 changed files with 50 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
1 change: 1 addition & 0 deletions lib/smart_proxy_main.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
require 'proxy/dependency_injection'
require 'proxy/util'
require 'proxy/http_download'
require 'proxy/archive_extract'
require 'proxy/helpers'
require 'proxy/memory_store'
require 'proxy/plugin_validators'
Expand Down
15 changes: 15 additions & 0 deletions modules/tftp/server.rb
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,21 @@ 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
FileUtils.chmod_R 0755, dst_path
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 9fdcb20

Please sign in to comment.