unified_mode true
default_action :setup

def grub_cmdline_attributes
  {
    "processor.max_cstate" => { "value" => "1" },
    "intel_idle.max_cstate" => { "value" => "1" },
  }
end

action :setup do
  return if !x86_instance? || on_docker?

  append_if_not_present_grub_cmdline(grub_cmdline_attributes, grub_variable)

  execute "Regenerate grub boot menu" do
    command grub_regenerate_boot_menu_command
  end
end

def append_if_not_present_grub_cmdline(attributes, grub_variable)
  grep_grub_cmdline = 'grep "^' + grub_variable + '=" /etc/default/grub'

  if shell_out(grep_grub_cmdline).stdout.include? "#{grub_variable}="
    Chef::Log.debug("Found #{grub_variable} line")
  else
    Chef::Log.warn("#{grub_variable} not found - Adding")
    shell_out('echo \'' + grub_variable + '=""\' >> /etc/default/grub')
    Chef::Log.info("Added #{grub_variable} line")
  end

  attributes.each do |attribute, properties|
    command_out = shell_out(grep_grub_cmdline).stdout
    if command_out.include? "#{attribute}"
      Chef::Log.warn("Found #{attribute} in #{grub_variable} - #{grub_variable} value: #{command_out}")
    else
      Chef::Log.info("#{attribute} not found - Adding")
      shell_out('sed -i \'s/^\(' + grub_variable + '=".*\)"$/\1 ' + attribute + '=' + properties['value'] + '"/g\' /etc/default/grub')
      Chef::Log.info("Added #{attribute}=#{properties['value']} to #{grub_variable}")
    end
  end
end