#!/usr/bin/ruby -w require 'yaml' require 'cgi' configuration_file = ENV['HOME'] + "/.bluesocket" begin login = YAML.load( open( configuration_file, "r" ) ) unless login.has_key? 'username' message = "Your username isn't specified in #{configuration_file}\n" message += "One of the lines should be 'username: sXXXXXXX'" end unless login.has_key? 'username' message = "Your password isn't specified in #{configuration_file}\n" message += "One of the lines should be 'password: blahblahblah'" raise message end unless login.has_key? 'url' message = "The base bluesocket URL isn't specified in " message += configuration_file + "\n" message += "One of the lines should be (e.g.): " message += "'url: https://wlangate.net.ed.ac.uk/'" raise message end rescue puts"There was an error when trying to load the configuration file:" puts $! exit( -1 ) end login_url = login['url'] + "/login.pl" logout_popup_url = login['url'] + "/login.pl?action=logoutPopup" def usage puts "Usage: bluesocket [ --logout ]" end if (ARGV.length == 1) && (ARGV[0] == "--logout") logout = true elsif ARGV.empty? logout = false else usage exit( -1 ) end # To see whether the command actually succeeded or not, use $?.success? def get_web_page( url, username = nil, password = nil ) result = Array.new Kernel.open( "|-", "r" ) do |f| if f f.each_line { |line| result.push line } else begin exec( "curl", "-s", "-k", "-L", "-o", "-", url ) rescue raise "Failed to invoke 'curl'" end end end result end if logout lines_in_logout_page = get_web_page( logout_popup_url ) lines_in_logout_page.each do |line| if line =~ /\'(login.pl\?action=logout[^\']+)\'/ # Then we found the logout URL, so use that. get_web_page( login['url'] + $1 ) exit( 0 ) end end # If we didn't find that line, then we're already logged out. else lines_in_login_page = get_web_page( login_url ) parameters = { '_FORM_SUBMIT' => '1', 'which_form' => 'reg', 'destination' => '', 'error' => '' } # We need to add to those: # source => IP address # bs_name => bluesocket username # bs_password => bluesocket password source_ip = nil lines_in_login_page.each do |line| if line =~ /\"source\" value=\"([0-9\.]+)\"/ source_ip = $1 end end if source_ip # Otherwise we're probably logged in already... parameters['source'] = source_ip parameters['bs_name'] = login['username'] parameters['bs_password'] = login['password'] command = [ "curl", "-s", "-k", "-o", "/dev/null" ] parameters.each_pair do |key,value| command.concat [ "-d", key + "=" + CGI.escape(value) ] end command.push login['url'] + "login.pl" system( *command ) end end