Files
atomic-red-team/bin/new-atomic.rb
T
2023-08-15 16:53:26 -06:00

39 lines
1.5 KiB
Ruby
Executable File

#! /usr/bin/env ruby
require 'yaml'
require 'fileutils'
def usage!
$stderr.puts "Usage: new_atomic.rb <technique identifier (ex: T1234)>"
exit 1
end
def template_technique_tests(technique_id=nil)
template = File.read "#{File.dirname(File.dirname(__FILE__))}/atomic_red_team/atomic_test_template.yaml"
template.gsub! /attack_technique: TODO/, "attack_technique: #{technique_id.upcase}" if technique_id
template
end
def template_technique_atomic_test
# hacky way to extract out everything after the "atomic_tests:" element
# would do this by loading the yaml except that loses any comments we put in the template
template_technique_tests.gsub /.*atomic_tests:\n(.*)/m, '\1'
end
technique_id = ARGV[0]
usage! if technique_id.nil?
technique_id = technique_id.upcase
technique_atomic_test_file = "#{File.dirname(File.dirname(__FILE__))}/atomics/#{technique_id}/#{technique_id}.yaml"
if File.exist? technique_atomic_test_file
puts "Atomic tests for #{technique_id} already exist - adding a new atomic test to the end"
File.open(technique_atomic_test_file, 'a') { |f| f.write("\n#{template_technique_atomic_test}") }
else
puts "Atomic tests for #{technique_id} do not already exist - creating from template"
FileUtils.mkdir_p File.dirname(technique_atomic_test_file)
File.open(technique_atomic_test_file, 'w') { |f| f.write(template_technique_tests(technique_id)) }
end
# open the file in the default editor
exec("#{ENV.fetch('EDITOR', 'vi')} '#{technique_atomic_test_file}'")