#!/bin/sh

# Copyright 2018 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# 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
