# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, # 2001, 2002, 2003 Free Software Foundation, Inc. # # This file is part of DejaGnu. # # DejaGnu is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # DejaGnu is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with DejaGnu; if not, write to the Free Software Foundation, # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # Connect using telnet. This takes two arguments. The first one is the # hostname, and the second is the optional port number. This sets # the fileid field in the config array, and returns -1 for error, or the # spawn id. # proc telnet_open { hostname args } { global verbose global connectmode global spawn_id global timeout global board_info set raw 0 if { [llength $args] > 0 } { if { [lindex $args 0] == "raw" } { set raw 1 } } set port 23 if [board_info $hostname exists name] { set connhost [board_info $hostname name] } else { set connhost $hostname } if [board_info $connhost exists hostname] { set hostname [board_info $connhost hostname] } if [file exists /usr/kerberos/bin/telnet] { set telnet /usr/kerberos/bin/telnet } else { set telnet telnet } # Instead of unsetting it, let's return it. One connection at a # time, please. if [board_info $connhost exists fileid] { return [board_info $connhost fileid] } # get the hostname and port number from the config array if [board_info $connhost exists netport] { set type $hostname set hosttmp [split [board_info $connhost netport] ":"] set hostname [lindex $hosttmp 0] if { [llength $hosttmp] > 1 } { set port [lindex $hosttmp 1] } unset hosttmp } else { set type target } if [board_info $connhost exists shell_prompt] { set shell_prompt [board_info $connhost shell_prompt] } if ![info exists shell_prompt] { # if no prompt, then set it to something generic set shell_prompt ".*> " } set tries 0 set result -1 set need_respawn 1 verbose "Starting a telnet connection to $hostname:$port $shell_prompt" 2 while { $result < 0 && $tries <= 3 } { if { $need_respawn } { set need_respawn 0 spawn $telnet $hostname $port } expect { "Trying " { exp_continue } -re "$shell_prompt.*$" { verbose "Got prompt\n" set result 0 } -re "nt Name:|ogin:" { if [board_info $connhost exists telnet_username] { exp_send "[board_info $connhost telnet_username]\n" exp_continue } if [board_info $connhost exists username] { exp_send "[board_info $connhost username]\n" exp_continue } perror "telnet: need to login" break } "assword:" { if [board_info $connhost exists telnet_password] { exp_send "[board_info $connhost telnet_password]\n" exp_continue } if [board_info $connhost exists password] { exp_send "[board_info $connhost password]\n" exp_continue } perror "telnet: need a password" break } -re "advance.*y/n.*\\?" { exp_send "n\n" exp_continue } -re {([Aa]dvanced|[Ss]imple) or ([Ss]imple|[Aa]dvanced)} { exp_send "simple\n" exp_continue } "Connected to" { exp_continue } "unknown host" { exp_send "\003" perror "telnet: unknown host" break } "VxWorks Boot" { exp_send "@\n" sleep 20 exp_continue } -re "Escape character is.*\\.\[\r\n\]" { if { $raw || [board_info $connhost exists dont_wait_for_prompt] } { set result 0 } else { if [board_info $connhost exists send_initial_cr] { exp_send "\n" } exp_continue } } "has logged on from" { exp_continue } "You have no Kerberos tickets" { warning "telnet: no kerberos Tickets, please kinit" break } -re "Connection refused.*$" { catch "exp_send \"\003\"" foo sleep 5 warning "telnet: connection refused." } -re "Sorry, this system is engaged.*" { exp_send "\003" warning "telnet: already connected." } "Connection closed by foreign host.*$" { warning "telnet: connection closed by foreign host." break } -re "\[\r\n\]+" { exp_continue } timeout { exp_send "\n" } eof { warning "telnet: got unexpected EOF from telnet." catch close catch wait set need_respawn 1 sleep 5 } } incr tries } # we look for this here again cause it means something went wrong, and # it doesn't always show up in the expect in buffer till the server times out. if [info exists expect_out(buffer)] { if [regexp "assword:|ogin:" $expect_out(buffer)] { perror "telnet: need to supply a login and password." } } if { $result < 0 } { catch close catch wait set spawn_id -1 } if { $spawn_id >= 0 } { verbose "setting board_info($connhost,fileid) to $spawn_id" 3 set board_info($connhost,fileid) $spawn_id } return $spawn_id } # # Put the telnet connection into binary mode. # proc telnet_binary { hostname } { if [board_info $hostname exists fileid] { remote_send $hostname "" remote_expect $hostname 5 { -re "telnet> *$" {} default {} } remote_send $hostname "set binary\n" remote_expect $hostname 5 { -re "Format is .*telnet> *$" { remote_send $hostname "toggle binary\n" exp_continue } -re "Negotiating network ascii.*telnet> *$" { remote_send $hostname "toggle binary\n" exp_continue } -re "Negotiating binary.*\[\r\n\].*$" { } -re "binary.*unknown argument.*telnet> *$" { remote_send $hostname "mode character\n" } -re "Already operating in binary.*\[\r\n\].*$" { } timeout { warning "Never got binary response from telnet." } } } } proc telnet_transmit { dest file args } { return [standard_transmit $dest $file] }