blob: e9bc6433363d97d617112c8016101a542e1e6761 [file] [log] [blame]
#!/bin/sh
#
# Copyright (C) 2012 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Set the APN to be used when making connections on a cellular service.
PROGRAM=$(basename $0)
FLAGS_HELP="Usage:
${PROGRAM}
${PROGRAM} [-n <network_id>] [-u <username] [-p <password] <apn>
${PROGRAM} -c
Set the APN to use when connecting to the network specified by <network-id>.
If <network-id> is not specified, use the network-id of the currently
registered network.
The -c option clears the APN to be used, so that the default APN will be used
instead.
"
. /usr/share/misc/shflags
FLIMFLAM=org.chromium.flimflam
IMANAGER=${FLIMFLAM}.Manager
ISERVICE=${FLIMFLAM}.Service
APN_PROPERTY=Cellular.APN
LAST_GOOD_APN_PROPERTY=Cellular.LastGoodAPN
SET_APN_HELPER=$(ls /usr/lib*/shill/shims/set-apn-helper | head -1)
if [ -z "$SET_APN_HELPER" ] ; then
echo "set-apn-helper script was not found!"
exit 1
fi
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_apn_info() {
local service="$1"
local property="$2"
dbus "${service}" "${ISERVICE}.GetProperties" 2>/dev/null \
| sed -n "/${property}/s/.*\///p"
}
display_apn() {
local service="$1"
local apn="$(get_apn_info ${service} ${LAST_GOOD_APN_PROPERTY})"
if [ -n "${apn}" ]; then
echo "Last good APN: " ${apn}
exit 0
fi
apn="$(get_apn_info ${service} ${APN_PROPERTY})"
if [ -n "${apn}" ]; then
echo "User specified APN: " ${apn}
exit 0
fi
echo "No APN."
exit 0
}
set_apn() {
local service="$1"
local apn="$2"
local network_id="$3"
local username="$4"
local password="$5"
local args="apn,${apn},network_id,${network_id}"
if [ -n "${username}" ]; then
args="${args},username,${username}"
fi
if [ -n "${password}" ]; then
args="${args},password,${password}"
fi
echo "Setting APN \"${apn}\" for network ID ${network_id} for service ${service}"
${SET_APN_HELPER} "${service}" "${APN_PROPERTY}" "${args}"
}
clear_apn() {
local service="$1"
echo "Clearing APN for service ${service}"
dbus "${service}" "${ISERVICE}.ClearProperty" "string:${APN_PROPERTY}"
}
get_services() {
dbus / "${IMANAGER}.GetProperties" 2>/dev/null \
| sed -n "/\/Services\//{s/.* //p}"
}
get_service_property() {
local service="$1"
local property="$2"
dbus "${service}" "${ISERVICE}.GetProperties" 2>/dev/null \
| sed -n "/\/${property}/{s/.* //p}"
}
get_first_cellular_service() {
local service
local service_type
for service in $(get_services); do
service_type="$(get_service_property ${service} Type)"
if [ "${service_type}" = "cellular" ]; then
echo "${service}"
break
fi
done
}
get_cellular_service_network_id() {
local service="$1"
get_service_property "${service}" "Cellular.ServingOperator\/[0-9]\/code"
}
DEFINE_string 'network_id' "" 'network ID (MCCMNC) of the operator with which the APN should be used' 'n'
DEFINE_string 'username' "" 'username to be used with the APN' 'u'
DEFINE_string 'password' "" 'password to be used with the APN' 'p'
DEFINE_boolean 'clear' false 'clear any APN that has been previously set' 'c'
FLAGS "$@" || exit 1
eval set -- "${FLAGS_ARGV}"
service="$(get_first_cellular_service)"
if [ -z "${service}" ]; then
echo "No cellular service exists."
exit 1
fi
if [ $# -lt 1 ]; then
display_apn "${service}"
fi
network_id="${FLAGS_network_id}"
if [ -z "${FLAGS_network_id}" ]; then
network_id="$(get_cellular_service_network_id ${service})"
if [ -z "${network_id}" ]; then
echo "Cannot determine network ID. Use the -n flag to specify it."
exit 1
fi
fi
if [ "${FLAGS_clear}" -ne 0 ]; then
if [ $# -lt 1 ]; then
usage "The APN must be specified."
elif [ $# -gt 1 ]; then
usage "Too many arguments."
fi
set_apn "${service}" "$1" "${network_id}" "${FLAGS_username}" "${FLAGS_password}"
else
if [ $# -ne 0 ]; then
usage "Too many arguments."
fi
clear_apn "${service}"
fi