#!/bin/dash
# 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

USAGE_packet_capture="[--device <device>] [--frequency <frequency>] \
[--ht-location <above|below>] [--vht-width <80|160>] \
[--monitor-connection-on <monitored_device>]"
HELP_packet_capture='
  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 or VHT channel width.  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.
'
cmd_packet_capture() (
  local option="dict:string:variant:"

  while [ $# -gt 0 ]; do
    # Do just enough parsing to filter/map options; we
    # depend on capture_utility to handle final validation.
    case "$1" in
    --device)
      shift; option="${option}device,string:$1," ;;
    --frequency)
      shift; option="${option}frequency,int32:$1," ;;
    --ht-location)
      shift; option="${option}ht_location,string:$1," ;;
    --vht-width)
      shift; option="${option}vht_width,string:$1," ;;
    --monitor-connection-on)
      shift; option="${option}monitor_connection_on,string:$1," ;;
    --output-file)
      help "crosh will determine the output file, please do not use $1"
      return 1 ;;
    *)
      help "unknown option: $1"
      return 1
    esac

    shift
  done

  local downloads_dir="/home/${USER}/user/Downloads"
  if ! capture_file="$(mktemp "${downloads_dir}/packet_capture_XXXXXX.pcap")"
  then
    echo "Couldn't create capture file."
    return 1
  fi
  # Remove trailing comma in the options list if it exists.
  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
)

USAGE_shell=''
HELP_shell='
  Open a command line shell.
'
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
)

USAGE_systrace='[<start | stop | status>]'
HELP_systrace='
  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.
'
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.XXXXXX")"
    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
)

USAGE_live_in_a_coal_mine=''
HELP_live_in_a_coal_mine='
  Switch to the canary channel.

  WARNING: This is bleeding edge software and is often more buggy than the dev
  channel.  Please do not use this unless you are a developer.  This is often
  updated daily and has only passed automated tests -- the QA level is low!

  This channel may not always boot reliably or have a functioning auto update
  mechanism. Do not do this unless you are prepared to recover your Chrome OS
  device, please be familiar with this article first:
  https://support.google.com/chromebook/answer/1080595
'
cmd_live_in_a_coal_mine() (
  shell_read "Are you sure you want to change to the canary channel? [y/N] "
  case "${REPLY}" in
  [yY])
    /usr/bin/update_engine_client -channel=canary-channel
    /usr/bin/update_engine_client --show_channel
    ;;
  *) echo "Fly, my pretties, fly! (not changing channels)";;
  esac
)
