teuton 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +7 -0
  2. data/bin/teuton +4 -0
  3. data/lib/teuton/application.rb +53 -0
  4. data/lib/teuton/case_manager/case/builtin/main.rb +24 -0
  5. data/lib/teuton/case_manager/case/builtin/package.rb +20 -0
  6. data/lib/teuton/case_manager/case/builtin/service.rb +32 -0
  7. data/lib/teuton/case_manager/case/builtin/user.rb +20 -0
  8. data/lib/teuton/case_manager/case/case.rb +114 -0
  9. data/lib/teuton/case_manager/case/close.rb +29 -0
  10. data/lib/teuton/case_manager/case/config.rb +76 -0
  11. data/lib/teuton/case_manager/case/dsl/check.rb +24 -0
  12. data/lib/teuton/case_manager/case/dsl/deprecated.rb +14 -0
  13. data/lib/teuton/case_manager/case/dsl/expect.rb +78 -0
  14. data/lib/teuton/case_manager/case/dsl/getset.rb +22 -0
  15. data/lib/teuton/case_manager/case/dsl/goto.rb +35 -0
  16. data/lib/teuton/case_manager/case/dsl/log.rb +14 -0
  17. data/lib/teuton/case_manager/case/dsl/main.rb +11 -0
  18. data/lib/teuton/case_manager/case/dsl/missing.rb +12 -0
  19. data/lib/teuton/case_manager/case/dsl/send.rb +69 -0
  20. data/lib/teuton/case_manager/case/dsl/target.rb +16 -0
  21. data/lib/teuton/case_manager/case/dsl/unique.rb +11 -0
  22. data/lib/teuton/case_manager/case/main.rb +7 -0
  23. data/lib/teuton/case_manager/case/play.rb +59 -0
  24. data/lib/teuton/case_manager/case/result/ext_array.rb +43 -0
  25. data/lib/teuton/case_manager/case/result/ext_compare.rb +147 -0
  26. data/lib/teuton/case_manager/case/result/ext_filter.rb +68 -0
  27. data/lib/teuton/case_manager/case/result/result.rb +73 -0
  28. data/lib/teuton/case_manager/case/runner.rb +134 -0
  29. data/lib/teuton/case_manager/case_manager.rb +76 -0
  30. data/lib/teuton/case_manager/check_cases.rb +73 -0
  31. data/lib/teuton/case_manager/dsl.rb +31 -0
  32. data/lib/teuton/case_manager/export_manager.rb +20 -0
  33. data/lib/teuton/case_manager/hall_of_fame.rb +28 -0
  34. data/lib/teuton/case_manager/main.rb +6 -0
  35. data/lib/teuton/case_manager/report.rb +52 -0
  36. data/lib/teuton/case_manager/show.rb +19 -0
  37. data/lib/teuton/case_manager/utils.rb +57 -0
  38. data/lib/teuton/command/create.rb +20 -0
  39. data/lib/teuton/command/download.rb +26 -0
  40. data/lib/teuton/command/main.rb +9 -0
  41. data/lib/teuton/command/play.rb +34 -0
  42. data/lib/teuton/command/readme.rb +23 -0
  43. data/lib/teuton/command/test.rb +35 -0
  44. data/lib/teuton/command/update.rb +27 -0
  45. data/lib/teuton/command/version.rb +13 -0
  46. data/lib/teuton/files/start.rb +13 -0
  47. data/lib/teuton/project/configfile_reader.rb +49 -0
  48. data/lib/teuton/project/laboratory/builtin.rb +23 -0
  49. data/lib/teuton/project/laboratory/dsl.rb +117 -0
  50. data/lib/teuton/project/laboratory/laboratory.rb +55 -0
  51. data/lib/teuton/project/laboratory/show.rb +161 -0
  52. data/lib/teuton/project/name_file_finder.rb +129 -0
  53. data/lib/teuton/project/project.rb +62 -0
  54. data/lib/teuton/project/project_creator.rb +79 -0
  55. data/lib/teuton/project/readme/dsl.rb +109 -0
  56. data/lib/teuton/project/readme/lang.rb +30 -0
  57. data/lib/teuton/project/readme/readme.rb +156 -0
  58. data/lib/teuton/rake_function/check.rb +39 -0
  59. data/lib/teuton/rake_function/install.rb +36 -0
  60. data/lib/teuton/report/close.rb +34 -0
  61. data/lib/teuton/report/formatter/array_formatter.rb +84 -0
  62. data/lib/teuton/report/formatter/base_formatter.rb +33 -0
  63. data/lib/teuton/report/formatter/csv_formatter.rb +31 -0
  64. data/lib/teuton/report/formatter/formatter_factory.rb +73 -0
  65. data/lib/teuton/report/formatter/html_formatter.rb +81 -0
  66. data/lib/teuton/report/formatter/json_formatter.rb +17 -0
  67. data/lib/teuton/report/formatter/list_formatter.rb +71 -0
  68. data/lib/teuton/report/formatter/moodle_csv_formatter.rb +28 -0
  69. data/lib/teuton/report/formatter/resume_array_formatter.rb +49 -0
  70. data/lib/teuton/report/formatter/resume_json_formatter.rb +16 -0
  71. data/lib/teuton/report/formatter/resume_list_formatter.rb +62 -0
  72. data/lib/teuton/report/formatter/resume_txt_formatter.rb +102 -0
  73. data/lib/teuton/report/formatter/resume_yaml_formatter.rb +16 -0
  74. data/lib/teuton/report/formatter/txt_formatter.rb +102 -0
  75. data/lib/teuton/report/formatter/xml_formatter.rb +42 -0
  76. data/lib/teuton/report/formatter/yaml_formatter.rb +18 -0
  77. data/lib/teuton/report/report.rb +55 -0
  78. data/lib/teuton/report/show.rb +111 -0
  79. data/lib/teuton/utils/verbose.rb +15 -0
  80. data/lib/teuton.rb +17 -0
  81. metadata +263 -0
@@ -0,0 +1,161 @@
1
+ require 'terminal-table'
2
+ require 'rainbow'
3
+
4
+ require_relative '../../application'
5
+ require_relative '../configfile_reader'
6
+
7
+ # Laboratory
8
+ # * show_dsl
9
+ # * show_stats
10
+ # * show_config
11
+ class Laboratory
12
+ def show_dsl
13
+ @verbose = true
14
+ process_content
15
+ show_stats
16
+ show_config
17
+ end
18
+
19
+ def show_stats
20
+ @stats[:hosts] = 0
21
+ @hosts.each_pair { |_k, v| @stats[:hosts] += v }
22
+
23
+ my_screen_table = Terminal::Table.new do |st|
24
+ st.add_row ['DSL Stats', 'Count']
25
+ st.add_separator
26
+ st.add_row ['Groups', @stats[:groups]]
27
+ st.add_row ['Targets', @stats[:targets]]
28
+ st.add_row ['Goto', @stats[:hosts]]
29
+ @hosts.each_pair { |k, v| st.add_row [" * #{k}", v] }
30
+ st.add_row ['Uniques', @stats[:uniques]]
31
+ st.add_row ['Logs', @stats[:uniques]]
32
+ st.add_row [' ', ' ']
33
+
34
+ st.add_row ['Gets', @stats[:gets]]
35
+ if @gets.count > 0
36
+ list = @gets.sort_by { |_k, v| v }
37
+ list.reverse_each { |item| st.add_row [" * #{item[0]}", item[1].to_s] }
38
+ end
39
+
40
+ st.add_row ['Sets', @stats[:sets]]
41
+ if @sets.count > 0
42
+ @sets.each_pair { |k, v| st.add_row [" * #{k}", v.to_s] }
43
+ end
44
+ end
45
+ verboseln my_screen_table.to_s + "\n"
46
+ end
47
+
48
+ def show_config
49
+ @verbose = false
50
+ process_content
51
+ @verbose = true
52
+ revise_config_content
53
+ end
54
+
55
+ def show_requests
56
+ @verbose = false
57
+ process_content
58
+ @verbose = true
59
+ my_screen_table = Terminal::Table.new do |st|
60
+ st.add_row ['Lines', 'REQUEST description']
61
+ st.add_separator
62
+ @requests.each_with_index do |line, index|
63
+ st.add_row ['%03d' % index, line]
64
+ end
65
+ end
66
+ verboseln my_screen_table
67
+ end
68
+
69
+ private
70
+
71
+ def verbose(text)
72
+ print text if @verbose
73
+ end
74
+
75
+ def verboseln(text)
76
+ puts text if @verbose
77
+ end
78
+
79
+ def process_content
80
+ groups = Application.instance.groups
81
+ verboseln ''
82
+ groups.each do |t|
83
+ @stats[:groups] += 1
84
+
85
+ msg = "GROUP: #{t[:name]}"
86
+ my_screen_table = Terminal::Table.new { |st| st.add_row [msg] }
87
+ verboseln my_screen_table
88
+
89
+ instance_eval(&t[:block])
90
+ end
91
+ end
92
+
93
+ def find_script_vars
94
+ script_vars = [:tt_members]
95
+ @hosts.each_key do |k|
96
+ next if k == :localhost
97
+
98
+ if k.class == Symbol
99
+ script_vars << (k.to_s + '_ip').to_sym
100
+ script_vars << (k.to_s + '_username').to_sym
101
+ script_vars << (k.to_s + '_password').to_sym
102
+ else
103
+ script_vars << k.to_s + '_ip'
104
+ script_vars << k.to_s + '_username'
105
+ script_vars << k.to_s + '_password'
106
+ end
107
+ end
108
+ @gets.each_key { |k| script_vars << k }
109
+ script_vars
110
+ end
111
+
112
+ def recomended_config_content
113
+ verbose Rainbow('[WARN] File ').yellow
114
+ verbose Rainbow(@path[:config]).yellow.bright
115
+ verboseln Rainbow(' not found!').yellow
116
+ verboseln '[INFO] Recomended content:'
117
+ output = { global: nil, cases: [] }
118
+ output[:cases][0] = {}
119
+ script_vars = find_script_vars
120
+ script_vars.each { |i| output[:cases][0][i] = 'VALUE' }
121
+ verboseln YAML.dump(output)
122
+ end
123
+
124
+ def revise_config_content
125
+ @verbose = true
126
+ my_screen_table = Terminal::Table.new do |st|
127
+ st.add_row ['Revising CONFIG file']
128
+ end
129
+ verboseln my_screen_table
130
+
131
+ unless File.exist?(@path[:config])
132
+ recomended_config_content
133
+ return
134
+ end
135
+
136
+ script_vars = find_script_vars
137
+ config_vars = ConfigFileReader.read(@path[:config])
138
+ unless config_vars[:global].nil?
139
+ config_vars[:global].each_key { |k| script_vars.delete(k) }
140
+ end
141
+ unless config_vars[:alias].nil?
142
+ config_vars[:alias].each_key { |k| script_vars.delete(k) }
143
+ end
144
+
145
+ config_vars[:cases].each_with_index do |item, index|
146
+ next if item[:tt_skip] == true
147
+
148
+ script_vars.each do |value|
149
+ next unless item[value].nil?
150
+
151
+ next unless @sets[':' + value.to_s].nil?
152
+
153
+ verbose Rainbow(' * Define ').red
154
+ verbose Rainbow(value).red.bright
155
+ verbose Rainbow(' value for Case[').red
156
+ verbose Rainbow(index).red.bright
157
+ verboseln Rainbow('] or set tt_skip = true').red
158
+ end
159
+ end
160
+ end
161
+ end
@@ -0,0 +1,129 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rainbow'
4
+ require_relative '../application'
5
+
6
+ # Project:
7
+ # * find_filenames_for, verbose, verboseln
8
+ module NameFileFinder
9
+ def self.find_filenames_for(relpathtofile)
10
+ pathtofile = File.absolute_path(relpathtofile)
11
+
12
+ # Define:
13
+ # script_path, must contain fullpath to DSL script file
14
+ # config_path, must contain fullpath to YAML config file
15
+ if File.directory?(pathtofile)
16
+ # COMPLEX MODE: We use start.rb as main RB file
17
+ find_filenames_from_directory(pathtofile)
18
+ else
19
+ # SIMPLE MODE: We use pathtofile as main RB file
20
+ find_filenames_from_rb(pathtofile)
21
+ end
22
+ true
23
+ end
24
+
25
+ def self.find_filenames_from_directory(pathtodir)
26
+ # COMPLEX MODE: We use start.rb as main RB file
27
+ script_path = File.join(pathtodir, 'start.rb')
28
+ unless File.exist? script_path
29
+ print Rainbow('[ERROR] File ').red
30
+ print Rainbow(script_path).bright.red
31
+ puts Rainbow(' not found!').red
32
+ exit 1
33
+ end
34
+
35
+ app = Application.instance
36
+ app.project_path = pathtodir
37
+ app.script_path = script_path
38
+ app.test_name = pathtodir.split(File::SEPARATOR)[-1]
39
+
40
+ find_configfilename_from_directory(pathtodir)
41
+ end
42
+
43
+ def self.find_configfilename_from_directory(pathtodir)
44
+ # COMPLEX MODE: We use config.yaml by default
45
+ app = Application.instance
46
+
47
+ config_path = ''
48
+ if app.options['cpath'].nil?
49
+ config_name = 'config'
50
+ # Config name file is introduced by cname arg option from teuton command
51
+ config_name = app.options['cname'] unless app.options['cname'].nil?
52
+ config_path = File.join(pathtodir, "#{config_name}.json")
53
+ unless File.exist? config_path
54
+ config_path = File.join(pathtodir, "#{config_name}.yaml")
55
+ end
56
+ else
57
+ # Config path file is introduced by cpath arg option from teuton command
58
+ config_path = app.options['cpath']
59
+ end
60
+ app.config_path = config_path
61
+ end
62
+
63
+ def self.find_filenames_from_rb(script_path)
64
+ # SIMPLE MODE: We use script_path as main RB file
65
+ # This must be fullpath to DSL script file
66
+ if File.extname(script_path) != '.rb'
67
+ print Rainbow('[ERROR] Script ').red
68
+ print Rainbow(script_path).bright.red
69
+ puts Rainbow(' must have rb extension').red
70
+ exit 1
71
+ end
72
+
73
+ app = Application.instance
74
+ app.project_path = File.dirname(script_path)
75
+ app.script_path = script_path
76
+ app.test_name = File.basename(script_path, '.rb')
77
+
78
+ find_configfilenames_from_rb(script_path)
79
+ end
80
+
81
+ def self.find_configfilenames_from_rb(script_path)
82
+ # SIMPLE MODE: We use script_path as main RB file
83
+ # This must be fullpath to DSL script file
84
+ app = Application.instance
85
+
86
+ config_path = ''
87
+ if app.options['cpath'].nil?
88
+ config_name = File.basename(script_path, '.rb')
89
+ # Config name file is introduced by cname arg option from teuton command
90
+ config_name = app.options['cname'] unless app.options['cname'].nil?
91
+
92
+ config_path = File.join(app.project_path, config_name + '.json')
93
+ unless File.exist? config_path
94
+ config_path = File.join(app.project_path, config_name + '.yaml')
95
+ end
96
+ else
97
+ # Config path file is introduced by cpath arg option from teuton command
98
+ config_path = app.options['cpath']
99
+ end
100
+ app.config_path = config_path
101
+ end
102
+
103
+ def self.puts_input_info_on_screen
104
+ app = Application.instance
105
+
106
+ verbose Rainbow('[INFO] ScriptPath => ').blue
107
+ verboseln Rainbow(trim(app.script_path)).blue.bright
108
+ verbose Rainbow('[INFO] ConfigPath => ').blue
109
+ verboseln Rainbow(trim(app.config_path)).blue.bright
110
+ verbose Rainbow('[INFO] TestName => ').blue
111
+ verboseln Rainbow(trim(app.test_name)).blue.bright
112
+ end
113
+
114
+ def self.trim(input)
115
+ output = input.to_s
116
+ output = "...#{input[input.size - 50, input.size]}" if output.size > 65
117
+ output.to_s
118
+ end
119
+
120
+ def self.verboseln(text)
121
+ verbose(text + "\n")
122
+ end
123
+
124
+ def self.verbose(text)
125
+ return unless Application.instance.verbose
126
+ return if Application.instance.options['quiet']
127
+ print text
128
+ end
129
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../application'
4
+ require_relative 'name_file_finder'
5
+
6
+ # Project functions invoked by CLI project tool
7
+ # * test
8
+ # * play
9
+ # * process_input_case_option
10
+ # * readme
11
+ # * require_dsl_and_script
12
+ module Project
13
+ def self.test(pathtofile, options)
14
+ Application.instance.options.merge! options
15
+ NameFileFinder.find_filenames_for(pathtofile)
16
+ NameFileFinder.puts_input_info_on_screen
17
+ require_dsl_and_script('laboratory/laboratory') # Define DSL keywords
18
+
19
+ app = Application.instance
20
+ lab = Laboratory.new(app.script_path, app.config_path)
21
+ # lab.show_requests if options[:r]
22
+ lab.show_config if options[:c]
23
+ lab.show_dsl unless options[:r] || options[:c]
24
+ end
25
+
26
+ def self.play(pathtofile, options)
27
+ Application.instance.options.merge! options
28
+ process_input_case_option
29
+ NameFileFinder.find_filenames_for(pathtofile)
30
+ NameFileFinder.puts_input_info_on_screen
31
+ require_dsl_and_script('../case_manager/dsl') # Define DSL keywords
32
+ end
33
+
34
+ def self.process_input_case_option
35
+ options = Application.instance.options
36
+ unless options['case'].nil?
37
+ a = options['case'].split(',')
38
+ options['case'] = a.collect! { |i| i.to_i }
39
+ end
40
+ end
41
+
42
+ def self.readme(pathtofile, options)
43
+ Application.instance.options.merge! options
44
+ NameFileFinder.find_filenames_for(pathtofile)
45
+ require_dsl_and_script('readme/readme') # Define DSL keywords
46
+
47
+ app = Application.instance
48
+ readme = Readme.new(app.script_path, app.config_path)
49
+ readme.show
50
+ end
51
+
52
+ def self.require_dsl_and_script(dslpath)
53
+ app = Application.instance
54
+ require_relative dslpath
55
+ begin
56
+ require_relative app.script_path
57
+ rescue SyntaxError => e
58
+ puts e.to_s
59
+ puts Rainbow.new("[ERROR] SyntaxError into file #{app.script_path}").red
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'fileutils'
4
+ require 'rainbow'
5
+
6
+ # Project#create
7
+ # * create
8
+ # * create_main_dir_and_files
9
+ # * create_assets_dir_and_files
10
+ # * create_dir
11
+ # * create_dirs
12
+ # * copyfile
13
+ module ProjectCreator
14
+ def self.create(project_dir)
15
+ project_name = File.basename(project_dir)
16
+ puts "\n[INFO] Creating #{Rainbow(project_name).bright} project skeleton"
17
+
18
+ source_basedir = File.join(File.dirname(__FILE__), '../..')
19
+ create_dir project_dir
20
+
21
+ create_main_dir_and_files(project_dir, source_basedir)
22
+ create_assets_dir_and_files(project_dir, source_basedir)
23
+ end
24
+
25
+ def self.create_main_dir_and_files(project_dir, source_basedir)
26
+ # Directory and files: Ruby script, Configfile, gitignore
27
+ items = [
28
+ { source: 'lib/files/config.yaml', target: 'config.yaml' },
29
+ { source: 'lib/files/start.rb', target: 'start.rb' },
30
+ { source: 'lib/files/README.md', target: 'README.md' },
31
+ { source: 'lib/files/gitignore', target: '.gitignore' }
32
+ ]
33
+ items.each do |item|
34
+ source = File.join(source_basedir, item[:source])
35
+ target = File.join(project_dir, item[:target])
36
+ copyfile(source, target)
37
+ end
38
+ end
39
+
40
+ def self.create_assets_dir_and_files(project_dir, source_basedir)
41
+ # Assets Directory and files
42
+ project_assets_dir = File.join(project_dir, 'assets')
43
+ create_dir project_assets_dir
44
+ # source = File.join(source_basedir, 'lib/files/README.md')
45
+ # target = File.join(project_dir, 'README.md')
46
+ # copyfile(source, target) # README.md
47
+ puts ''
48
+ end
49
+
50
+ def self.create_dir(dirpath)
51
+ if Dir.exist? dirpath
52
+ puts "* Exists dir! => #{Rainbow(dirpath).yellow}"
53
+ else
54
+ begin
55
+ FileUtils.mkdir_p(dirpath)
56
+ puts "* Create dir => #{Rainbow(dirpath).green}"
57
+ rescue StandarError
58
+ puts "* Create dir ERROR => #{Rainbow(dirpath).red}"
59
+ end
60
+ end
61
+ end
62
+
63
+ def self.create_dirs(*args)
64
+ args.each { |arg| create_dir arg }
65
+ end
66
+
67
+ def self.copyfile(target, dest)
68
+ if File.exist? dest
69
+ puts "* Exists file! => #{Rainbow(dest).yellow}"
70
+ else
71
+ begin
72
+ FileUtils.cp(target, dest)
73
+ puts "* Create file => #{Rainbow(dest).green}"
74
+ rescue StandarError
75
+ puts "* Create file ERROR => #{Rainbow(dest).red}"
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,109 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Readme
4
+ # * target
5
+ # * goto
6
+ # * run
7
+ # * expect
8
+ # * unique
9
+ # * log
10
+ class Readme
11
+ def readme(text)
12
+ if @action[:target].nil?
13
+ # It's a group readme
14
+ @current[:readme] << text
15
+ else
16
+ # It's a target readme
17
+ @action[:readme] << text
18
+ end
19
+ end
20
+
21
+ def target(desc, args = {})
22
+ previous_host = @action[:host]
23
+ @action = { target: desc, host: previous_host, readme: [] }
24
+ weight = 1.0
25
+ weight = args[:weight].to_f if args[:weight]
26
+ @action[:weight] = weight
27
+ end
28
+ alias goal target
29
+
30
+ def goto(host = :localhost, args = {})
31
+ unless host == :localhost
32
+ b = {}
33
+ a = "#{host}_ip".to_sym
34
+ if @config[:global][a].nil? && (not @setted_params.include?(a))
35
+ @cases_params << a
36
+ end
37
+ b[:ip] = @config[:global][a] if @config[:global][a]
38
+ b[:ip] = @setted_params[a] if @setted_params[a]
39
+
40
+ a = "#{host}_username".to_sym
41
+ if @config[:global][a].nil? && (not @setted_params.include?(a))
42
+ @cases_params << a
43
+ end
44
+ b[:username] = @config[:global][a] if @config[:global][a]
45
+ b[:username] = @setted_params[a] if @setted_params[a]
46
+
47
+ a = "#{host}_password".to_sym
48
+ if @config[:global][a].nil? && (not @setted_params.include?(a))
49
+ @cases_params << a
50
+ end
51
+ b[:password] = @config[:global][a] if @config[:global][a]
52
+ b[:password] = @setted_params[a] if @setted_params[a]
53
+
54
+ @required_hosts[host.to_s] = b
55
+ end
56
+ @action[:host] = host
57
+ @action[:exec] = args[:exec] || 'noexec'
58
+ end
59
+
60
+ def run(command, args = {})
61
+ args[:exec] = command
62
+ goto(:localhost, args)
63
+ end
64
+
65
+ def expect(_cond, args = {})
66
+ @current[:actions] << @action
67
+ result.reset
68
+ end
69
+ alias expect_any expect
70
+ alias expect_none expect
71
+ alias expect_one expect
72
+
73
+ def get(value)
74
+ unless @config[:global][value].nil?
75
+ @global_params[value] = @config[:global][value]
76
+ return @config[:global][value]
77
+ end
78
+
79
+ return value.to_s.upcase if @setted_params.include? value
80
+
81
+ @cases_params << value
82
+ value.to_s.upcase
83
+ end
84
+
85
+ # If a method call is missing, then delegate to concept parent.
86
+ def method_missing(method)
87
+ a = method.to_s
88
+ instance_eval("get(:#{a[0, a.size - 1]})") if a[a.size - 1] == '?'
89
+ end
90
+
91
+ def gett(value)
92
+ a = get(value)
93
+ return "[#{value}](\#required-params)" if @cases_params.include? value
94
+ return "[#{value}](\#created-params)" if @setted_params[value]
95
+ "[#{a}](\#global-params)" if @global_params.include? value
96
+ end
97
+
98
+ def set(key, value)
99
+ @setted_params[key] = value
100
+ end
101
+
102
+ def unique(_key, _value)
103
+ # don't do nothing
104
+ end
105
+
106
+ def log(text = '', type = :info)
107
+ @data[:logs] << "[#{type}]: " + text.to_s
108
+ end
109
+ end
@@ -0,0 +1,30 @@
1
+
2
+ require_relative '../../application'
3
+
4
+ module Lang
5
+ def self.get(key)
6
+ lang = {}
7
+ lang['en'] = {
8
+ version: 'Teuton version : %s',
9
+ testname: 'Challenge name : %s',
10
+ date: 'Date : %s',
11
+ hosts: "\n\#\#\# Required hosts\n",
12
+ params: "\n\#\#\# Required params\n",
13
+ goto: "\nGo to [%s](\#required-hosts) host, and do next:\n",
14
+ global: "\nGlobal parameters that can be modified:\n",
15
+ created: "\nParams created during challenge execution:\n"
16
+ }
17
+ lang['es'] = {
18
+ version: 'Versión de Teuton : %s',
19
+ testname: 'Nombre del reto : %s',
20
+ date: 'Fecha : %s',
21
+ hosts: "\n\#\#\# Máquinas que se necesitan\n",
22
+ params: "\n\#\#\# Parámetros de necesarios\n",
23
+ goto: "\nIr a la máquina [%s](\#required-hosts), y hacer lo siguiente:\n",
24
+ global: "\nParámetros globales que pueden ser modificados:\n",
25
+ created: "\nParámetros creados durante la ejecución del reto:\n"
26
+ }
27
+ locale = Application.instance.options['lang'].downcase
28
+ lang[locale][key]
29
+ end
30
+ end