Class: Litbuild::BashScriptVisitor
Overview
This class writes bash scripts to directories, rooted at the SCRIPT_DIR directory. It adds a sequential number prefix on each script written to a directory, and ensures that no duplicate scripts are written: if a script for a specific blueprint (or blueprint phase) has already been written to any directory, BashScriptVisitor will ignore subsequent requests to write that blueprint (phase).
Constant Summary
collapse
- INSTALL_GID =
9999
Instance Attribute Summary collapse
Instance Method Summary
collapse
#indent_for, #strip_indentation_from_array, #strip_indentation_from_string, #strip_indentation_from_value
Methods inherited from Visitor
#in_subdirectory, #visit_narrative
Constructor Details
23
24
25
26
27
28
29
30
31
32
|
# File 'lib/litbuild/bash_script_visitor.rb', line 23
def initialize(parameters:)
@parameters = parameters
super(directory: @parameters['SCRIPT_DIR'])
@written = Hash.new { |hash, key| hash[key] = [] }
@all_written_targets = []
@all_commands = []
@blueprint_dir = quote(File.expand_path('.'))
@scm = SourceCodeManager.new(@parameters['TARFILE_DIR'],
@parameters['PATCH_DIR'])
end
|
Instance Attribute Details
#blueprint_dir ⇒ Object
Returns the value of attribute blueprint_dir.
21
22
23
|
# File 'lib/litbuild/bash_script_visitor.rb', line 21
def blueprint_dir
@blueprint_dir
end
|
Instance Method Details
#visit_commands(commands:) ⇒ Object
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
# File 'lib/litbuild/bash_script_visitor.rb', line 34
def visit_commands(commands:)
write(blueprint: commands, location: cwd) do |script|
phase = commands.active_phase
restart_file = if phase
"#{commands.name}::#{phase.tr(' ', '_')}"
else
commands.name
end
(script, restart_file)
log = commands.logfile(commands.name, phase)
cmds = commands['commands'] || []
files = handle_file_directives(commands)
render_servicedirs(script: script,
dirs: commands['servicedir'],
pipelines: commands['service-pipeline'])
cmds = [files, cmds].flatten
cmds.each do |command|
render_command(script, command, log)
end
render_cfgrepo_trailer(script, commands, log)
render_restart_trailer(script, restart_file)
end
end
|
#visit_package(package:) ⇒ Object
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
# File 'lib/litbuild/bash_script_visitor.rb', line 58
def visit_package(package:)
write(blueprint: package, location: cwd) do |script|
if (File.stat('/etc').gid == INSTALL_GID) &&
Process.uid.zero? &&
(ENV['LITBUILD_PKGUSR'] != 'false')
pkgusr = { 'name' => [package.name],
'description' => package['full-name'] }
package.directives['package-user'] ||= [pkgusr]
end
if package.directives.include?('package-user')
render_package_user(package, script)
else
render_standard_package(package, script)
end
end
end
|
#visit_section(section:) ⇒ Object
75
76
77
78
79
80
81
82
83
84
85
|
# File 'lib/litbuild/bash_script_visitor.rb', line 75
def visit_section(section:)
section_dir = File.join(cwd, section.name)
write(blueprint: section, location: cwd) do |script|
(script, section.name)
FileUtils.mkdir_p(section_dir)
script.puts("cd $(dirname $0)/#{section.name}")
skip_line(script)
write_components(location: section_dir, script: script)
render_restart_trailer(script, section.name)
end
end
|
#write_sudoers ⇒ Object
87
88
89
90
91
92
93
94
95
96
97
98
|
# File 'lib/litbuild/bash_script_visitor.rb', line 87
def write_sudoers
script_dir = @parameters['SCRIPT_DIR']
sudoers = sudoers_entries.sort
return if sudoers.empty?
full_path = File.join(script_dir, 'lb-sudoers')
File.open(full_path, 'w') do |f|
sudoers.each do |s|
f.puts(s)
end
end
end
|
#write_toplevel_script(target:) ⇒ Object
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
# File 'lib/litbuild/bash_script_visitor.rb', line 100
def write_toplevel_script(target:)
script_dir = @parameters['SCRIPT_DIR']
return if @written[script_dir].empty?
script_name = File.join(script_dir, "#{target}.sh")
File.open(script_name, 'w') do |f|
f.puts("#!#{find_bash}/bash")
skip_line(f)
f.puts("trap 'echo UTTER FAILURE on line $LINENO' ERR")
f.puts('set -e -v')
f.puts('cd $(dirname $0)')
skip_line(f)
write_components(location: script_dir, script: f)
f.puts('set +v')
f.puts('echo TOTAL SUCCESS')
end
FileUtils.chmod('ugo+x', script_name)
end
|