#!/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"