#!/bin/sh
# Copyright (c) 2009-2010 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.

# dev-mode functionality for crosh

if [ "$(basename $0)" = "crosh-dev" ]; then
  exec "$(dirname $0)/crosh" --dev
fi

DEV_HELP='
 packet_capture [ --device <device> ] [ --frequency <frequency> ]
                [ --ht-location <above|below> ]
                [ --monitor-connection-on <monitored_device> ]
  Start packet capture.  Start a device-based capture on <device>,
  or do an over-the-air capture on <frequency> with an optionally
  provided HT channel location.  An over-the-air capture can also
  be initiated using the channel parameters of a currently connected
  <monitored_device>.  Note that over-the-air captures are not available
  with all 802.11 devices.

 shell
  Open a command line shell.

 systrace [<start | stop | status>]
  Start/stop system tracing.  Turning tracing off will generate a trace
  log file in the Downloads directory with all the events collected
  since the last time tracing was enabled.  One can control the events
  collected by specifying categories after "start"; e.g. "start gfx"
  will collect only graphics-related system events.  "systrace status"
  (or just "systrace") will display the current state of tracing, including
  the set of events being traced.
'

HELP="$HELP$DEV_HELP"

cmd_packet_capture() (
  local option="dict:string:variant:"

  # NB: use printf to avoid echo interpreting -n
  while [ "$(printf '%s' "$1" | cut -c1)" = "-" ]; do
    # Do just enough parsing to filter/map options; we
    # depend on debugd and capture_utility to handle final validation
    if [ "$1" = "--device" ]; then
      shift; option="${option}device,string:$1,"
    elif [ "$1" = "--frequency" ]; then
      shift; option="${option}frequency,int32:$1,"
    elif [ "$1" = "--ht-location" ]; then
      shift; option="${option}ht_location,string:$1,"
    elif [ "$1" = "--monitor-connection-on" ]; then
      shift; option="${option}monitor_connection_on,string:$1,"
    else
      echo "Unknown option: $1"
      return 1
    fi

    shift
  done

  option=$(echo "$option" | sed 's/,$//')

  local downloads_dir="/home/${USER}/user/Downloads"
  if ! capture_file=$(mktemp ${downloads_dir}/packet_capture_XXXX.pcap); then
    echo "Couldn't create capture file."
    return 1
  fi
  debugd_poll PacketCapture "fd:1" "fd:3" "${option}" 3>"${capture_file}"
  if [ -s "${capture_file}" ]; then
    echo "Capture stored in ${capture_file}"
  else
    echo "No packets captured!"
    rm -f "${capture_file}"
  fi
)

cmd_shell() (
  # Verify we have sanity with the dev mode password db.
  local passwd="/mnt/stateful_partition/etc/devmode.passwd"
  if [ -e "${passwd}" ]; then
    local perms="$(stat -c %a "${passwd}")"
    if [ "${perms}" != "600" ]; then
      echo "WARNING: Permission on ${passwd} is not 0600."
      echo "WARNING: Please fix by running: sudo chmod 600 ${passwd}"
      echo "WARNING: You might also consider changing your password."
      sleep 3
    fi
  fi

  local shell="/bin/sh"
  if [ -x /bin/bash ]; then
    shell="/bin/bash"
  fi
  SHELL=${shell} ${shell} -l
)

cmd_systrace() (
  case x"$1" in
  xstart)
    local categories;
    shift; categories="$*"
    if [ -z "${categories}" ]; then
       categories="all"
    fi
    debugd SystraceStart "string:${categories}"
    ;;
  xstop)
    local downloads_dir="/home/${USER}/user/Downloads"
    local data_file=$(mktemp ${downloads_dir}/systrace.XXXX)
    if [ $? -ne 0 ]; then
      echo "Cannot create data file ${data_file}"
      return 1
    fi
    debugd SystraceStop "fd:1" > "${data_file}"
    echo "Trace data saved to ${data_file}"
    # add symlink to the latest capture file
    ln -sf $(basename $data_file) ${downloads_dir}/systrace.latest
    ;;
  xstatus|x)
    debugd SystraceStatus
    ;;
  esac
)
