blob: c3d26fd2bd743e347f9cd73c71473d17b3cbf50a [file] [log] [blame] [edit]
#!/bin/bash
# Copyright 2019 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#### CATEGORY=Device management
### attach to a serial console
## usage: fx serial [device-path]
##
## If no device path is given, a list of options will be presented.
##
## If the selected device is not readable by the active user account, it will
## first be chmod'd to provide access to the current user.
##
## Exit the session with CTRL+o
##
## In order to have arrow keys work, execute `export TERM=xterm; /boot/bin/sh`
## on in the console.
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $?
fx-config-read
if ! which socat >/dev/null 2>&1; then
fx-error "The command \`socat\` was not found!"
if [[ "$(uname)" == "Linux" ]]; then
fx-error " maybe \`apt install socat\`"
else
fx-error " maybe \`brew install socat\`"
fi
exit 1
fi
pontis_message=""
if [[ -e "$(find_executable "pontis-pts")" ]]; then
if pontis_serials="$(fx-command-run pontis-pts)"; then
pontis_message="\nNo serial devices found on pontis"
while IFS= read -r pontis_serial; do
pontis_options+=("$pontis_serial")
done <<<"$pontis_serials"
fi
fi
DEVICE=""
OUTPUT_ARGS=()
# Separate output file from device path
while [[ $# -gt 0 ]]; do
case "$1" in
--output-file)
# The next argument is the file path
shift
OUTPUT_ARGS=("-R" "$1")
shift
;;
*)
if [[ -z "$DEVICE" ]]; then
DEVICE="$1"
fi
shift
;;
esac
done
if [[ -z "$DEVICE" ]]; then
options=($(find /dev -maxdepth 1 -name ttyUSB\* -or -name tty.SLAB_USBtoUART\* -or -name tty.usbserial\* | sort))
options+=("${pontis_options[@]}")
if [[ "${#options}" = 0 ]]; then
fx-error "No ttyUSB*, tty.SLAB_USBtoUSART* or tty.usbserial* found in /dev${pontis_message}\nPlease specify any known path exactly."
exit 1
fi
if [[ "${#options[@]}" -eq 1 ]]; then
echo >&2 "Found one device at ${options[0]}"
DEVICE="${options[0]}"
elif [[ "${#options[@]}" -gt 1 ]]; then
echo >&2 "Select a serial device from the following list:"
select device in "${options[@]}"; do
DEVICE="$device"
break
done
fi
fi
if [[ ! -e "$DEVICE" ]]; then
fx-error "$DEVICE not found"
exit 1
fi
if [[ ! -r "$DEVICE" ]]; then
if [[ "$(uname)" == "Linux" ]]; then
owninggroup=$(stat "$DEVICE" --printf="%G")
if [[ ! -r "$DEVICE" ]]; then
fx-error "$DEVICE is not readable by $USER"
fx-error " fix: sudo usermod -a -G "$owninggroup" $USER"
fx-error "You need to start a new login session for a group change to take effect"
exit 1
fi
else
fx-warn "$DEVICE is not readable by $USER"
fx-warn "Fix the permissions on $DEVICE or group membership of $USER"
fi
fi
echo >&2 "SERIAL: Connecting to $DEVICE..."
echo >&2 "SERIAL: Use CTRL-o to exit"
echo >&2 "SERIAL: Run: \`export TERM=xterm; /boot/bin/sh\` for improved key bindings"
# This is the method recommended in the socat manual to detect the presence /
# omission of this feature.
if $(socat -hh | grep ' b[1-9]' >/dev/null); then
speed="b115200"
else
speed="ospeed=115200,ispeed=115200"
fi
exec socat "${OUTPUT_ARGS[@]}" -,sane,cfmakeraw,escape=0x0f "file:${DEVICE}",sane,cfmakeraw,"${speed}",cs8,parenb=0,cstopb=0,ixoff=0,ixon=0,crtscts=0,clocal=1,nonblock=1