Expect-Lite Automation for the Rest of Us
Total Page:16
File Type:pdf, Size:1020Kb
expect-lite Automation for the rest of us Craig Miller Ciena [email protected] Abstract expect-lite avoids this problem in its simplicity. By us- ing simple characters such as > and <, it is near impos- Developers can always use a tool that will save money sible to have a typo, or syntax error. and keep the boss happy. Automation boosts efficiency while skipping drudgery. But how to implement au- tomation for the rest of us without slowing down the real 2 Problem work of developing software? Introducing expect-lite. Written in expect, it is designed to directly map an in- The problem is that developers need to test soft- teractive terminal session into an automation script. As ware, without having to think about an entire automa- easy as cutting and pasting text from a terminal window tion framework and yet another specialized language. into a script, and adding ’>’ and ’<’ characters to the be- expect-lite was developed out of a need to automate test- ginning of each line with advanced features to take you ing, and make it as easy as possible. further. No knowledge of expect is required! In this paper, you’ll get an introduction to expect-lite, 2.1 History including applications where complex testing environ- ments can be solved with just a few lines of expect-lite code. Although expect-lite is targeted at the software expect-lite is based on the industry standard Expect lan- verification testing environment, its use is not limited to guage, a TCL extension written by Don Libes of NIST this environment, and it has been used world-wide for (National Institute of Standards and Technology in the several years in router configuration, Macintosh applica- U.S.). It was used and improved internally from 2005 tion development, and FPGA development. expect-lite to 2007 when Freescale Semiconductor graciously al- can be found at: http://expect-lite.sf.net/ lowed it to become an open source project. In 2008, over 24,000 lines of expect-lite code were running daily as part of a nightly regression. 1 Introduction 2.2 Licensing expect-lite was born out of the need to boost efficiency and skip drudge work. While written in Expect, no knowledge of expect is required. In fact, expect-lite was Because of the open nature of the foundation software created to avoid scripting in Expect. TCL (BSD-Style License) and Expect (Public Domain), this open source project is licensed under the BSD-Style Because Expect is an interpretive language, quite of- License. Any modifications need not be re-integrated ten there are lines which are not executed, except when into the open source project. Even commercial products something goes wrong. There is a chance that a typo, can be created using this software, as long as the copy- or some other error may cause the Expect script crash, right header remains intact. printing a call trace. If that script is part of a larger framework, it is possible the overnight regression, for This seemed like the right thing to do, since the under- example, will come to a screeching halt. lying software is licensed under less restrictive terms. • 197 • 198 • expect-lite 3 Features local remote host expect-lite has been expanded over its five years of use, localhost starting with the simple send and expect constructs (’>’ and ’<’ respectively), and adding additional functional- ity, such as if statements, looping, multi-session support, and instant debugging. Figure 1: Connection to remote host (blue) and localhost The following subsections will high-light some of the (yellow) . more important features which give expect-lite the power to solve complex automation problems with min- Table 1: Special Characters imal lines of script. Char Action > send string to the remote host 3.1 Remote Login >> send string to remote host, without waiting for prompt < string/regex MUST be received from expect-lite was born into a multi-host environment, the remote host in the alloted timeout or the script will FAIL! which created an early requirement to remote login to << literal string MUST be received (sim- a host (usually a Linux machine). The remote host ilar to ’lessthan’ without regex evalu- was allocated by a sharing facility such as the commer- ation) cial package, LSF. Additionally, the remote host must -< if string/regex IS received from the be specified on the command line where the script will remote host the script will FAIL! wake up and begin executing. Three methods of remote # used to indicate comment lines, and login are supported: have no effect ; are also used to indicate comment lines, but are printed to stdout (for 1. telnet logging) ;; similar to above, but no extra new- 2. ssh with password lines are printed (useful for printing script help) 3. ssh with keys (no password) @num changes the expect timeout to num- ber of seconds $var= static variable assignment at script ssh with keys is the preferred method, since no pass- invocation +$var= dynamic variable assignment word is required, however this requires some environ- +$var increment value of $var by 1 decimal ment setup before hand. -$var decrement value of $var by 1 decimal =$var math functions, perform bitwise and Even when no remote host is required, it is best to log arithmetic operations: << >> & | ˆ * / into the localhost (shown in yellow in Figure 1) since % + - the underlying Expect has problems with synchroniza- ! indicates an embedded expect line tion (between send and expect strings) when a remote ? c-style if/then/else in the format host is not specified. Therefore it is possible to setup the ?cond?action::else_action localhost with ssh keys using the provided shell script % label - used for jumping to labels setup_local_ssh.sh. ~filename includes a expect-lite automation file, useful for creation of com- mon variable files, or ’subpro- 3.2 Special Character Sequences grams/subroutines’ 3.3 Regular Expression (RegEx) Evaluation expect-lite interprets special characters at the beginning of each line in the script as shown in Table 1. The full power of TCL/Expect RegEx is available to expect-lite. Thus permitting complex expect statements, 2010 Linux Symposium • 199 with the following limitations: 3.6 Plays well with Bash 1. Support of RegEx in standard expect (e.g. includ- Although not limited to working with bash, bash is in- ing anchors, char-classes and repeats) voked upon logging into the remote host, and therefore 2. Support of RegEx meta characters (e.g. \t \n are will be discussed more here. supported, \d is not) Since the bash shell is well documented, and supported, 3. expect-lite only evaluates lines using RegEx which it can be leveraged to assist in expect-lite’s limitations begin with ’<’ ’-<’ and ’+’ (dynamic variables) such as looping and branching. A simple bash loop in- side expect-lite can be created for example: 3.4 Static and Dynamic Variables $set=1 2 3 4 5 Variables are always prefaced with the $. Variables >for i in $set #expanded by expect-lite bound at script invocation are considered static, and >{ those which are bound during execution of the script are >echo $i #expanded by bash dynamic. Static variables are assigned with the $ as the >} first character of a line, such as: $five=5 In the above example, $set is an expect-lite variable, not a bash variable. An expect-lite variable is always de- Dynamic variables are assigned using RegEx capture clared before its use (e.g. $set = 1 2 3 4 5). If a variable and begin with +$. For example, text output from a com- cannot be dereference by expect-lite it is passed to the mand may captured into a variable, such as: shell. The loop will execute after the final "}" line is sent to the remote-host. >hostname +$host=\n([a-z]+) Using Bash to create executable expect-lite scripts, it is possible to make expect-lite scripts executable, with the If, however, the dynamic var is not successfully cap- help of a small embedded bash helper script. Insert the tured, expect-lite will print: following at the top of the expect-lite script: Assigned Var: \ #!/usr/bin/env bash somevar=__NO_STRING_CAPTURED__ # make this auto-runnable! # Little bootstrap bash script to run \ 3.5 Constants # kick start expect-lite script # Convert --parms to expect-lite \ Constants are a very powerful feature of expect-lite. # param=value format Constants permit writing a generalized script and over- PARAMS=‘echo $* | /bin/sed -r \ riding internal variables in the script with command line ’s;--([a-z]+) ([0-9a-zA-Z]+);\1=\2;g’‘ specified constants. They are are immutable, and cannot be changed. For example the constant local_eth can be echo $PARAMS defined on the command line as: expect-lite r=none c=$0 $PARAMS exit $? expect-lite remote_host=remote-host-018 \ cmd_file=basic_ping_test.elt \ The bash scriptlet does the following: local_eth=eth2 All references to $local_eth in the script will be set to • Converts command line arguments from –arg value eth2. This allows one to change the behaviour of the to arg=value format, making the script more linux- script without requiring a script change. like 200 • expect-lite • Call the expect-lite script with default arguments >ls -l /dev/linux (in this example that is r=none) and converted ar- -<No such file guments • Exit with the same exit code of the expect-lite 3.9 If Statement script (0 success, 1 failure) Conditional (if/then/else) statements are natively sup- expect-lite ignores the bash scriptlet when invoked, be- ported in expect-lite. The conditional uses a c-style syn- cause none of the lines begin with expect-lite special tax with a question mark (?) at the beginning of the line, characters.