Skip to content

Commit

Permalink
Changed to using ssh to log os console.
Browse files Browse the repository at this point in the history
- Created ssh_pw program.
- Modified "Stop OS Console Logging" and "Start OS Console Logging" to
  work with new ssh_pw program.
- Created 2 supporting keywords:
  - "Create OS Console File Path"
  - "Create OS Console Command String"
- Removed "Stop OBMC Console Client" keyword which is no longer needed.
- Modified tox.ini to be able to find ssh_pw.

Change-Id: Ifd8fc95db16fcbcbbe0a36d7e4d09383e2d1e161
Signed-off-by: David Shaw <dlshaw@us.ibm.com>
  • Loading branch information
zmoose committed Feb 24, 2017
1 parent a71dd20 commit ba2d2c2
Show file tree
Hide file tree
Showing 3 changed files with 167 additions and 44 deletions.
71 changes: 71 additions & 0 deletions bin/ssh_pw
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
#!/usr/bin/expect --

# ssh using the parms provided by the caller. The benefit provided by this
# program is that it will enter the password for you (i.e. non-interactively).

# Description of arguments:
# Arg0: The password.
# Arg1: The ssh parm string. This is the totality of ssh parms you wish to
# specify (e.g. userid, host, etc.).


###############################################################################
# Main

# Get arguments.
set password [lindex $argv 0]
set ssh_parms [lreplace $argv 0 0]

eval spawn ssh ${ssh_parms}

set timeout 30

set max_attempts 3

set attempts 0
while { 1 } {
incr attempts 1
expect {
-re "assword:" {
send "$password\r"
break
}
-re "Are you sure you want to continue connecting" {
if { $attempts > $max_attempts } {
puts stderr "**ERROR** Exceeded $max_attempts attempts to ssh."
exit 1
}
send "yes\r"
}
timeout {
puts stderr "**ERROR** Timed out waiting for password prompt."
exit 1
}
eof {
puts stderr "**ERROR** End of data waiting for password prompt."
exit 1
}
}
}

set timeout 3
expect {
"Permission denied, please try again." {
puts ""
puts "**ERROR** Incorrect userid or password provided to this program."
exit 1
}
}

set timeout -1

# We don't ever expect to see this string. This will keep this program
# running indefinitely.
expect {
"When in the course of human events, it becomes :" {send "whatever\r"}
}

exit 0

###############################################################################

139 changes: 95 additions & 44 deletions lib/utils.robot
Original file line number Diff line number Diff line change
Expand Up @@ -330,64 +330,115 @@ Initialize DBUS cmd
${cmd}= Catenate ${cmd}${boot_property}
Set Global Variable ${dbuscmd} ${cmd}

Create OS Console File Path
[Documentation] Create OS console file path name and return it.
[Arguments] ${log_file_path}=${EMPTY}

Stop OBMC Console Client
[Documentation] Stop any running obmc_console_client
... writing to file_path.
[Arguments] ${file_path}=/tmp/obmc-console.log
# Description of arguements:
# file_path The caller's candidate value. If this value is ${EMPTY}, this
# keyword will compose a file path name. Otherwise, this
# keyword will use the caller's file_path value. In either
# case, the value will be returned.

${cmd_buf}= Catenate SEPARATOR=${SPACE}
... ps ax | grep obmc-console-client | grep ${file_path} | grep -v grep
... | awk '{print $1}'
${default_file_path}= Catenate /tmp/${OPENBMC_HOST}_os_console
${log_file_path}= Set Variable If '${log_file_path}' == '${EMPTY}'
... ${default_file_path} ${log_file_path}

${pid}=
... Execute Command ${cmd_buf}
[Return] ${log_file_path}

Run Keyword If '${pid}' != '${EMPTY}'
... Execute Command kill -s KILL ${pid}
... ELSE Log "No obmc-console-client process running"
Create OS Console Command String
[Documentation] Return a command string to start OS console logging.
# First make sure that the ssh_pw program is available.
${cmd_buf}= Catenate which ssh_pw 2>&1
Rdpissuing ${cmd_buf}
${rc} ${output}= Run And Return Rc And Output ${cmd_buf}
Rdpvars rc output
Should Be Equal ${rc} ${0} msg=${output}\n

Start SOL Console Logging
[Documentation] Start a new obmc_console_client process and direct
... output to a file.
[Arguments] ${file_path}=/tmp/obmc-console.log

Open Connection And Log In

Stop OBMC Console Client ${file_path}

Start Command
... obmc-console-client > ${file_path}
${cmd_buf}= Catenate ssh_pw ${OPENBMC_PASSWORD} -p 2200
... ${OPENBMC_USERNAME}@${OPENBMC_HOST}

[Return] ${cmd_buf}

Stop SOL Console Logging
[Documentation] Stop obmc_console_client process, if any, and
... return the console output as a string.
[Arguments] ${file_path}=/tmp/obmc-console.log ${targ_file_path}=${EMPTY}
[Documentation] Stop system console logging and return log output.
[Arguments] ${log_file_path}=${EMPTY} ${targ_file_path}=${EMPTY}

# Description of arguments:
# file_path The path on the obmc system where SOL output may be
# found.
# targ_file_path If specified, the file path to which SOL data should be
# written.
# If there are muliple system console processes, they will all be stopped.
# If there is no existing log file this keyword will return an error
# message to that effect (and write that message to targ_file_path, if
# specified).
# NOTE: This keyword will not fail if there is no running system console
# process.

Open Connection And Log In
# Description of arguments:
# log_file_path The file path that was used to call "Start SOL
# Console Logging". See that keyword (above) for details.
# targ_file_path If specified, the file path to which the source
# file path (i.e. "log_file_path") should be copied.

${log_file_path}= Create OS Console File Path ${log_file_path}
# Find the pid of the active system console logging session (if any).
${search_string}= Create OS Console Command String
${cmd_buf}= Catenate echo $(ps -ef | egrep '${search_string}'
... | egrep -v grep | cut -c10-14)
Rdpissuing ${cmd_buf}
${rc} ${os_con_pid}= Run And Return Rc And Output ${cmd_buf}
Rdpvars os_con_pid
# If rc is not zero it just means that there is no OS Console process
# running.

${cmd_buf}= Catenate kill -9 ${os_con_pid}
Run Keyword If '${os_con_pid}' != '${EMPTY}' Rdpissuing ${cmd_buf}
${rc} ${output}= Run Keyword If '${os_con_pid}' != '${EMPTY}'
... Run And Return Rc And Output ${cmd_buf}
Run Keyword If '${os_con_pid}' != '${EMPTY}' Rdpvars rc output

${cmd_buf}= Set Variable cat ${log_file_path} 2>&1
Rdpissuing ${cmd_buf}
${rc} ${output}= Run And Return Rc And Output ${cmd_buf}
Rdpvars rc

Stop OBMC Console Client ${file_path}
Run Keyword If '${targ_file_path}' != '${EMPTY}'
... Run Keyword And Ignore Error
... Copy File ${log_file_path} ${targ_file_path}

${cmd_buf}= Set Variable cat ${file_path}
[Return] ${output}

${console} ${stderr}=
... Execute Command
... if [ -f ${file_path} ] ; then cat ${file_path} ; fi
... return_stderr=True
Should Be Empty ${stderr}
Start SOL Console Logging
[Documentation] Start system console log to file.
[Arguments] ${log_file_path}=${EMPTY}

Run Keyword If '${targ_file_path}' != '${EMPTY}'
... Append To File ${targ_file_path} ${console}
# This keyword will first call "Stop SOL Console Logging". Only then will
# it start SOL console logging. The data returned by "Stop SOL Console
# Logging" will in turn be returned by this keyword.

[Return] ${console}
# Description of arguments:
# log_file_path The file path to which system console log data should be
# written. Note that this path is taken to be a location on
# the machine where this program is running rather than on
# the Open BMC system.

${log_file_path}= Create OS Console File Path ${log_file_path}

${log_output}= Stop SOL Console Logging ${log_file_path}

# Validate by making sure we can create the file. Problems creating the
# file would not be noticed by the subsequent ssh command because we fork
# the command.
Create File ${log_file_path}
${sub_cmd_buf}= Create OS Console Command String
# Routing stderr to stdout so that any startup error text will go to the
# output file.
${cmd_buf}= Catenate ${sub_cmd_buf} > ${log_file_path} 2>&1 &
Rdpissuing ${cmd_buf}
${rc} ${output}= Run And Return Rc And Output ${cmd_buf}
# Because we are forking this command, we essentially will never get a
# non-zero return code or any output.
Should Be Equal ${rc} ${0}

[Return] ${log_output}

Get Time Stamp
[Documentation] Get the current time stamp data
Expand Down Expand Up @@ -418,6 +469,7 @@ Start Journal Log
... journalctl -f > ${file_path}-${LOG_TIME}
Log Journal Log Started: ${file_path}-${LOG_TIME}


Stop Journal Log
[Documentation] Stop journalctl process if its running.
... By default return log from /tmp/journal_log else
Expand Down Expand Up @@ -554,7 +606,6 @@ Get Endpoint Paths
${resp}= Get Matches ${list} regexp=^.*[0-9a-z_].${endpoint}[0-9]*$
[Return] ${resp}


Check Zombie Process
[Documentation] Check if any defunct process exist or not on BMC
${count} ${stderr} ${rc}= Execute Command ps -o stat | grep Z | wc -l
Expand Down Expand Up @@ -635,10 +686,10 @@ Get BMC Boot Time
${btime}= Convert To Integer ${output}
[Return] ${btime}


Execute Command On BMC
[Documentation] Execute given command on BMC and return output.
[Arguments] ${command}
${stdout} ${stderr}= Execute Command ${command} return_stderr=True
Should Be Empty ${stderr}
[Return] ${stdout}

1 change: 1 addition & 0 deletions tox.ini
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ deps = -r{toxinidir}/requirements.txt
commands =
-mkdir -p {envtmpdir}
bash {toxinidir}/tools/generate_argumentfile.sh
cp bin/ssh_pw {envdir}/bin/ssh_pw


[testenv:custom]
Expand Down

0 comments on commit ba2d2c2

Please sign in to comment.