diff --git a/plugins/lab.rb b/plugins/lab.rb index 0c3e97838f..efc4bb9b47 100644 --- a/plugins/lab.rb +++ b/plugins/lab.rb @@ -60,7 +60,76 @@ class Plugin::Lab < Msf::Plugin def cmd_lab_load(*args) return lab_usage unless args.count == 1 - @controller.from_file(args[0]) + + res = args[0] + good_res = nil + if (File.file? res and File.readable? res) + # then the provided argument is an absolute path and is gtg. + good_res = res + elsif + # let's check to see if it's in the data/lab dir (like when tab completed) + [ + ::Msf::Config.data_directory + File::SEPARATOR + "lab", + # there isn't a user_data_directory, but could use: + #::Msf::Config.user_plugins_directory + File::SEPARATOR + "lab" + ].each do |dir| + res_path = dir + File::SEPARATOR + res + if (File.file?(res_path) and File.readable?(res_path)) + good_res = res_path + break + end + end + end + if good_res + @controller.from_file(good_res) + else + print_error("#{res} is not a valid lab definition file (.yml)") + end + end + + # + # Tab completion for the lab_load command + # + def cmd_lab_load_tabs(str, words) + tabs = [] + #return tabs if words.length > 1 + if ( str and str =~ /^#{Regexp.escape(File::SEPARATOR)}/ ) + # then you are probably specifying a full path so let's just use normal file completion + return tab_complete_filenames(str,words) + elsif (not words[1] or not words[1].match(/^\//)) + # then let's start tab completion in the data/lab directory + begin + [ + ::Msf::Config.data_directory + File::SEPARATOR + "lab", + # there isn't a user_data_directory, but could use: + #::Msf::Config.user_plugins_directory + File::SEPARATOR + "lab" + ].each do |dir| + next if not ::File.exist? dir + tabs += ::Dir.new(dir).find_all { |e| + path = dir + File::SEPARATOR + e + ::File.file?(path) and File.readable?(path) + } + end + rescue Exception + end + else + tabs += tab_complete_filenames(str,words) + end + return tabs + end + + def cmd_lab_load_dir(*args) + return lab_usage unless args.count == 2 + @controller.build_from_dir(args[0],args[1],true) + end + + def cmd_lab_clear(*args) + @controller.clear! + end + + def cmd_lab_save(*args) + return lab_usage if args.empty? + @controller.to_file(args[0]) end def cmd_lab_load_running(*args)