Home | History | Annotate | Download | only in bin
      1 #!/bin/sh
      2 
      3 #
      4 # Copyright (C) 2012 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 APN to be used when making connections on a cellular service.
     20 
     21 PROGRAM=$(basename $0)
     22 FLAGS_HELP="Usage:
     23 
     24   ${PROGRAM}
     25 
     26 or
     27 
     28   ${PROGRAM} [-n <network_id>] [-u <username] [-p <password] <apn>
     29 
     30 or
     31 
     32   ${PROGRAM} -c
     33 "
     34 
     35 . /usr/share/misc/shflags
     36 
     37 FLIMFLAM=org.chromium.flimflam
     38 IMANAGER=${FLIMFLAM}.Manager
     39 ISERVICE=${FLIMFLAM}.Service
     40 APN_PROPERTY=Cellular.APN
     41 LAST_GOOD_APN_PROPERTY=Cellular.LastGoodAPN
     42 
     43 SET_APN_HELPER=$(ls /usr/lib*/shill/shims/set-apn-helper | head -1)
     44 if [ -z "$SET_APN_HELPER" ] ; then
     45   echo "set-apn-helper script was not found!"
     46   exit 1
     47 fi
     48 
     49 usage() {
     50   echo "$*"
     51   echo
     52   flags_help
     53   exit 1
     54 }
     55 
     56 dbus() {
     57   local object="$1"
     58   local method="$2"
     59   shift 2
     60 
     61   dbus-send --system --print-reply --fixed --dest="${FLIMFLAM}" \
     62     "${object}" "${method}" "$@"
     63 }
     64 
     65 get_apn_info() {
     66   local service="$1"
     67   local property="$2"
     68 
     69   dbus "${service}" "${ISERVICE}.GetProperties" 2>/dev/null \
     70     | sed -n "/${property}/s/.*\///p"
     71 }
     72 
     73 display_apn() {
     74   local service="$1"
     75   local apn="$(get_apn_info ${service} ${LAST_GOOD_APN_PROPERTY})"
     76 
     77   if [ -n "${apn}" ]; then
     78     echo "Last good APN: " ${apn}
     79     exit 0
     80   fi
     81 
     82   apn="$(get_apn_info ${service} ${APN_PROPERTY})"
     83   if [ -n "${apn}" ]; then
     84     echo "User specified APN: " ${apn}
     85     exit 0
     86   fi
     87 
     88   echo "No APN."
     89   exit 0
     90 }
     91 
     92 set_apn() {
     93   local service="$1"
     94   local apn="$2"
     95   local network_id="$3"
     96   local username="$4"
     97   local password="$5"
     98   local args="apn,${apn},network_id,${network_id}"
     99 
    100   if [ -n "${username}" ]; then
    101     args="${args},username,${username}"
    102   fi
    103 
    104   if [ -n "${password}" ]; then
    105     args="${args},password,${password}"
    106   fi
    107 
    108   echo "Setting APN \"${apn}\" for network ID ${network_id} for service ${service}"
    109   ${SET_APN_HELPER} "${service}" "${APN_PROPERTY}" "${args}"
    110 }
    111 
    112 clear_apn() {
    113   local service="$1"
    114 
    115   echo "Clearing APN for service ${service}"
    116   dbus "${service}" "${ISERVICE}.ClearProperty" "string:${APN_PROPERTY}"
    117 }
    118 
    119 get_services() {
    120   dbus / "${IMANAGER}.GetProperties" 2>/dev/null \
    121     | sed -n "/\/Services\//{s/.* //p}"
    122 }
    123 
    124 get_service_property() {
    125   local service="$1"
    126   local property="$2"
    127 
    128   dbus "${service}" "${ISERVICE}.GetProperties" 2>/dev/null \
    129     | sed -n "/\/${property}/{s/.* //p}"
    130 }
    131 
    132 get_first_cellular_service() {
    133   local service
    134   local service_type
    135 
    136   for service in $(get_services); do
    137     service_type="$(get_service_property ${service} Type)"
    138     if [ "${service_type}" = "cellular" ]; then
    139       echo "${service}"
    140       break
    141     fi
    142   done
    143 }
    144 
    145 get_cellular_service_network_id() {
    146   local service="$1"
    147   get_service_property "${service}" "Cellular.ServingOperator\/[0-9]\/code"
    148 }
    149 
    150 service="$(get_first_cellular_service)"
    151 if [ -z "${service}" ]; then
    152   echo "No cellular service exists."
    153   exit 1
    154 fi
    155 
    156 if [ $# -lt 1 ]; then
    157   display_apn "${service}"
    158 fi
    159 
    160 DEFINE_string 'network_id' "" 'network ID (MCCMNC) of the operator with which the APN should be used' 'n'
    161 DEFINE_string 'username' "" 'username to be used with the APN' 'u'
    162 DEFINE_string 'password' "" 'password to be used with the APN' 'p'
    163 DEFINE_boolean 'clear' false 'clear any APN that has been previously set' 'c'
    164 FLAGS "$@" || exit 1
    165 eval set -- "${FLAGS_ARGV}"
    166 
    167 network_id="${FLAGS_network_id}"
    168 if [ -z "${FLAGS_network_id}" ]; then
    169   network_id="$(get_cellular_service_network_id ${service})"
    170   if [ -z "${network_id}" ]; then
    171     echo "Cannot determine network ID. Use the -n flag to specify it."
    172     exit 1
    173   fi
    174 fi
    175 
    176 if [ "${FLAGS_clear}" -ne 0 ]; then
    177   if [ $# -lt 1 ]; then
    178     usage "The APN must be specified."
    179   elif [ $# -gt 1 ]; then
    180     usage "Too many arguments."
    181   fi
    182   set_apn "${service}" "$1" "${network_id}" "${FLAGS_username}" "${FLAGS_password}"
    183 else
    184   if [ $# -ne 0 ]; then
    185     usage "Too many arguments."
    186   fi
    187   clear_apn "${service}"
    188 fi
    189