#!/bin/dash

# Copyright (c) 2012 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.

. /usr/lib/connectivity-common.sh

OCF=org.chromium.flimflam
MASKED_PROPERTIES="
  Address
  Cellular.ESN
  Cellular.ICCID
  Cellular.IMEI
  Cellular.IMSI
  Cellular.MDN
  Cellular.MEID
  Cellular.MIN
  Cellular.UsageUrl
  EAP.AnonymousIdentity
  EAP.CACertID
  EAP.CACertNSS
  EAP.CertID
  EAP.EAP
  EAP.Identity
  EAP.InnerEAP
  EAP.KeyID
  EAP.PIN
  EAP.PrivateKey
  EAP.SubjectMatch
  WiFi.BSSID
  WiFi.HexSSID
  WiFi.SSID
"
MASKED_PROPERTIES_PATTERN=$(echo ${MASKED_PROPERTIES} | sed 's/ /|/g')

mask_properties() {
  sed -E "s/\<(${MASKED_PROPERTIES_PATTERN}): (.+)/\1: *** MASKED ***/i"
}

# Returns a list of flimflam objects of the specified kind.
get_flimflam_objects() {
  # NB: add s to pluralize kind
  local kind="${1}s"
  local filter="$2"

  dbus_call "${OCF}" / "${OCF}.Manager.GetProperties" \
    | extract_dbus_match "${kind}" \
    | grep "${filter}"
}

print_properties() {
  local kind="$1"
  local object="$2"

  dbus_call "${OCF}" "${object}" "${OCF}.${kind}.GetProperties" | stripindexes
}

normalize_kind() {
  local kind="${1%s}"  # Remove trailing s

  case "${kind}" in
    [Ss]ervice)
      echo -n Service
      ;;
    [Dd]evice)
      echo -n Device
      ;;
    *)
      error_exit "Did not understand connection manager entity ${kind}."
      ;;
  esac
}

show() {
  $(needarg raw_kind)
  $(arg_or_default filter .)

  local kind=$(normalize_kind "${raw_kind}")
  local objects="$(get_flimflam_objects ${kind} ${filter})"

  for object in ${objects}; do
    echo "${object}"
    print_properties "${kind}" "${object}"
    echo
  done
}

usage() {
  cat <<EOF
Usage: $0 <command> [args...]
  show {Devices|Services} [-filter regex]
        Show these objects and their properties: If a filter is supplied,
        use it to filter object names.
EOF
  exit
}

$(needarg cmd)
case "$cmd" in
  show)
    show "$@"
    ;;
  show-feedback)
    show "$@" | mask_properties
    ;;
  *)
    usage
    ;;
esac
