Home | History | Annotate | Download | only in bin
      1 #!/bin/sh
      2 
      3 #
      4 # Copyright (C) 2013 The Android Open Source Project
      5 #
      6 # Licensed under the Apache License, Version 2.0 (the "License");
      7 # you may not use this file except in compliance with the License.
      8 # You may obtain a copy of the License at
      9 #
     10 #      http://www.apache.org/licenses/LICENSE-2.0
     11 #
     12 # Unless required by applicable law or agreed to in writing, software
     13 # distributed under the License is distributed on an "AS IS" BASIS,
     14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     15 # See the License for the specific language governing permissions and
     16 # limitations under the License.
     17 #
     18 
     19 # Set the PPP username and password to be used when making connections on
     20 # a cellular service.
     21 
     22 PROGRAM=$(basename $0)
     23 FLAGS_HELP="Usage:
     24 
     25 Show current PPP username
     26   ${PROGRAM}
     27 
     28 Set PPP username and/or password
     29   ${PROGRAM} [-u <username>] [-p <password>]
     30 
     31 Clear PPP username and password
     32   ${PROGRAM} -c
     33 "
     34 
     35 . /usr/share/misc/shflags
     36 
     37 DEFAULT_PROFILE_NAME=default
     38 FLIMFLAM=org.chromium.flimflam
     39 IMANAGER=${FLIMFLAM}.Manager
     40 IPROFILE=${FLIMFLAM}.Profile
     41 ISERVICE=${FLIMFLAM}.Service
     42 PASSWORD_PROPERTY=Cellular.PPP.Password
     43 PROFILE_PROPERTY=Profile
     44 USERNAME_PROPERTY=Cellular.PPP.Username
     45 
     46 usage() {
     47   echo "$*"
     48   echo
     49   flags_help
     50   exit 1
     51 }
     52 
     53 dbus() {
     54   local object="$1"
     55   local method="$2"
     56   shift 2
     57 
     58   dbus-send --system --print-reply --fixed --dest="${FLIMFLAM}" \
     59     "${object}" "${method}" "$@"
     60 }
     61 
     62 get_property() {
     63   local interface="${1:?internal error}"
     64   local object="${2:?internal error}"
     65   local property="${3:?nternal error}"
     66 
     67   dbus "${object}" "${interface}.GetProperties" 2>/dev/null \
     68     | sed -n "/\/${property}/{s/.* //p}"
     69 }
     70 
     71 display_username() {
     72   local service="$1"
     73   local username="$(get_property ${ISERVICE} ${service} ${USERNAME_PROPERTY})"
     74 
     75   if [ -n "${username}" ]; then
     76     echo "PPP username: " ${username}
     77     exit 0
     78   fi
     79 
     80   echo "No PPP username."
     81   exit 0
     82 }
     83 
     84 set_username() {
     85   local service="$1"
     86   local username="$2"
     87 
     88   echo "Setting PPP username \"${username}\" for service ${service}"
     89   dbus "${service}" "${ISERVICE}.SetProperty" \
     90     "string:${USERNAME_PROPERTY}" "variant:string:${username}"
     91 }
     92 
     93 set_password() {
     94   local service="$1"
     95   local password="$2"
     96 
     97   echo "Setting PPP pasword for service ${service}"
     98   dbus "${service}" "${ISERVICE}.SetProperty" \
     99     "string:${PASSWORD_PROPERTY}" "variant:string:${password}"
    100 }
    101 
    102 clear_property() {
    103   local service="$1"
    104   local property="$2"
    105 
    106   echo "Clearing ${property} for service ${service}"
    107   dbus "${service}" "${ISERVICE}.ClearProperty" "string:${property}"
    108 }
    109 
    110 get_profiles() {
    111   dbus / "${IMANAGER}.GetProperties" 2>/dev/null \
    112     | sed -n "/\/Profiles\//{s/.* //p}"
    113 }
    114 
    115 get_services() {
    116   dbus / "${IMANAGER}.GetProperties" 2>/dev/null \
    117     | sed -n "/\/Services\//{s/.* //p}"
    118 }
    119 
    120 get_default_profile() {
    121   local profile
    122   local profile_name
    123 
    124   for profile in $(get_profiles); do
    125     profile_name="$(get_property ${IPROFILE} ${profile} Name)"
    126     if [ ${profile_name} = ${DEFAULT_PROFILE_NAME} ]; then
    127       echo "${profile}"
    128       break
    129     fi
    130   done
    131 }
    132 
    133 get_first_cellular_service() {
    134   local service
    135   local service_type
    136 
    137   for service in $(get_services); do
    138     service_type="$(get_property ${ISERVICE} ${service} Type)"
    139     if [ "${service_type}" = "cellular" ]; then
    140       echo "${service}"
    141       break
    142     fi
    143   done
    144 }
    145 
    146 move_service_to_profile() {
    147   local service="$1"
    148   local profile="$2"
    149 
    150   if [ -z "${service}" ]; then
    151     return 1
    152   fi
    153 
    154   if [ -z "${profile}" ]; then
    155     return 1
    156   fi
    157 
    158   dbus "${service}" "${ISERVICE}.SetProperty" \
    159     "string:${PROFILE_PROPERTY}" "variant:string:${profile}"
    160 
    161   local new_profile=$(
    162     get_property "${ISERVICE}" "${service}" "${PROFILE_PROPERTY}")
    163   if [ "${new_profile}" != "${profile}" ]; then
    164     return 1
    165   else
    166     return 0
    167   fi
    168 }
    169 
    170 service="$(get_first_cellular_service)"
    171 if [ -z "${service}" ]; then
    172   echo "No cellular service exists."
    173   exit 1
    174 fi
    175 
    176 if [ $# -lt 1 ]; then
    177   display_username "${service}"
    178 fi
    179 
    180 DEFINE_string 'username' "" 'PPP username for the Service' 'u'
    181 DEFINE_string 'password' "" 'PPP password for the Service' 'p'
    182 DEFINE_boolean 'clear' false \
    183   'clear any username and password that has been previously set' 'c'
    184 FLAGS "$@" || exit 1
    185 eval set -- "${FLAGS_ARGV}"
    186 
    187 if [ "${FLAGS_clear}" -ne 0 ]; then
    188   if [ $# -ne 0 ]; then
    189     usage "Too many arguments."
    190   fi
    191   if [ -n "${FLAGS_username}" ]; then
    192     set_username "${service}" "${FLAGS_username}"
    193   fi
    194   if [ -n "${FLAGS_password}" ]; then
    195     set_password "${service}" "${FLAGS_password}"
    196   fi
    197   echo  #  newline to separate from set_username/set_password output
    198   if move_service_to_profile "${service}" "$(get_default_profile)"; then
    199     cat <<-END
    200 	When your cellular dongle is connected to the system, its connection
    201 	will be available to any user of this Chromebook, including guest users.
    202 
    203 	If you want to leave the dongle connected, without sharing its
    204 	connection with other users, you will need to clear the PPP username
    205 	and password by running the following command:
    206 	        ${PROGRAM} -c
    207 
    208 	If you clear the PPP username and password, you will need to re-run
    209 	${PROGRAM} the next time you need to connect.
    210 END
    211   else
    212     cat <<-END
    213 	Your cellular connection could not be configured for sharing with
    214 	other users of this Chromebook. If you would like to share this
    215 	connection with them, please try running this command again.
    216 END
    217   fi
    218 else
    219   if [ $# -ne 0 ]; then
    220     usage "Too many arguments."
    221   fi
    222   clear_property "${service}" "${USERNAME_PROPERTY}"
    223   clear_property "${service}" "${PASSWORD_PROPERTY}"
    224 fi
    225