Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env ruby
- require 'socket'
- require 'thread'
- require 'csv'
- require 'base64'
- class PreThreadedTcpServer
- def initialize port, host=nil, *args
- unless host.nil?
- @server = TCPServer.new host, port
- else
- @server = TCPServer.new port
- end
- @server_t = nil
- @clients = []
- end
- @timeout = 2
- def start
- false if not @server_t.nil?
- # Server thread. We can only run one.
- @server_t = Thread.new do
- puts "Server started."
- # Main accept loop
- loop do
- list_of = [@server]+@clients
- puts "LOOP."
- fd_list = select( list_of, nil, @clients, @timeout ) or
- next
- fd_list[2].each{ |fd|
- fd.close
- @clients.delete fd
- puts "FD[#{fd}] has disconnected."
- }
- fd_list[0].each { |fd|
- unless fd == @server then
- unless fd.eof?
- worker fd
- else
- @verbose and
- puts "server: client closed #{fd.peeraddr.join(':')}"
- @verbose and
- puts "server: client closed #{fd.peeraddr.join(':')}"
- fd.close
- end
- else
- client = fd.accept or
- raise "Error while accept()'ing client socket."
- puts "New client connection from #{fd.peeraddr.join(':')}"
- @clients << client
- pollconn = select @clients, nil, nil
- pollconn.each { |poll_fd|
- fd_list[0] << poll_fd if not fd_list[0].include? poll_fd
- }
- end
- }
- end
- end
- @server_t.run
- true
- end
- # Implemented in actual server classes
- def worker
- raise "Not Implemented in #{self.Class}"
- end
- end
- class TimeServer < PreThreadedTcpServer
- def initialize(port=10001, *args)
- super(port, *args)
- end
- def worker io
- csvdata = "group,member_id,email\n"
- csvdata << io.gets
- CSV.parse(csvdata, :return_headers => false, :headers => :first_row, :header_converters => :symbol) { |line|
- record = {}
- puts line[:member_id]
- @production[:enrollments][ :idnum => line[:member_id] ].each { |key, value|
- record[key.to_sym] = value
- }
- }
- puts "[#{Time.now}] Attaching PDF to output stream..."
- io.puts "DATA #{Base64.encode64(result[:data])}"
- io.puts "DATA OK"
- end
- end
- port = 10001
- host = '0.0.0.0'
- service = TimeServer.new port, host
- service.start
- sleep
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement