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