diff options
Diffstat (limited to 'lib/rbot/plugins/wserver.rb')
-rw-r--r-- | lib/rbot/plugins/wserver.rb | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/lib/rbot/plugins/wserver.rb b/lib/rbot/plugins/wserver.rb new file mode 100644 index 00000000..e1fe10bd --- /dev/null +++ b/lib/rbot/plugins/wserver.rb @@ -0,0 +1,75 @@ +require 'net/http' +require 'uri' +Net::HTTP.version_1_2 + +class WserverPlugin < Plugin + def help(plugin, topic="") + "wserver <uri> => try and determine what webserver <uri> is using" + end + def privmsg(m) + unless(m.params && m.params =~ /^\S+$/) + m.reply "incorrect usage: " + help(m.plugins) + return + end + + redirect_count = 0 + hostname = m.params.dup + hostname = "http://#{hostname}" unless hostname =~ /:\/\// + begin + if(redirect_count > 3) + m.reply "cowardly refusing to follow more than 3 redirects" + return + end + + begin + uri = URI.parse(hostname) + rescue URI::InvalidURIError => err + m.reply "#{m.params} is not a valid URI" + return + end + + unless(uri) + m.reply "incorrect usage: " + help(m.plugin) + return + end + + http = @bot.httputil.get_proxy(uri) + http.open_timeout = 5 + + http.start {|http| + resp = http.head('/') + server = resp['Server'] + if(server && server.length > 0) + m.reply "#{uri.host} is running #{server}" + else + m.reply "couldn't tell what #{uri.host} is running" + end + + if(resp.code == "302" || resp.code == "301") + newloc = resp['location'] + newuri = URI.parse(newloc) + # detect and ignore incorrect redirects (to relative paths etc) + if (newuri.host != nil) + if(uri.host != newuri.host) + m.reply "#{uri.host} redirects to #{newuri.scheme}://#{newuri.host}" + raise resp['location'] + end + end + end + } + rescue TimeoutError => err + m.reply "timed out connecting to #{uri.host}:#{uri.port} :(" + return + rescue RuntimeError => err + redirect_count += 1 + hostname = err.message + retry + rescue StandardError => err + puts err + m.reply "couldn't connect to #{uri.host}:#{uri.port} :(" + return + end + end +end +plugin = WserverPlugin.new +plugin.register("wserver") |