#!/usr/bin/ruby

# SSTP Sender
# usage: sample
# echo "host1.ne.jp host2.com\n" "hello!\\e" | sstp.rb

require 'socket'
require 'timeout'
require 'thread'
require 'kconv'

def sstpconnect(host)
  port1 = 9801
  port2 = 11000
  socket = nil
  
  p1 = Thread.start do
    begin
      s1 = TCPsocket.open(host,port1)
      socket = s1
    rescue
    end
  end
  p2 = Thread.start do
    begin
      s2 = TCPsocket.open(host,port2)
      socket = s2
    rescue
    end
  end

  loop do
    break if socket
    raise "connect failed" unless (p1.alive? || p2.alive?)
    sleep 0.1
  end
  p1.kill if p1.alive?
  p2.kill if p2.alive?
  socket
end  

def sendsstp(script,host)
  sender = 'sstpSender'

  script.gsub!(/\n/,'')
  sakura = nil
  result = nil

  begin
    timeout(5) do
      sakura = sstpconnect(host)
    end
    timeout(3) do
      sakura.print("SEND SSTP/1.0\r\n")
      sakura.print("Sender: #{sender}\r\n")
      sakura.print("Script: #{script}\e\r\n")
      sakura.print("\r\n")
      result = sakura.gets
      sakura.close
    end
    return result.gsub(/\r\n/,'')
  rescue
    return "Cannot Connect"
  end
end

def sstpretry(script,host)
  num = 5
  result = nil

  num.times do
    result = sendsstp(script,host)
    break if(result.split[1] == '200')
    sleep 2
  end
  result
end

def sstpmulti(script,hosts)
  jobs = []
  out = ""

  while host = hosts.shift
    lock = true
    x = Thread.start do
      hostx = host
      lock = false
      result = sstpretry(script,hostx)
      out += "host=#{hostx} :result=#{result}\n"
    end
    jobs.unshift(x)
    Thread.pass while lock
  end
  while job = jobs.shift
    job.join
  end
  return out
end

# main
hosts = gets.split
script = Kconv.tosjis(gets)
results = sstpmulti(script,hosts)
puts "script=" + script
puts results + "\n"
