102 lines
2.9 KiB
Python
102 lines
2.9 KiB
Python
import logging
|
|
import threading
|
|
import logging
|
|
import threading
|
|
|
|
|
|
class TelnetException(Exception):
|
|
"""
|
|
Exception in telnet connection
|
|
"""
|
|
pass
|
|
|
|
|
|
class TelnetConsole(object):
|
|
"""
|
|
interface of telnet console, see:
|
|
http://developer.android.com/tools/devices/emulator.html
|
|
"""
|
|
def __init__(self, device=None, auth_token=None):
|
|
"""
|
|
Initiate a emulator console via telnet.
|
|
On some devices, an authentication token is required to use telnet
|
|
:param device: instance of Device
|
|
:return:
|
|
"""
|
|
self.logger = logging.getLogger(self.__class__.__name__)
|
|
|
|
if device is None:
|
|
from DroidBot.platforms.android import AndroidDevice as Device
|
|
device = Device()
|
|
self.device = device
|
|
self.auth_token = auth_token
|
|
self.console = None
|
|
self.__lock__ = threading.Lock()
|
|
|
|
def connect(self):
|
|
if self.device.serial and self.device.serial.startswith("emulator-"):
|
|
host = "localhost"
|
|
port = int(self.device.serial[9:])
|
|
from telnetlib import Telnet
|
|
self.console = Telnet(host, port)
|
|
if self.auth_token is not None:
|
|
self.run_cmd("auth %s" % self.auth_token)
|
|
if self.check_connectivity():
|
|
self.logger.debug("telnet successfully initiated, the port is %d" % port)
|
|
return
|
|
raise TelnetException()
|
|
|
|
def run_cmd(self, args):
|
|
"""
|
|
run a command in emulator console
|
|
:param args: arguments to be executed in telnet console
|
|
:return:
|
|
"""
|
|
if self.console is None:
|
|
self.logger.warning("telnet is not connected!")
|
|
return None
|
|
if isinstance(args, list):
|
|
cmd_line = " ".join(args)
|
|
elif isinstance(args, str):
|
|
cmd_line = args
|
|
else:
|
|
self.logger.warning("unsupported command format:" + args)
|
|
return None
|
|
|
|
self.logger.debug('command:')
|
|
self.logger.debug(cmd_line)
|
|
|
|
cmd_line += '\n'
|
|
|
|
self.__lock__.acquire()
|
|
self.console.write(cmd_line)
|
|
r = self.console.read_until('OK', 5)
|
|
# eat the rest outputs
|
|
self.console.read_until('NEVER MATCH', 1)
|
|
self.__lock__.release()
|
|
|
|
self.logger.debug('return:')
|
|
self.logger.debug(r)
|
|
return r
|
|
|
|
def check_connectivity(self):
|
|
"""
|
|
check if console is connected
|
|
:return: True for connected
|
|
"""
|
|
if self.console is None:
|
|
return False
|
|
try:
|
|
self.run_cmd("help")
|
|
except:
|
|
return False
|
|
return True
|
|
|
|
def disconnect(self):
|
|
"""
|
|
disconnect telnet
|
|
"""
|
|
if self.console is not None:
|
|
self.console.close()
|
|
print("[CONNECTION] %s is disconnected" % self.__class__.__name__)
|