software_smithy 1.1 → 1.6
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/smithy +140 -33
- data/etc/completion/smithy-completion.bash +106 -7
- data/etc/completion/zsh/_smithy +121 -27
- data/etc/templates/formula.rb.erb +11 -0
- data/etc/templates/web/machine_version_table.html.erb +0 -7
- data/etc/templates/web/version_table.html.erb +2 -2
- data/lib/smithy/config.rb +70 -13
- data/lib/smithy/description.rb +4 -4
- data/lib/smithy/download_cache.rb +120 -0
- data/lib/smithy/file_operations.rb +13 -6
- data/lib/smithy/formula.rb +203 -0
- data/lib/smithy/formula_command.rb +198 -0
- data/lib/smithy/helpers.rb +83 -37
- data/lib/smithy/module_file.rb +21 -10
- data/lib/smithy/package.rb +111 -86
- data/lib/smithy.rb +3 -0
- data/lib/smithy_version.rb +1 -1
- data/man/man1/smithy.1 +240 -53
- data/smithy.rdoc +107 -7
- metadata +84 -39
- data/README.rdoc +0 -114
- data/etc/smithyrc +0 -36
data/etc/completion/zsh/_smithy
CHANGED
@@ -4,30 +4,46 @@ _smithy_packages() {
|
|
4
4
|
packages=(`smithy search --format=name`)
|
5
5
|
}
|
6
6
|
|
7
|
+
_smithy_formulas() {
|
8
|
+
formulas=(`smithy formula list`)
|
9
|
+
}
|
10
|
+
|
11
|
+
_smithy_architectures() {
|
12
|
+
arches=(`smithy show arch --all`)
|
13
|
+
_wanted packages expl 'architectures' compadd -a arches
|
14
|
+
}
|
15
|
+
|
7
16
|
local -a _1st_arguments
|
8
17
|
_1st_arguments=(
|
9
|
-
|
10
|
-
'deploy:Deploy a package'
|
18
|
+
'build:Build software'
|
11
19
|
'edit:Edit package support files'
|
12
|
-
'
|
20
|
+
'formula:Install software from predefined formulas'
|
21
|
+
'help:Shows a list of commands or help for one command'
|
13
22
|
'module:Manage modulefiles for a package'
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
23
|
+
'new:Generate a new build and all necessary files'
|
24
|
+
'publish:Publish packages to web'
|
25
|
+
'repair:Repair a package'
|
26
|
+
'search:Search currently installed software'
|
27
|
+
'show:Display internal smithy values'
|
28
|
+
'test:Test software'
|
18
29
|
)
|
19
30
|
|
20
31
|
local expl
|
21
32
|
local -a formulae
|
22
33
|
|
23
34
|
_arguments \
|
24
|
-
'(--arch=)--arch=[Machine architecture to operate on]' \
|
35
|
+
'(--arch=)--arch=[Machine architecture to operate on]:architecture:_smithy_architectures' \
|
36
|
+
'(--no-color)--no-color[Disable colored output]' \
|
37
|
+
'(--color)--color[Enable colored output]' \
|
25
38
|
'(--config-file=)--config-file=[Alternate config file]:file:_files' \
|
39
|
+
'(--descriptions-root=)--descriptions-root=[The root level directory for global description files]:directory:_files -/' \
|
26
40
|
'(--disable-group-writeable)--disable-group-writeable[Disable group writable file creation]' \
|
41
|
+
'(-f --force)'{-f,--force}'[Always overwrite existing files]' \
|
27
42
|
'(--file-group-name=)--file-group-name=[Group name for files created by smithy]' \
|
28
43
|
'(--help)--help[Show help]' \
|
29
|
-
'(--
|
44
|
+
'(--prgenv-prefix=)--prgenv-prefix=[The prefix of programming environments for this machine]' \
|
30
45
|
'(--software-root=)--software-root=[The root level directory for software]:directory:_files -/' \
|
46
|
+
'(-v --verbose)'{-v,--verbose}'[Be more verbose]' \
|
31
47
|
'(--web-root=)--web-root=[The root level directory for web files]:directory:_files -/' \
|
32
48
|
'*:: :->subcmds' && return 0
|
33
49
|
#[[ "$PREFIX" = --* ]] && _arguments -- \
|
@@ -41,10 +57,15 @@ if (( CURRENT == 1 )); then
|
|
41
57
|
return
|
42
58
|
fi
|
43
59
|
|
60
|
+
# echo $words >/dev/ttys004
|
61
|
+
# echo $CURRENT >/dev/ttys004
|
62
|
+
|
44
63
|
# completion for each sub command
|
45
64
|
case "$words[1]" in
|
46
65
|
help)
|
47
|
-
_describe -t commands "smithy subcommand" _1st_arguments
|
66
|
+
_describe -t commands "smithy subcommand" _1st_arguments
|
67
|
+
;;
|
68
|
+
|
48
69
|
build|test)
|
49
70
|
_arguments \
|
50
71
|
'(--disable-log)--disable-log[Disable logging]' \
|
@@ -57,21 +78,14 @@ case "$words[1]" in
|
|
57
78
|
if [[ "$state" == forms ]]; then
|
58
79
|
_smithy_packages
|
59
80
|
_wanted packages expl 'packages' compadd -a packages
|
60
|
-
fi
|
61
|
-
|
62
|
-
_arguments \
|
63
|
-
'(-n --dry-run)'{-n,--dry-run}'[See what files will be created without creating them]' \
|
64
|
-
'1: :->forms' && return 0
|
81
|
+
fi
|
82
|
+
;;
|
65
83
|
|
66
|
-
if [[ "$state" == forms ]]; then
|
67
|
-
_smithy_packages
|
68
|
-
_wanted packages expl 'packages' compadd -a packages
|
69
|
-
fi ;;
|
70
84
|
edit)
|
71
85
|
_subsub_commands=(
|
72
86
|
'build:Edit a build script'
|
73
87
|
'test:Edit a test script'
|
74
|
-
'
|
88
|
+
'env:Edit modules loaded for the build script'
|
75
89
|
'modulefile:Edit modulefile'
|
76
90
|
)
|
77
91
|
# Match subsub-command
|
@@ -88,12 +102,15 @@ case "$words[1]" in
|
|
88
102
|
if [[ "$state" == forms ]]; then
|
89
103
|
_smithy_packages
|
90
104
|
_wanted packages expl 'packages' compadd -a packages
|
91
|
-
fi
|
105
|
+
fi
|
106
|
+
;;
|
107
|
+
|
92
108
|
module)
|
93
109
|
_subsub_commands=(
|
94
110
|
'create:Generate a modulefile for a given package'
|
95
|
-
'use:Add a modulefile to the MODULEPATH'
|
96
111
|
'deploy:Copy a modulefile to the system MODULEPATH'
|
112
|
+
'edit:Alias for "smithy edit modulefile"'
|
113
|
+
'use:Add a modulefile to the MODULEPATH'
|
97
114
|
)
|
98
115
|
# Match subsub-command
|
99
116
|
if (( CURRENT == 2 )); then
|
@@ -103,18 +120,23 @@ case "$words[1]" in
|
|
103
120
|
|
104
121
|
_arguments \
|
105
122
|
'(-n --dry-run)'{-n,--dry-run}'[See what files will be created without creating them]' \
|
106
|
-
'
|
123
|
+
'1: :->forms' && return 0
|
107
124
|
|
108
125
|
if [[ "$state" == forms ]]; then
|
109
126
|
_smithy_packages
|
110
127
|
_wanted packages expl 'packages' compadd -a packages
|
111
|
-
fi
|
128
|
+
fi
|
129
|
+
;;
|
130
|
+
|
112
131
|
new)
|
113
132
|
_arguments \
|
133
|
+
'(--existing-scripts)--existing-scripts[Use an existing softwares build scripts]' \
|
114
134
|
'(--skip-modulefile)--skip-modulefile[Skip modulefile generation]' \
|
115
135
|
'(--web-description)--web-description[Create description file for website]' \
|
116
136
|
'(-n --dry-run)'{-n,--dry-run}'[See what files will be created without creating them]' \
|
117
|
-
'(-t --tarball=)'{-t,--tarball=}'[Provide a source tarball to unpack (optional)]:file:_files'
|
137
|
+
'(-t --tarball=)'{-t,--tarball=}'[Provide a source tarball to unpack (optional)]:file:_files'
|
138
|
+
;;
|
139
|
+
|
118
140
|
repair)
|
119
141
|
_arguments \
|
120
142
|
'(-n --dry-run)'{-n,--dry-run}'[Verify permissions only]' \
|
@@ -123,8 +145,80 @@ case "$words[1]" in
|
|
123
145
|
if [[ "$state" == forms ]]; then
|
124
146
|
_smithy_packages
|
125
147
|
_wanted packages expl 'packages' compadd -a packages
|
126
|
-
fi
|
148
|
+
fi
|
149
|
+
;;
|
150
|
+
|
127
151
|
search)
|
128
152
|
_arguments \
|
129
|
-
'(--format=)--format=[Format of the output]:format:(path name table csv)'
|
153
|
+
'(--format=)--format=[Format of the output]:format:(path name table csv dokuwiki)'
|
154
|
+
;;
|
155
|
+
|
156
|
+
show)
|
157
|
+
_subsub_commands=(
|
158
|
+
'arch:List all architectures know to smithy.'
|
159
|
+
'example_config:Display an example config file.'
|
160
|
+
'last:Display the package name used in the last smithy command. This is stored in the ~/.smithyrc file.'
|
161
|
+
)
|
162
|
+
# Match subsub-command
|
163
|
+
if (( CURRENT == 2 )); then
|
164
|
+
_describe -t subcommands "show subcommand" _subsub_commands
|
165
|
+
return
|
166
|
+
fi
|
167
|
+
;;
|
168
|
+
|
169
|
+
publish)
|
170
|
+
_arguments \
|
171
|
+
'(-n --dry-run)'{-n,--dry-run}'[See what files will be created without creating them]' \
|
172
|
+
'1: :->forms' && return 0
|
173
|
+
|
174
|
+
if [[ "$state" == forms ]]; then
|
175
|
+
_smithy_packages
|
176
|
+
_wanted packages expl 'packages' compadd -a packages
|
177
|
+
fi
|
178
|
+
;;
|
179
|
+
|
180
|
+
formula)
|
181
|
+
# echo $words[$CURRENT] > /dev/ttys004
|
182
|
+
|
183
|
+
_subsub_commands=(
|
184
|
+
'create_modulefile:Create a modulefile for a given package'
|
185
|
+
'display:Display a formula'
|
186
|
+
'install:Install a package using a formula'
|
187
|
+
'list:List known formulas'
|
188
|
+
'new:Create a new formula'
|
189
|
+
'which:Display a formula location'
|
190
|
+
)
|
191
|
+
|
192
|
+
# not sure how to make this work right
|
193
|
+
# _arguments \
|
194
|
+
# '(-d --directories=)'{-d,--directories=}'[Specify one or more additional formula directories separated with commas]:directory:_files -/' \
|
195
|
+
# '1: :->forms' && return 0
|
196
|
+
|
197
|
+
# Match subsub-command
|
198
|
+
if (( CURRENT == 2 )); then
|
199
|
+
_describe -t subcommands "formula subcommand" _subsub_commands
|
200
|
+
return
|
201
|
+
fi
|
202
|
+
|
203
|
+
# Match subsub-command arguments
|
204
|
+
if (( CURRENT == 3 )); then
|
205
|
+
case "$words[2]" in
|
206
|
+
install)
|
207
|
+
_arguments \
|
208
|
+
'(--clean)--clean[clean existing install prefix]' \
|
209
|
+
'(--no-clean)--no-clean[leave existing install prefix files intact]' \
|
210
|
+
'(-f --formula-name)'{-f,--formula-name}'[Formula name]' \
|
211
|
+
'(-m --modulefile)'{-m,--modulefile}'[Create modulefiles as well]' \
|
212
|
+
'1: :->forms' && return 0
|
213
|
+
if [[ "$state" == forms ]]; then
|
214
|
+
_smithy_formulas
|
215
|
+
_wanted packages expl 'formulas' compadd -a formulas
|
216
|
+
fi
|
217
|
+
;;
|
218
|
+
esac
|
219
|
+
|
220
|
+
return
|
221
|
+
fi
|
222
|
+
|
223
|
+
;;
|
130
224
|
esac
|
@@ -6,13 +6,6 @@
|
|
6
6
|
<td style="text-align:center;"><b>System</b></td>
|
7
7
|
<td style="text-align:center;"><b>Application/Version</b></td>
|
8
8
|
<td style="text-align:center;"><b>Build</b></td>
|
9
|
-
<!-- <%# ModuleFile::Environments.reject{|e| e[:human_name]=="pathscale"}.each do |e| %> -->
|
10
|
-
<!-- <td style="text-align:center;"> -->
|
11
|
-
<!-- <b> -->
|
12
|
-
<!-- <%#= e[:human_name].upcase %> -->
|
13
|
-
<!-- </b> -->
|
14
|
-
<!-- </td> -->
|
15
|
-
<!-- <%# end %> -->
|
16
9
|
</tr>
|
17
10
|
</thead>
|
18
11
|
|
@@ -6,7 +6,7 @@ Checkmarks indicate a given version is available for the compiler specified in e
|
|
6
6
|
<thead>
|
7
7
|
<tr>
|
8
8
|
<td style="text-align:center;"><b>Version</b></td>
|
9
|
-
<% ModuleFile::
|
9
|
+
<% ModuleFile::compilers.reject{|e| e[:human_name]=="pathscale"}.each do |e| %>
|
10
10
|
<td style="text-align:center;"><b><%= e[:human_name].upcase %></b></td>
|
11
11
|
<% end %>
|
12
12
|
</tr>
|
@@ -15,7 +15,7 @@ Checkmarks indicate a given version is available for the compiler specified in e
|
|
15
15
|
<% @version_table.each do |version, builds| %>
|
16
16
|
<tr>
|
17
17
|
<td style="text-align:center;"><b><%= "#{@name}/#{version}" %></b></td>
|
18
|
-
<% ModuleFile::
|
18
|
+
<% ModuleFile::compilers.reject{|e| e[:human_name]=="pathscale"}.each do |e| %>
|
19
19
|
<td style="text-align:center;"><% if builds.select{|b|b=~e[:regex]}.size > 0 %><img width="23" height="18" style="margin:0;" title="checkmark" alt="" src="http://www.olcf.ornl.gov/wp-content/uploads/2011/03/checkmark.png"><% end %></td>
|
20
20
|
<% end %>
|
21
21
|
</tr>
|
data/lib/smithy/config.rb
CHANGED
@@ -42,7 +42,7 @@ module Smithy
|
|
42
42
|
:arch, :root, :full_root, :web_root, :file_group, :descriptions_root,
|
43
43
|
:web_architecture_names
|
44
44
|
|
45
|
-
def
|
45
|
+
def group_writable?
|
46
46
|
@global[:"disable-group-writable"] ? false : true
|
47
47
|
end
|
48
48
|
|
@@ -59,6 +59,9 @@ module Smithy
|
|
59
59
|
options_to_merge[:"file-group-name"] = @config_file_hash.try(:[], "file-group-name")
|
60
60
|
options_to_merge[:"descriptions-root"] = @config_file_hash.try(:[], "descriptions-root")
|
61
61
|
options_to_merge[:"web-architecture-names"] = @config_file_hash.try(:[], "web-architecture-names")
|
62
|
+
options_to_merge[:"download-cache"] = @config_file_hash.try(:[], "download-cache")
|
63
|
+
options_to_merge[:"formula-directories"] = @config_file_hash.try(:[], "formula-directories")
|
64
|
+
options_to_merge[:"global-error-log"] = @config_file_hash.try(:[], "global-error-log")
|
62
65
|
|
63
66
|
set_hostname_and_arch
|
64
67
|
options_to_merge[:arch] = @arch
|
@@ -90,21 +93,34 @@ module Smithy
|
|
90
93
|
def load_config_yaml
|
91
94
|
config_path = File.expand_path(ENV['SMITHY_CONFIG']) if ENV['SMITHY_CONFIG']
|
92
95
|
config_path = File.expand_path(global[:"config-file"]) if global[:"config-file"]
|
93
|
-
config_path = File.expand_path(@config_file_name) if config_path.blank?
|
94
96
|
|
95
|
-
if File.exists?
|
97
|
+
if config_path.present? && File.exists?(config_path)
|
96
98
|
@config_file_name = config_path
|
97
|
-
|
99
|
+
begin
|
100
|
+
@config_file_hash = YAML.load_file(config_path).stringify_keys
|
101
|
+
rescue
|
102
|
+
raise """Cannot interpret smithy config file. This is probably caused by malformed YAML.
|
103
|
+
#{config_path}"""
|
104
|
+
end
|
105
|
+
else
|
106
|
+
raise """Cannot read config file: #{@config_file_name}
|
107
|
+
Please set the $SMITHY_CONFIG variable to a config file location
|
108
|
+
Or use the --config-file=FILE option"""
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def architectures(options)
|
113
|
+
if options[:all]
|
114
|
+
puts @config_file_hash["hostname-architectures"].values.uniq.sort.join(" ")
|
98
115
|
else
|
99
|
-
|
100
|
-
|
116
|
+
notice_command "Current Hostname: ", @hostname, 30
|
117
|
+
notice_command "Current Architecture: ", @arch, 30
|
118
|
+
notice_command "All Architectures: ", @config_file_hash["hostname-architectures"].values.uniq.sort.join(", "), 30
|
101
119
|
end
|
102
120
|
end
|
103
121
|
|
104
|
-
def
|
105
|
-
|
106
|
-
notice_command "Current Architecture: ", @arch, 30
|
107
|
-
notice_command "All Architectures: ", @config_file_hash["hostname-architectures"].values.uniq.sort.join(", "), 30
|
122
|
+
def compilers
|
123
|
+
config_file_hash.try(:[], "compilers")
|
108
124
|
end
|
109
125
|
|
110
126
|
def get_prgenv_prefix
|
@@ -136,8 +152,8 @@ module Smithy
|
|
136
152
|
def get_software_root
|
137
153
|
if @root.blank? || @arch.blank?
|
138
154
|
raise """Cannot determine which architecture we are using.
|
139
|
-
|
140
|
-
|
155
|
+
Please specify using --arch or add a '#{@hostname}' hostname entry to:
|
156
|
+
#{@config_file_name}"""
|
141
157
|
end
|
142
158
|
|
143
159
|
s = File.join(@root, @arch)
|
@@ -157,11 +173,52 @@ module Smithy
|
|
157
173
|
|
158
174
|
def save_last_prefix(prefix)
|
159
175
|
rc_file = File.join(ENV['HOME'], '.smithyrc')
|
160
|
-
h = {:last => prefix}
|
176
|
+
h = {:last => prefix.encode('UTF-8')}
|
161
177
|
File.open(rc_file, "w+") do |f|
|
162
178
|
f.write(h.to_yaml)
|
163
179
|
end
|
164
180
|
end
|
181
|
+
|
182
|
+
def example_config
|
183
|
+
example = {}
|
184
|
+
example["software-root"] = "/sw"
|
185
|
+
example["download-cache"] = "/sw/sources"
|
186
|
+
example["formula-directories"] = [
|
187
|
+
"/sw/tools/smithy/formulas",
|
188
|
+
"/sw/tools/smithy/another_formula_directory"
|
189
|
+
]
|
190
|
+
example["global-error-log"] = "/sw/tools/smithy/exceptions.log"
|
191
|
+
example["file-group-name"] = "ccsstaff"
|
192
|
+
example["descriptions-root"] = "/sw/descriptions"
|
193
|
+
example["web-root"] = "/sw/descriptions_in_html"
|
194
|
+
example["web-architecture-names"] = {
|
195
|
+
"xk6" => "titan",
|
196
|
+
"xk7" => "titan",
|
197
|
+
"analysis-x64" => "lens",
|
198
|
+
"smoky" => "smoky"
|
199
|
+
}
|
200
|
+
example["programming-environment-prefix"] = {
|
201
|
+
"default" => "PrgEnv-",
|
202
|
+
"smoky" => "PE-",
|
203
|
+
"sith" => "PE-"
|
204
|
+
}
|
205
|
+
example["hostname-architectures"] = {
|
206
|
+
"everest-login" => "redhat6",
|
207
|
+
"everest" => "redhat6",
|
208
|
+
"lens" => "analysis-x64",
|
209
|
+
"sith-login" => "redhat6",
|
210
|
+
"sith" => "redhat6",
|
211
|
+
"smoky-login" => "smoky",
|
212
|
+
"titan-login" => "xk6",
|
213
|
+
"titan-ext" => "xk6",
|
214
|
+
"yona-login" => "yona",
|
215
|
+
"yona" => "yona"
|
216
|
+
}
|
217
|
+
example["compilers"] = ModuleFile::Environments
|
218
|
+
|
219
|
+
return example.to_yaml
|
220
|
+
end
|
221
|
+
|
165
222
|
end
|
166
223
|
end
|
167
224
|
end
|
data/lib/smithy/description.rb
CHANGED
@@ -43,7 +43,7 @@ module Smithy
|
|
43
43
|
def initialize(args = {})
|
44
44
|
@www_root = Smithy::Config.web_root
|
45
45
|
@package = args[:package]
|
46
|
-
@global_description =
|
46
|
+
@global_description = Smithy::Config.descriptions_root if Smithy::Config.descriptions_root
|
47
47
|
|
48
48
|
if @package.class == Package
|
49
49
|
@root = @package.root
|
@@ -57,12 +57,12 @@ module Smithy
|
|
57
57
|
|
58
58
|
if @global_description
|
59
59
|
@name = @package.gsub(/#{Smithy::Config.descriptions_root}\/?/, "")
|
60
|
-
@path = @
|
60
|
+
@path = File.join(Smithy::Config.descriptions_root, @name) if @global_description
|
61
61
|
else
|
62
62
|
if @package == 'last'
|
63
63
|
@name = last_prefix.split('/').try(:first)
|
64
64
|
else
|
65
|
-
@name = Package.normalize_name
|
65
|
+
@name = Package.normalize_name(args[:package])
|
66
66
|
end
|
67
67
|
@path = File.join @root, @arch, @name
|
68
68
|
end
|
@@ -254,7 +254,7 @@ module Smithy
|
|
254
254
|
if Smithy::Config.descriptions_root
|
255
255
|
File.basename(p)
|
256
256
|
else
|
257
|
-
Package.normalize_name(
|
257
|
+
Package.normalize_name(p)
|
258
258
|
end
|
259
259
|
end
|
260
260
|
@packages.sort!
|
@@ -0,0 +1,120 @@
|
|
1
|
+
module Smithy
|
2
|
+
class DownloadCache
|
3
|
+
attr_accessor :url, :name, :version, :checksums
|
4
|
+
|
5
|
+
def initialize(p, fname = nil)
|
6
|
+
@url = ''
|
7
|
+
@checksums = {}
|
8
|
+
if p.is_a? Formula
|
9
|
+
@url = p.try(:url)
|
10
|
+
@checksums.merge!(:md5 => p.md5) if p.try(:md5)
|
11
|
+
@checksums.merge!(:sha1 => p.sha1) if p.try(:sha1)
|
12
|
+
@checksums.merge!(:sha256 => p.sha256) if p.try(:sha256)
|
13
|
+
@name = p.try(:package).try(:name)
|
14
|
+
@version = p.try(:package).try(:version)
|
15
|
+
elsif p.is_a? Package
|
16
|
+
@name = p.name
|
17
|
+
@version = p.version
|
18
|
+
end
|
19
|
+
|
20
|
+
@name = fname unless fname.blank?
|
21
|
+
end
|
22
|
+
|
23
|
+
def download_cache_dir
|
24
|
+
dir = Smithy::Config.global[:"download-cache"]
|
25
|
+
dir = File.join(ENV['HOME'], '.smithy/cache') if dir.blank?
|
26
|
+
dir
|
27
|
+
end
|
28
|
+
|
29
|
+
def downloaded_file_name
|
30
|
+
url_filename(url)
|
31
|
+
end
|
32
|
+
|
33
|
+
def downloaded_file_dir
|
34
|
+
File.join(download_cache_dir, name, version)
|
35
|
+
end
|
36
|
+
|
37
|
+
def downloaded_file_path
|
38
|
+
File.join(downloaded_file_dir, downloaded_file_name)
|
39
|
+
end
|
40
|
+
|
41
|
+
def downloaded?
|
42
|
+
File.exists?(downloaded_file_path)
|
43
|
+
end
|
44
|
+
|
45
|
+
def checksum_download
|
46
|
+
return true if checksums.empty?
|
47
|
+
return false unless downloaded?
|
48
|
+
|
49
|
+
checksums.keys.each do |type|
|
50
|
+
checksum = checksums[type]
|
51
|
+
digest = ''
|
52
|
+
case type
|
53
|
+
when :md5
|
54
|
+
require 'digest/md5'
|
55
|
+
digest = Digest::MD5.hexdigest(File.read(downloaded_file_path))
|
56
|
+
when :sha1
|
57
|
+
require 'digest/sha1'
|
58
|
+
digest = Digest::SHA1.hexdigest(File.read(downloaded_file_path))
|
59
|
+
when :sha256
|
60
|
+
require 'digest/sha2'
|
61
|
+
digest = Digest::SHA256.hexdigest(File.read(downloaded_file_path))
|
62
|
+
end
|
63
|
+
|
64
|
+
if checksum != digest
|
65
|
+
raise <<-EOF.strip_heredoc
|
66
|
+
file does not match expected #{type.to_s.upcase} checksum
|
67
|
+
expected: #{checksum}
|
68
|
+
got: #{digest}
|
69
|
+
EOF
|
70
|
+
else
|
71
|
+
return true
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def download
|
77
|
+
curl = '/usr/bin/curl'
|
78
|
+
curl = `which curl` unless File.exist? curl
|
79
|
+
raise "curl cannot be located, without it files cannot be downloaded" if curl.blank?
|
80
|
+
|
81
|
+
if downloaded?
|
82
|
+
puts "downloaded ".rjust(12).color(:green).bright + downloaded_file_path
|
83
|
+
return true
|
84
|
+
else
|
85
|
+
puts "download ".rjust(12).color(:green).bright + url
|
86
|
+
end
|
87
|
+
|
88
|
+
args = ['-qf#L']
|
89
|
+
args << "--silent" unless $stdout.tty?
|
90
|
+
args << '-o'
|
91
|
+
args << downloaded_file_path
|
92
|
+
args << url
|
93
|
+
|
94
|
+
FileUtils.mkdir_p downloaded_file_dir
|
95
|
+
[downloaded_file_dir, File.join(downloaded_file_dir, '..')].each do |dir|
|
96
|
+
FileOperations.set_group(dir, Smithy::Config.global[:"file-group-name"])
|
97
|
+
FileOperations.make_group_writable(dir) unless Smithy::Config.global[:"disable-group-writable"]
|
98
|
+
end
|
99
|
+
|
100
|
+
if system(curl, *args)
|
101
|
+
FileOperations.set_group(downloaded_file_path, Smithy::Config.global[:"file-group-name"])
|
102
|
+
FileOperations.make_group_writable(downloaded_file_path) unless Smithy::Config.global[:"disable-group-writable"]
|
103
|
+
return true
|
104
|
+
else
|
105
|
+
return false
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def get(passed_url= nil)
|
110
|
+
@url = passed_url if passed_url
|
111
|
+
if download && checksum_download
|
112
|
+
return downloaded_file_path
|
113
|
+
else
|
114
|
+
return false
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|