| Index: modem
|
| diff --git a/modem b/modem
|
| new file mode 100755
|
| index 0000000000000000000000000000000000000000..83e9281c5f9c3c7f0e55bd4adbef06d8695bc278
|
| --- /dev/null
|
| +++ b/modem
|
| @@ -0,0 +1,249 @@
|
| +#!/bin/sh
|
| +# Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +# This is a wrapper around a lot of different DBus calls, written in sh; this is
|
| +# meant to replace parts of flimflam-test, and also to be callable from crosh.
|
| +
|
| +. /usr/lib/mm.sh
|
| +
|
| +# Generates a small snippet of code to take a single argument out of our
|
| +# parameter list, and complain (and exit) if it's not present. Used in other
|
| +# places like: $(needarg foo), which binds foo to $1.
|
| +needarg () {
|
| + # We need to echo eval here because the part of bash that understands
|
| + # variable assignments has already run by the time we substitute in the
|
| + # text of $(needarg foo) - i.e., bash will try to execute 'foo="$1"' as
|
| + # a *command*, which it isn't. The eval forces bash to reparse the code
|
| + # before executing it.
|
| + echo eval "$1=\"\$1\";
|
| + [ -z \"\$$1\" ] && echo 'Missing arg: $1' && usage;
|
| + shift"
|
| +}
|
| +
|
| +# Generates a small snippet of code to take a matching flag argument
|
| +# and value out of our parameter list if present. If not, assign the
|
| +# default value to $1.
|
| +# Used in other places like: $(arg_or_default foo bar)
|
| +# which binds foo to "bar", unless $1 is "-foo" in which case foo is
|
| +# bound to $2.
|
| +arg_or_default () {
|
| + echo eval "[ x\"\$1\" = x\"-$1\" ] && $1=\"\$2\" && shift 2;
|
| + [ -z \"\$$1\" ] && $1=\"$2\""
|
| +}
|
| +
|
| +# Generates a small snippet of code to take a single argument out of our
|
| +# parameter list. If it's not present, prompt the user and accept a
|
| +# blank input as if the users chose the default specified as $2.
|
| +arg_or_prompt () {
|
| + echo eval "$1=\"\$1\";
|
| + [ -n \"\$$1\" ] && shift ;
|
| + [ -z \"\$$1\" ] && read -p \"$1 [$2]: \" $1 ;
|
| + [ -z \"\$$1\" ] && $1=\"$2\";"
|
| +}
|
| +
|
| +# Require a key in a csv list of key value pairs
|
| +# $1 - comma separated list of keys and values
|
| +# $2 - required key
|
| +# If the key is not found in the argument list, then prompt the user
|
| +# for a value for key, and return $key,$value appended to $1
|
| +require () {
|
| + local value
|
| + local args=$1
|
| + local key=$2
|
| + if [ -z "$args" -o -n "${args##*$2*}" ] ; then
|
| + read -p "$key: " value
|
| + if [ -n "$args" ] ; then
|
| + args="$args,"
|
| + fi
|
| + args="$args$key,$value"
|
| + fi
|
| + echo "$args"
|
| +}
|
| +
|
| +# Wait for a modem to reset itself and come back with a new dbus name
|
| +# args:
|
| +# $1 - dbus name of the modem before reset
|
| +# $2 - timeout in seconds
|
| +wait_for_modem_reset () {
|
| + local modem
|
| + local oldmodem=$1
|
| + local timeout=$2
|
| + local status="Timed out"
|
| + echo -n "Waiting..."
|
| + while test $timeout -gt 0 ; do
|
| + modem=$(modems | head -1)
|
| + if [ -n "$modem" -a "$modem" != "$oldmodem" ] ; then
|
| + status="Done"
|
| + break
|
| + fi
|
| + sleep 1
|
| + timeout=$((timeout - 1))
|
| + echo -n "."
|
| + done
|
| + echo $status
|
| +}
|
| +
|
| +# Wait for a modem to reset itself and come back with a new dbus name,
|
| +# or for the activation state to change from "1"
|
| +# MM_MODEM_ACTIVATION_STATE_ACTIVATING to something else
|
| +#
|
| +# args:
|
| +# $1 - dbus name of the modem before activation
|
| +# $2 - activation state of modem before activation call
|
| +# $3 - timeout in seconds
|
| +wait_for_activation_change () {
|
| + local modem
|
| + local oldmodem=$1
|
| + local oldstate=$2
|
| + local timeout=$3
|
| + local status="Timed out"
|
| + local activation_state
|
| + echo -n "Waiting..."
|
| + while test $timeout -gt 0 ; do
|
| + modem=$(modems | head -1)
|
| + if [ -n "$modem" -a "$modem" != "$oldmodem" ] ; then
|
| + status="Done"
|
| + break
|
| + fi
|
| + activation_state=$(modem_activation_state $modem)
|
| + if [ $activation_state != 1 ]; then
|
| + status="Done"
|
| + break
|
| + fi
|
| + sleep 1
|
| + timeout=$((timeout - 1))
|
| + echo -n "."
|
| + done
|
| + activation_state=$(modem_activation_state $modem)
|
| + if [ -z "$activation_state" -o $activation_state -le $oldstate ] ; then
|
| + status="Failed"
|
| + fi
|
| + echo $status
|
| +}
|
| +
|
| +activate_manual () {
|
| + $(arg_or_default modem $(modems | head -1))
|
| + [ -z "$modem" ] && echo "no modem found" && exit 1
|
| + args=$(echo "$@" | sed -e 's/ /,/g')
|
| + args=$(require "$args" min)
|
| + args=$(require "$args" mdn)
|
| + args=$(require "$args" spc)
|
| + args=$(require "$args" system_id)
|
| + local oldstate=$(modem_activation_state $modem)
|
| + dbus "$modem" $IMODEM_CDMA.ActivateManualDebug \
|
| + "dict:string:string:$args"
|
| + wait_for_activation_change $modem $oldstate 40
|
| +}
|
| +
|
| +activate () {
|
| + $(arg_or_default modem $(modems | head -1))
|
| + [ -z "$modem" ] && echo "no modem found" && exit 1
|
| + # Work around braindead crosh quoting semantics (i.e., there are none,
|
| + # arguments are tokenized on spaces). Sigh.
|
| + carrier=$(echo "$@")
|
| + # TODO(jglasgow): verify that we can pass an empty string
|
| + local oldstate=$(modem_activation_state $modem)
|
| + local status=$(dbus "$modem" $IMODEM_CDMA.Activate "string:$carrier")
|
| + if [ $status != 0 ] ; then
|
| + echo "Error $status while activating"
|
| + else
|
| + wait_for_activation_change $modem $oldstate 40
|
| + fi
|
| +}
|
| +
|
| +connect () {
|
| + $(arg_or_default modem $(modems | head -1))
|
| + [ -z "$modem" ] && echo "no modem found" && exit 1
|
| + # Work around braindead quoting again...
|
| + args=$(echo "$@")
|
| + [ -z "$args" ] && args='ignored'
|
| + dbus "$modem" $IMODEM.Connect "string:$args"
|
| +}
|
| +
|
| +factory_reset () {
|
| + $(arg_or_default modem $(modems | head -1))
|
| + [ -z "$modem" ] && echo "no modem found" && exit 1
|
| + $(arg_or_prompt spc 000000)
|
| + dbus "$modem" $IMODEM.FactoryReset "string:$spc"
|
| + wait_for_modem_reset $modem 40
|
| +}
|
| +
|
| +status () {
|
| + /usr/share/userfeedback/scripts/mm-status
|
| +}
|
| +
|
| +update_prl () {
|
| + local modem
|
| + local mdn
|
| + local min
|
| + $(arg_or_default modem $(modems | head -1))
|
| + [ -z "$modem" ] && echo "no modem found" && exit 1
|
| + $(needarg prlfile)
|
| + mdn=$(dbus $modem $IMODEM_SIMPLE.GetStatus | awk '/\/mdn/ {print $2}')
|
| + min=$(dbus $modem $IMODEM_SIMPLE.GetStatus | awk '/\/min/ {print $2}')
|
| + if [ -z "$mdn" -o -z "$min" ]; then
|
| + echo "Cannot update PRL: MDN/MIN are unknown"
|
| + exit 1
|
| + fi
|
| + if [ ! -r "$prlfile" ]; then
|
| + echo "Cannot read PRL file \"$prlfile\""
|
| + exit 1
|
| + fi
|
| + # Because cromo runs as a different user than this script,
|
| + # it may not have access to the specified file, even when
|
| + # the script does. A specific example is the Downloads folder,
|
| + # which only the "chronos" user has access to. To work
|
| + # around this problem, we copy the PRL file to /tmp.
|
| + if ! echo "$prlfile" | grep -q '^/tmp/'; then
|
| + prlbase=${prlfile##*/}
|
| + cp $prlfile /tmp/$prlbase
|
| + if [ $? -ne 0 ]; then
|
| + echo "Cannot copy PRL file \"$prlfile\" to temp directory"
|
| + exit 1
|
| + fi
|
| + prlfile=/tmp/$prlbase
|
| + fi
|
| + local oldstate=$(modem_activation_state $modem)
|
| + args="mdn,$mdn,min,$min,prlfile,$prlfile"
|
| + dbus "$modem" $IMODEM_CDMA.ActivateManualDebug \
|
| + "dict:string:string:$args"
|
| + wait_for_modem_reset $modem 40
|
| +}
|
| +
|
| +usage () {
|
| + echo "Usage: $0 <command> [args...]"
|
| + echo " activate [-modem <modem>] [<carrier>] Activate modem"
|
| + echo " activate-manual [-modem <modem>] [args...] Activate modem manually"
|
| + echo " connect [-modem <modem>] [phone number] Connect modem"
|
| + echo " factory-reset [-modem <modem>] [<spc>] Factory-reset the modem"
|
| + echo " status Display modem status"
|
| + echo " update-prl [-modem <modem>] <prl-file-name> Install a PRL file"
|
| + exit 0
|
| +}
|
| +
|
| +$(needarg cmd)
|
| +case "$cmd" in
|
| + activate)
|
| + activate "$@"
|
| + ;;
|
| + activate-manual)
|
| + activate_manual "$@"
|
| + ;;
|
| + connect)
|
| + connect "$@"
|
| + ;;
|
| + factory-reset)
|
| + factory_reset "$@"
|
| + ;;
|
| + status)
|
| + status "$@"
|
| + ;;
|
| + update-prl)
|
| + update_prl "$@"
|
| + ;;
|
| + *)
|
| + usage
|
| + ;;
|
| +esac
|
|
|