Class: Litbuild::BashScriptVisitor

Inherits:
Visitor
  • Object
show all
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

Instance Method Summary collapse

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.expand_path('.'))
  @scm = SourceCodeManager.new(@parameters['TARFILE_DIR'],
                               @parameters['PATCH_DIR'])
end

Instance Attribute Details

#blueprint_dirObject (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_sudoersObject



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