#!/usr/bin/env python import fcntl import optparse import os import select import socket import ssl import sys import tty def parseservervalue(serverstring): if serverstring.find(']:') != -1: server, port = serverstring[1:].split(']:') elif serverstring[0] == '[': server = serverstring[1:-1] port = 4001 elif -1 != opts.server.find(':'): server, port = opts.server.split(":") else: server = serverstring port = 4001 return (server, port) def connect_tls_server(serverstring): host, port = parseservervalue(serverstring) for res in socket.getaddrinfo(host, port, socket.AF_UNSPEC, socket.SOCK_STREAM): af, socktype, proto, cononname, sa = res try: server = socket.socket(af, socktype, proto) except: server = None continue try: server.settimeout(5) server.connect(sa) except: server.close() server = None continue break if server is None: sys.stderr.write("Failed to connect to %s\n" % serverstring) sys.exit(1) secserver = ssl.wrap_socket(server) return secserver parser = optparse.OptionParser() parser.add_option("-s", "--server", dest="server", help="TLS server to connect to", metavar="SERVER:PORT") parser.add_option("-u", "--unixsocket", dest="unixsock", help="TLS server to connect to", metavar="UNIXDOMAINSOCKET") opts, args = parser.parse_args() server = None if opts.server: # going over a TLS network server = connect_tls_server(opts.server) #Next stop, reading and writing from whichever of stdin and server goes first. #see pyghmi code for solconnect.py tty.setraw(sys.stdin.fileno()) fcntl.fcntl(sys.stdin.fileno(), fcntl.F_SETFL, os.O_NONBLOCK) while (1): rdylist, _, _ = select.select((sys.stdin, server), (), (), 60) for fh in rdylist: if fh == server: #fh.read() data = fh.recv(16384) if data: sys.stdout.write(data) sys.stdout.flush() else: print "whoops" else: server.sendall(fh.read()) server.shutdown(socket.SHUT_RDWR) server.close()