#!/usr/bin/env python
import optparse
from circuits.lib.io import Stdin
from circuits.lib.sockets import TCPClient
from circuits import __version__ as systemVersion
from circuits.core import listener, Event, Component, Manager
USAGE = "%prog [options] host [port]"
VERSION = "%prog v" + systemVersion
###
### Functions
###
def parse_options():
"""parse_options() -> opts, args
Parse any command-line options given returning both
the parsed options and arguments.
"""
parser = optparse.OptionParser(usage=USAGE, version=VERSION)
parser.add_option("-s", "--ssl",
action="store_true", default=False, dest="ssl",
help="Enable Secure Socket Layer (SSL)")
opts, args = parser.parse_args()
if len(args) < 1:
parser.print_help()
raise SystemExit, 1
return opts, args
###
### Components
###
class Telnet(TCPClient):
@listener("connect")
def onCONNECT(self, host, port):
print "Connected to %s" % host
@listener("disconnect")
def onDISCONNECT(self):
print "Connection closed"
@listener("read")
def onREAD(self, data):
print data.strip()
@listener("stdin:read")
def onINPUT(self, data):
self.write(data)
class Stats(Component):
def __init__(self, *args, **kwargs):
super(Stats, self).__init__(*args, **kwargs)
self.bytes = {"in": 0, "out": 0}
@listener("read")
def onREAD(self, data):
self.bytes["in"] += len(data)
@listener("send")
def onSEND(self, data):
self.bytes["out"] += len(data)
###
### Main
###
def main():
opts, args = parse_options()
host = args[0]
if len(args) > 1:
port = int(args[1])
else:
port = 23
manager = Manager()
telnet = Telnet()
stdin = Stdin()
stats = Stats()
manager += stdin
manager += telnet
manager += stats
print "Trying %s..." % host
telnet.open(host, port, ssl=opts.ssl)
while telnet.connected:
try:
manager.flush()
stdin.poll()
telnet.poll()
except KeyboardInterrupt:
break
telnet.close()
manager.flush()
print "Traffic"
print " In: %d bytes" % stats.bytes["in"]
print " Out: %d bytes" % stats.bytes["out"]
###
### Entry Point
###
if __name__ == "__main__":
main()