Class: Litbuild::BashScriptVisitor
- Defined in:
- lib/litbuild/bash_script_visitor.rb
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
-
#blueprint_dir ⇒ Object
readonly
Returns the value of attribute blueprint_dir.
Instance Method Summary collapse
-
#initialize(parameters:) ⇒ BashScriptVisitor
constructor
A new instance of BashScriptVisitor.
- #visit_commands(commands:) ⇒ Object
- #visit_package(package:) ⇒ Object
- #visit_section(section:) ⇒ Object
- #write_sudoers ⇒ Object
- #write_toplevel_script(target:) ⇒ Object
Methods inherited from Visitor
#in_subdirectory, #visit_narrative
Constructor Details
#initialize(parameters:) ⇒ BashScriptVisitor
Returns a new instance of BashScriptVisitor.
20 21 22 23 24 25 26 27 28 29 |
# File 'lib/litbuild/bash_script_visitor.rb', line 20 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.('.')) @scm = SourceCodeManager.new(@parameters['TARFILE_DIR'], @parameters['PATCH_DIR']) end |
Instance Attribute Details
#blueprint_dir ⇒ Object (readonly)
Returns the value of attribute blueprint_dir.
18 19 20 |
# File 'lib/litbuild/bash_script_visitor.rb', line 18 def blueprint_dir @blueprint_dir end |
Instance Method Details
#visit_commands(commands:) ⇒ Object
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/litbuild/bash_script_visitor.rb', line 31 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 render_restart_header(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
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/litbuild/bash_script_visitor.rb', line 55 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
72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/litbuild/bash_script_visitor.rb', line 72 def visit_section(section:) section_dir = File.join(cwd, section.name) write(blueprint: section, location: cwd) do |script| render_restart_header(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
84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'lib/litbuild/bash_script_visitor.rb', line 84 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
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
# File 'lib/litbuild/bash_script_visitor.rb', line 97 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') 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 |