188 lines
4.3 KiB
Bash
Executable file
188 lines
4.3 KiB
Bash
Executable file
#!/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}
|
|
|
|
or
|
|
|
|
${PROGRAM} [-n <network_id>] [-u <username] [-p <password] <apn>
|
|
|
|
or
|
|
|
|
${PROGRAM} -c
|
|
"
|
|
|
|
. /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"
|
|
}
|
|
|
|
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
|
|
|
|
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}"
|
|
|
|
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
|