123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- module Msf
- ###
- #
- # This class hooks all session creation events and plays a sound
- #
- ###
- class Plugin::EventSounds < Msf::Plugin
- attr_accessor :theme, :base, :queue, :queue_thread
- attr_reader :try_harder, :excellent, :got_a_shell, :exploit_worked, :wonderful
- include Msf::SessionEvent
- def play_sound(event)
- queue.push(event)
- end
- def on_session_open(_session)
- sound = [
- excellent,
- got_a_shell,
- exploit_worked,
- wonderful
- ].sample
- play_sound(sound)
- end
- def on_session_close(session, reason = '')
- # Cannot find an audio clip of muts saying something suitable for this.
- end
- def on_session_fail(_reason = '')
- play_sound(try_harder)
- end
- def on_plugin_load; end
- def on_plugin_unload; end
- def start_sound_queue
- self.queue_thread = Thread.new do
- loop do
- while (event = queue.shift)
- path = ::File.join(base, theme, "#{event}.wav")
- if ::File.exist?(path)
- Rex::Compat.play_sound(path)
- else
- print_status("Warning: sound file not found: #{path}")
- end
- end
- select(nil, nil, nil, 0.25)
- end
- rescue ::Exception => e
- print_status("Sound plugin: fatal error #{e} #{e.backtrace}")
- end
- end
- def stop_sound_queue
- queue_thread.kill if queue_thread
- self.queue_thread = nil
- self.queue = []
- end
- def init_sound_paths
- @try_harder = 'try_harder'
- @excellent = 'excellent'
- @got_a_shell = 'got_a_shell'
- @exploit_worked = 'exploit_worked'
- @wonderful = 'wonderful'
- end
- def initialize(framework, opts)
- super
- init_sound_paths
- self.queue = []
- self.theme = opts['theme'] || 'default'
- self.base = File.join(Msf::Config.data_directory, 'sounds')
- self.framework.events.add_session_subscriber(self)
- start_sound_queue
- on_plugin_load
- end
- def cleanup
- on_plugin_unload
- framework.events.remove_session_subscriber(self)
- stop_sound_queue
- end
- def name
- 'sounds'
- end
- def desc
- 'Automatically plays a sound when various framework events occur'
- end
- end
- end
|