@ -18,10 +18,11 @@ from ether2any import Ether2Any
from ether2any . helper import getDstMacFromPkt , isBroadcast , binToHexStr
class TwittStreamHandler ( tweepy . StreamListener ) :
def __init__ ( self , dev ):
def __init__ ( self , dev , debug = False ):
super ( TwittStreamHandler , self ) . __init__ ( )
self . dev = dev
self . fragments = collections . defaultdict ( str )
self . debug = debug
def on_status ( self , status ) :
""" On statis, decode and reassemble packet-status-texts. If complete, write them to the tun-dev. """
@ -31,7 +32,8 @@ class TwittStreamHandler(tweepy.StreamListener):
# 00 5c 00 XX 00 XX 00 XX 00 5c 00 XX 00 XX 00 XX 00 5c 00 XX 00 XX 00 XX
# while XX is a number from ord('0') to ord('9')
sourcePacket = UPHelper . reassembleBrokenChars ( status . text )
print " in uni: " , repr ( sourcePacket )
if self . debug :
print " in uni: " , repr ( sourcePacket )
( isFragment , packetLen , packetId , packet ) = None , None , None , None
try :
( isFragment , packetLen , packetId , packet ) = UPHelper . decode ( sourcePacket )
@ -51,7 +53,8 @@ class TwittStreamHandler(tweepy.StreamListener):
else :
toSend = packet
print " >> Received packet with id " , packetId
print repr ( toSend )
if self . debug :
print repr ( toSend )
self . dev . write ( toSend )
def on_limit ( self , track ) :
@ -66,15 +69,18 @@ class TwittStreamHandler(tweepy.StreamListener):
sys . exit ( 2 )
else :
print " At the moment there is no error-handling for this, so we just kill everything. Remember: This software doesn ' t even deserve the label ' alpha ' ;) "
#sys.exit(1 )
sys . exit ( 1 )
def on_timeout ( self , status_code ) :
print " Got an timeout: " , status_code
print " At the moment there is no error-handling for this, so we just kill everything. Remember: This software doesn ' t even deserve the label ' alpha ' ;) "
sys . exit ( 1 )
# TODO: Thread is not needed, tweepy has its own threading. remove it
class DownstreamThread ( threading . Thread ) :
def __init__ ( self , dev , auth , endpoint ):
def __init__ ( self , dev , auth , endpoint , debug = False ):
threading . Thread . __init__ ( self )
self . debug = debug
self . auth = auth
self . api = tweepy . API ( self . auth )
self . endpoint = endpoint
@ -82,17 +88,16 @@ class DownstreamThread(threading.Thread):
self . daemon = True
def run ( self ) :
stream = tweepy . Stream ( auth = self . auth , listener = TwittStreamHandler ( self . dev ))
stream = tweepy . Stream ( auth = self . auth , listener = TwittStreamHandler ( self . dev , self . debug ))
user = self . api . get_user ( self . endpoint )
print " Endpoint is " , self . endpoint , " with id " , user . id
stream . filter ( [ user . id ] )
#stream.userstream()
#stream.sample()
class RFC1149 ( Ether2Any ) :
def __init__ ( self ):
def __init__ ( self , debug = False ):
Ether2Any . __init__ ( self , tap = False )
self . debug = debug
network = Conf . get ( " network " , { ' mtu ' : 1400 } )
self . twitterConf = Conf . get ( " twitter " , None )
self . endpoint = self . twitterConf [ ' endpoint ' ]
@ -103,7 +108,7 @@ class RFC1149(Ether2Any):
self . dev . up ( )
self . _setupTwitter ( )
self . downstream = DownstreamThread ( dev = self . dev , auth = self . auth , endpoint = self . endpoint )
self . downstream = DownstreamThread ( dev = self . dev , auth = self . auth , endpoint = self . endpoint , debug = self . debug )
self . downstream . start ( )
def _requestTwitterTokens ( self ) :
@ -150,12 +155,29 @@ if not Conf['twitter']['ACCESS_KEY']:
def sendToNet ( self , packet ) :
fragments = UPHelper . encode ( packet )
print " out raw: " , repr ( packet )
print " out frag: " , repr ( fragments [ 0 ] )
if self . debug :
print " out raw: " , repr ( packet )
print " out frag: " , repr ( fragments )
print " >> Sending out %d bytes in %d tweet %s " % ( len ( packet ) , len ( fragments ) , len ( fragments ) != 1 and " s " or " " )
for fragment in fragments :
# FIXME: catch tweepy.error.TweepError
self . api . update_status ( fragment )
try :
self . api . update_status ( fragment )
except tweepy . error . TweepError , e :
# TODO: Proper handling of
# - over 140 chars limit (bug in this software)
# - connection refused (retransmit)
# - limit reached (terminate or wait)
print " >! ERROR - Either connection refused or limited. Not sent. "
print " >! ERROR - Either connection refused or limited. Not sent. "
print " >! ERROR - Either connection refused or limited. Not sent. "
print " >! ERROR - Either connection refused or limited. Not sent. "
print " YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY "
print repr ( fragment )
print " YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY "
print e
print " >! ERROR - Either connection refused or limited. Not sent. "
print " >! ERROR - Either connection refused or limited. Not sent. "
print " >! ERROR - Either connection refused or limited. Not sent. "
if __name__ == ' __main__ ' :
rfc = RFC1149 ( )