| #!/bin/sh |
| |
| # Copyright (c) 2013 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. |
| |
| # Set the PPP username and password to be used when making connections on |
| # a cellular service. |
| |
| PROGRAM=$(basename $0) |
| FLAGS_HELP="Usage: |
| |
| Show current PPP username |
| ${PROGRAM} |
| |
| Set PPP username and/or password |
| ${PROGRAM} [-u <username>] [-p <password>] |
| |
| Clear PPP username and password |
| ${PROGRAM} -c |
| " |
| |
| . /usr/share/misc/shflags |
| |
| DEFAULT_PROFILE_NAME=default |
| FLIMFLAM=org.chromium.flimflam |
| IMANAGER=${FLIMFLAM}.Manager |
| IPROFILE=${FLIMFLAM}.Profile |
| ISERVICE=${FLIMFLAM}.Service |
| PASSWORD_PROPERTY=Cellular.PPP.Password |
| PROFILE_PROPERTY=Profile |
| USERNAME_PROPERTY=Cellular.PPP.Username |
| |
| usage() { |
| echo "$*" |
| echo |
| flags_help |
| exit 1 |
| } |
| |
| dbus() { |
| local object="$1" |
| local method="$2" |
| shift 2 |
| |
| dbus-send --system --print-reply --fixed --dest="${FLIMFLAM}" \ |
| "${object}" "${method}" "$@" |
| } |
| |
| get_property() { |
| local interface="${1:?internal error}" |
| local object="${2:?internal error}" |
| local property="${3:?nternal error}" |
| |
| dbus "${object}" "${interface}.GetProperties" 2>/dev/null \ |
| | sed -n "/\/${property}/{s/.* //p}" |
| } |
| |
| display_username() { |
| local service="$1" |
| local username="$(get_property ${ISERVICE} ${service} ${USERNAME_PROPERTY})" |
| |
| if [ -n "${username}" ]; then |
| echo "PPP username: " ${username} |
| exit 0 |
| fi |
| |
| echo "No PPP username." |
| exit 0 |
| } |
| |
| set_username() { |
| local service="$1" |
| local username="$2" |
| |
| echo "Setting PPP username \"${username}\" for service ${service}" |
| dbus "${service}" "${ISERVICE}.SetProperty" \ |
| "string:${USERNAME_PROPERTY}" "variant:string:${username}" |
| } |
| |
| set_password() { |
| local service="$1" |
| local password="$2" |
| |
| echo "Setting PPP pasword for service ${service}" |
| dbus "${service}" "${ISERVICE}.SetProperty" \ |
| "string:${PASSWORD_PROPERTY}" "variant:string:${password}" |
| } |
| |
| clear_property() { |
| local service="$1" |
| local property="$2" |
| |
| echo "Clearing ${property} for service ${service}" |
| dbus "${service}" "${ISERVICE}.ClearProperty" "string:${property}" |
| } |
| |
| get_profiles() { |
| dbus / "${IMANAGER}.GetProperties" 2>/dev/null \ |
| | sed -n "/\/Profiles\//{s/.* //p}" |
| } |
| |
| get_services() { |
| dbus / "${IMANAGER}.GetProperties" 2>/dev/null \ |
| | sed -n "/\/Services\//{s/.* //p}" |
| } |
| |
| get_default_profile() { |
| local profile |
| local profile_name |
| |
| for profile in $(get_profiles); do |
| profile_name="$(get_property ${IPROFILE} ${profile} Name)" |
| if [ ${profile_name} = ${DEFAULT_PROFILE_NAME} ]; then |
| echo "${profile}" |
| break |
| fi |
| done |
| } |
| |
| get_first_cellular_service() { |
| local service |
| local service_type |
| |
| for service in $(get_services); do |
| service_type="$(get_property ${ISERVICE} ${service} Type)" |
| if [ "${service_type}" = "cellular" ]; then |
| echo "${service}" |
| break |
| fi |
| done |
| } |
| |
| move_service_to_profile() { |
| local service="$1" |
| local profile="$2" |
| |
| if [ -z "${service}" ]; then |
| return 1 |
| fi |
| |
| if [ -z "${profile}" ]; then |
| return 1 |
| fi |
| |
| dbus "${service}" "${ISERVICE}.SetProperty" \ |
| "string:${PROFILE_PROPERTY}" "variant:string:${profile}" |
| |
| local new_profile=$( |
| get_property "${ISERVICE}" "${service}" "${PROFILE_PROPERTY}") |
| if [ "${new_profile}" != "${profile}" ]; then |
| return 1 |
| else |
| return 0 |
| fi |
| } |
| |
| service="$(get_first_cellular_service)" |
| if [ -z "${service}" ]; then |
| echo "No cellular service exists." |
| exit 1 |
| fi |
| |
| if [ $# -lt 1 ]; then |
| display_username "${service}" |
| fi |
| |
| DEFINE_string 'username' "" 'PPP username for the Service' 'u' |
| DEFINE_string 'password' "" 'PPP password for the Service' 'p' |
| DEFINE_boolean 'clear' false \ |
| 'clear any username and password that has been previously set' 'c' |
| FLAGS "$@" || exit 1 |
| eval set -- "${FLAGS_ARGV}" |
| |
| if [ "${FLAGS_clear}" -ne 0 ]; then |
| if [ $# -ne 0 ]; then |
| usage "Too many arguments." |
| fi |
| if [ -n "${FLAGS_username}" ]; then |
| set_username "${service}" "${FLAGS_username}" |
| fi |
| if [ -n "${FLAGS_password}" ]; then |
| set_password "${service}" "${FLAGS_password}" |
| fi |
| echo # newline to separate from set_username/set_password output |
| if move_service_to_profile "${service}" "$(get_default_profile)"; then |
| cat <<-END |
| When your cellular dongle is connected to the system, its connection |
| will be available to any user of this Chromebook, including guest users. |
| |
| If you want to leave the dongle connected, without sharing its |
| connection with other users, you will need to clear the PPP username |
| and password by running the following command: |
| ${PROGRAM} -c |
| |
| If you clear the PPP username and password, you will need to re-run |
| ${PROGRAM} the next time you need to connect. |
| END |
| else |
| cat <<-END |
| Your cellular connection could not be configured for sharing with |
| other users of this Chromebook. If you would like to share this |
| connection with them, please try running this command again. |
| END |
| fi |
| else |
| if [ $# -ne 0 ]; then |
| usage "Too many arguments." |
| fi |
| clear_property "${service}" "${USERNAME_PROPERTY}" |
| clear_property "${service}" "${PASSWORD_PROPERTY}" |
| fi |