Class: Fetch

Inherits:
Object
  • Object
show all
Includes:
FileUtils
Defined in:
lib/fetch.rb

Instance Method Summary collapse

Constructor Details

#initialize(root = '/') ⇒ Fetch

Returns a new instance of Fetch.



30
31
32
33
34
35
36
# File 'lib/fetch.rb', line 30

def initialize(root = '/')
    @root = root
    rm_r("/tmp/post") if File.exists?("/tmp/post")
    mkdir("/tmp/post")
    cd("/tmp/post")
    @database = PackageDataBase.new(@root)
end

Instance Method Details

#do_install(filename) ⇒ Object



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/fetch.rb', line 78

def do_install(filename)
    
    extract(filename)
    rm(filename)
    new_files = Dir["**/*"].reject {|file| File.directory?(file) }
    new_directories = Dir["**/*"].reject {|file| File.file?(file) }
    @database.install_package(".packageData", ".remove", new_files)
    new_directories.each { |directory| mkdir_p("#{@root}/#{directory}") }
    for file in new_files
        install(file, "#{@root}/#{file}")
        system("chmod +x #{@root}/#{file}") if file.include?("/bin/")
    end
    install_script = File.read(".install")
    eval(install_script)
end

#fetch_package(package, output = true) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/fetch.rb', line 55

def fetch_package(package, output = true)
    mkdir_p("/tmp/post/#{package}")

    sync_data = @database.get_sync_data(package)
    repo_url = @database.get_url(@database.get_repo(package))

    file = "#{package}-#{sync_data['version']}-#{sync_data['architecture']}.pst"
    url = ("#{repo_url}/#{file}")
    begin
        if url.include?('file://')
            url.sub!("file://", '')
            cp(url, "/tmp/post/#{package}/#{file}")
            cp(url + ".sha256", "/tmp/post/#{package}/#{file}.sha256")
        else
            get_file(url, "/tmp/post/#{package}/#{file}")
            get_file(url + ".sha256", "/tmp/post/#{package}/#{file}.sha256")
        end
    rescue
        raise IncompleteError, "Error:      '#{url}' does not exist."
    end
        
end

#get_file(url, file) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/fetch.rb', line 38

def get_file(url, file)
    url = URI.parse(url)
    filename = File.basename(file)
    saved_file = File.open(file, 'w')

    Net::HTTP.new(url.host, url.port).request_get(url.path) do |response|
        length = response['Content-Length'].to_i
        saved_file_length = 0.0
        response.read_body do |fragment|
            saved_file << fragment
            saved_file_length += fragment.length
            progress = (saved_file_length / length) * 100
        end
    end
    saved_file.close()
end

#install_package(package) ⇒ Object



94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/fetch.rb', line 94

def install_package(package)
    cd("/tmp/post/#{package}")
    sync_data = @database.get_sync_data(package)
    filename = "#{package}-#{sync_data['version']}-#{sync_data['architecture']}.pst"
    file_hash = Digest::SHA256.hexdigest(open(filename, "r").read())
    real_hash = File.open("#{filename}.sha256").read().strip()
    unless (file_hash == real_hash)
        raise MismatchedHash, "Error:       #{filename} is corrupt."
    end
    rm("#{filename}.sha256")
    do_install(filename)
end