# Copyright (c) 2016 DENX Software Engineering GmbH # Heiko Schocher # # SPDX-License-Identifier: GPL-2.0+ # install tbot on your PC (linux only tested): ============================================ - get the source code: $ git clone https://github.com/hsdenx/tbot.git [...] $ cd into the tbot directory. - you need the for running tbot the python paramiko module, see: http://www.paramiko.org/installing.html paramiko is used for handling ssh sessions, and open filedescriptors on a ssh connection. Tbot open a ssh connection to a "lab PC" and opens on that connection 2 filehandles, one for control functions and one for the connection to the boards console. May it is worth to think about to open more filehandles and use them in tbot, but thats a point in the Todo list ... See [1] for more infos about tbot principles. - prepare a directory for storing the logfiles and pass it with the commandline option "-l" to tbot. Default is the directory "log" in the tbot root (don;t forget to create it, if you want to use it) - If your VL is not yet in tbot source, integrate it (This task has only to be done once for your VL): A VL has, as described in [2] "necessary tasks for a Lab PC" explained, 3 tasks: a) power on/off the board b) get power state of the board c) connect to the boards console As tbot sends only shell commands (also to the Lab PC) this tasks must be executable through shell commands on your Lab PC: Task a) power on/off board: default TC for this task is: https://github.com/hsdenx/tbot/blob/master/src/tc/tc_lab_denx_power.py - now copy this file to for example cp src/tc/tc_lab_denx_power.py src/tc/tc_lab_denx_power_XXX.py (replace XXX to a proper value) and adapt the "remote_power" command from the denx lab to your needs. As this TC powers on the board for all your boards in your VL, you can differ between the boards through the tbot class variable "tb.boardlabpowername" (which is in the default case the same as "tb.boardname"), but you may need to name the power target with an other name than boardname, so you can configure this case. The power state "tb.power_state" which the TC has to set is "on" for power on, or "off" for power off. If switching on the power is successful, call "tb.end_tc(True)" else "tb.end_tc(False)" - set in your board config file: self.tc_lab_denx_power_tc = 'tc_lab_denx_power_XXX.py' Task b) power on/off board: default TC for this task is: https://github.com/hsdenx/tbot/blob/master/src/tc/tc_lab_denx_get_power_state.py - now copy this file to for example (replace XXX to a proper value) cp src/tc/tc_lab_denx_get_power_state.py src/tc/tc_lab_denx_get_power_state_XXX.py and adapt the commands to your needs. If the power of the board is on, call "tb.end_tc(True)" else "tb.end_tc(False)" - set in your board config file: self.tc_lab_denx_get_power_state_tc = 'tc_lab_denx_get_power_state_XXX.py' Task c) connect to the boards console: default TC for this task is: https://github.com/hsdenx/tbot/blob/master/src/tc/tc_lab_denx_connect_to_board.py - now copy this file to for example (replace XXX to a proper value) cp src/tc/tc_lab_denx_connect_to_board.py src/tc/tc_lab_denx_connect_to_board_XXX.py and adapt the commands to your needs. If connect fails end this TC with "tb.end_tc(False)" else call "tb.end_tc(True)" If you want to use kermit for connecting to the boards console, you can use: https://github.com/hsdenx/tbot/blob/master/src/tc/tc_workfd_connect_with_kermit.py Example for such a board in the VL from denx: self.tc_lab_denx_connect_to_board_tc = 'tc_workfd_connect_with_kermit.py' https://github.com/hsdenx/tbot/blob/master/tbot_dxr2.cfg#L24 Hopefully this works for you too. - set in your board config file: self.tc_lab_denx_connect_to_board_tc = 'tc_lab_denx_connect_to_board_XXX.py' remarks while writting this: - Currently there is only the denx VL. Original idea was to include other VL through a seperate class/file in https://github.com/hsdenx/tbot/tree/master/src/lab_api but it turned out, that if we say "ssh" is the standard way to connect to a VL, we can integrate the VL specific tasks through testcases, see above, so we should do: - rename the "denx" API to a more general name. This is a point on my ToDo list ... done, renamed to 'ssh_std' - the VL specific configuration may moved from the board config files and should be collected in VL specific config files, which boards config file simple include. - prepare password.py file: This file contains all passwords tbot needs (for example for linux login on the boards) tbot searches this file in the tbot root directory. It is a simple python file, for example: # passwords for the lab if (board == 'lab'): if (user == 'hs'): password = 'passwordforuserhs' if (user == 'root'): password = 'passwordforrootuser' # passwords for the boards elif (board == 'mcx'): if (user == 'root'): password = 'passwordformcxrootfs' else: if (user == 'root'): password = '' - prepare board config file Each board which is found in the VL needs a tbot configuration file pass the config file name with the option '-c' to tbot, tbot searches in the root dir for them. board Example (dxr2 board): https://github.com/hsdenx/tbot/blob/master/tbot_dxr2.cfg Necessary variables: line 3: boardname, here it is the "etamin" board no default value, must be set. line 4: boardlabname: name used for connecting to the board may differ from tb.boardname, default tb.boardname line 5: boardlabpowername: name used for power on/off may differ from tb.boardname, default tb.boardname line 6: tftpboardname: name used for tftp subdir (from where U-Boot loads images for example). may differ from tb.boardname, default tb.boardname line 7: labprompt: linux prompt tbot sets no defaultvalue, must be set (maybe we should introduce "ttbott" as default ... line 8: debug: If True, adds debug output on the tbot shell line 9: debugstatus: enable status debug output on the shell line 10: ip: Where tbot finds the Lab PC line 11: user: As which user does tbot logs into the Lab PC line 12: accept_all: passed to paramiko, accept all connections line 13: keepalivetimout: passed to paramiko, timeout for sending keepalive message. line 14: channel_timeout: passed to paramiko line 15: loglevel: tbots loglevel for adding entries into the logfile. line 17: wdt_timeout: timeout in seconds for tbots watchdog. Watchdog gets triggered if prompt get read. line 24: tc_lab_denx_connect_to_board_tc: Which TC is used for connecting to the boards console the TC, here: https://github.com/hsdenx/tbot/blob/master/src/tc/tc_workfd_connect_with_kermit.py line 27: uboot_prompt: boards U-Boot prompt line 28: linux_prompt: boards linux prompt Now comes a list of variables TC needs, this vary from which TC you start on the board. Thats it ... you now can call tbot and hopefully, it works ;-) Find an example log [3] for calling simple U-Boot TC for setting an U-Boot Environmentvariable. If you have problems in setting tbot up, please contact me (and may give me ssh access to your Lab PC ;-) If you have running your first TC [3], you may want to write now your own TC (and hopefully share them), so continue with: u-boot:tools/tbot/README.create_a_new_testcase Heiko Schocher v2 2016.04.26 -------------- [1] tbot Dokumentation: [2] u-boot:/tools/tbot/README https://github.com/hsdenx/tbot/blob/master/README.md tbot-devel@googlegroups.com [3] Example for a first U-Boot TC which should always work: (with commandline option "-v" for verbose output): hs@localhost:tbot [event-devel] $ python2.7 src/common/tbot.py -c tbot_dxr2.cfg -t tc_ub_setenv.py -v -l log/tbot.log **** option cfg: tbot_dxr2.cfg log: log/tbot.log tc: tc_ub_setenv.py v 1 ('CUR WORK PATH: ', '/home/hs/data/Entwicklung/tbot') ('CFGFILE ', 'tbot_dxr2.cfg') ('LOGFILE ', '/home/hs/data/Entwicklung/tbot/log/tbot.log') tb_ctrl: Last login: Mon Apr 25 14:52:42 2016 from 87.97.29.27 ************************************************************* BDI2000 Assignment: (last updated: 2015-11-20 12:30 MET) bdi1 => techem bdi2 => cetec_mx25 bdi3 => lpc3250 bdi4 => - bdi5 => --Rev.B!-- bdi6 => tqm5200s bdi7 => [stefano] bdi8 => smartweb bdi9 => sigmatek-nand bdi10 => pcm052 bdi11 => socrates bdi12 => aristainetos bdi13 => imx53 bdi14 => ib8315 bdi15 => cairo bdi16 => g2c1 bdi17 => lwe090 bdi18 => symphony bdi19 => dxr2 bdi20 => ima3-mx6 bdi21 => sama5d3 bdi98 => - bdi99 => - bdi0 => - Please power off unused systems when you leave! Thanks, wd. ************************************************************* tb_ctrl: pollux:~ hs $ tb_ctrl: export PS1=ttbott ttbott tb_ctrl: stty cols 200 ttbott tb_ctrl: export TERM=vt200 ttbott tb_ctrl: echo $COLUMNS 200 ttbott tb_con: Last login: Tue Apr 26 06:28:59 2016 from 87.97.29.27 ************************************************************* BDI2000 Assignment: (last updated: 2015-11-20 12:30 MET) bdi1 => techem bdi2 => cetec_mx25 bdi3 => lpc3250 bdi4 => - bdi5 => --Rev.B!-- bdi6 => tqm5200s bdi7 => [stefano] bdi8 => smartweb bdi9 => sigmatek-nand bdi10 => pcm052 bdi11 => socrates bdi12 => aristainetos bdi13 => imx53 bdi14 => ib8315 bdi15 => cairo bdi16 => g2c1 bdi17 => lwe090 bdi18 => symphony bdi19 => dxr2 bdi20 => ima3-mx6 bdi21 => sama5d3 bdi98 => - bdi99 => - bdi0 => - Please power off unused systems when you leave! Thanks, wd. ************************************************************* tb_con: pollux:~ hs $ tb_con: export PS1=ttbot tb_con: t ttbott tb_con: stty cols 200 ttbott tb_con: export TERM=vt200 ttbott tb_con: echo $COLUMNS 200 ttbott tb_con: ssh hs@lena tb_con: hs@lena's password: tb_con: tb_con: Last login: Mon Apr 25 07:03:29 2016 from 192.168.1.1 tb_con: [hs@lena ~]$ tb_con: export PS1=ttbott ttbott tb_con: stty cols 200 ttbott tb_con: export TERM=vt200 ttbott tb_con: echo $COLUMNS 200 ttbott tb_con: kermit C-Kermit 8.0.211, 10 Apr 2004, for Linux Copyright (C) 1985, 2004, Trustees of Columbia University in the City of New York. Type ? or HELP for help. (/home/hs/) C-Kermit> tb_con: set line /dev/ttyUSB0 (/home/hs/) C-Kermit> tb_con: set speed 115200 /dev/ttyUSB0, 115200 bps (/home/hs/) C-Kermit> tb_con: set flow-control none (/home/hs/) C-Kermit> tb_con: set carrier-watch off (/home/hs/) C-Kermit> tb_con: connect Connecting to /dev/ttyUSB0, speed 115200 Escape character: Ctrl-\ (ASCII 28, FS): enabled Type the escape character followed by C to get back, or followed by ? to see other options. ---------------------------------------------------- tb_con: U-Boot# tb_con: U-Boot# U-Boot# tb_con: setenv Heiko Schocher U-Boot# tb_con: printenv Heiko Heiko=Schocher U-Boot# [('tc_workfd_ssh.py', 1, 0), ('tc_workfd_connect_with_kermit.py', 1, 0), ('tc_ub_setenv.py', 1, 0)] End of TBOT: success hs@localhost:tbot [event-devel] $