#
# 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.
#

description   "Run the shill network connection manager"
author        "chromium-os-dev@chromium.org"

# shill termination may take more than 5s (the default kill timeout) in some
# cases (e.g. it needs to disconnect a cellular modem from the network). A
# longer kill timeout is used to ensure that shill terminates properly in most
# cases. Also, stop shill on "starting pre-shutdown" so its exiting blocks the
# chromeos_shutdown script from running (jobs that "stop on stopping
# boot-services" may still be running in parallel with chromeos_shutdown if
# they do not exit quickly).
start on @expected_started_services@
stop on starting pre-shutdown
kill timeout 10
respawn

# Default parameters to be overridden by upstart configuration.
env SHILL_LOG_LEVEL=0
env SHILL_LOG_SCOPES=
env SHILL_PASSIVE_MODE=
env SHILL_PREPEND_DNS_SERVERS=
env SHILL_ACCEPT_HOSTNAME_FROM=
env SHILL_MINIMUM_MTU=
env BLACKLISTED_DEVICES=
env DHCPV6_ENABLED_DEVICES=
env IGNORE_UNKNOWN_ETHERNET=

# Hook for mod_for_test_scripts/100setupTestingInterface.
env SHILL_TEST_DEVICES=""

pre-start script
  bootstat shill-start

  # Create state directory
  mkdir -p /var/run/shill

  # Create storage for the shill global profile.
  mkdir -p /var/cache/shill

  # Use flimflam's default profile if shill doesn't have one.
  if [ ! -f /var/cache/shill/default.profile -a \
         -f /var/cache/flimflam/default.profile ]; then
    mv /var/cache/flimflam/default.profile /var/cache/shill/default.profile
    chmod a+r /var/cache/shill/default.profile
  fi

  # Set up dhcpcd's /var/{lib|run} dirs to run as user 'dhcp'.
  mkdir -m 0755 -p /var/lib/dhcpcd
  mkdir -m 0755 -p /var/run/dhcpcd
  chmod -R u+rwX,g+rX,o+rX /var/lib/dhcpcd
  chown -R dhcp:dhcp /var/lib/dhcpcd
  chown -R dhcp:dhcp /var/run/dhcpcd

  # This option is no longer supported.
  rm -f /home/chronos/.disable_shill
end script

post-stop script
  bootstat shill-stop
end script

script
  DAEMONBIN="shill"
  ARGS="--log-level=${SHILL_LOG_LEVEL} --log-scopes=${SHILL_LOG_SCOPES}"
  if [ -n "${BLACKLISTED_DEVICES}" ] && [ -n "${SHILL_TEST_DEVICES}" ]; then
    ARGS="${ARGS} --device-black-list=${BLACKLISTED_DEVICES},${SHILL_TEST_DEVICES}"
  elif [ -n "${BLACKLISTED_DEVICES}" ]; then
    ARGS="${ARGS} --device-black-list=${BLACKLISTED_DEVICES}"
  elif [ -n "${SHILL_TEST_DEVICES}" ]; then
    ARGS="${ARGS} --device-black-list=${SHILL_TEST_DEVICES}"
  fi
  if [ -n "${SHILL_PASSIVE_MODE}" ]; then
    ARGS="${ARGS} --passive-mode"
  fi
  if [ -n "${SHILL_PREPEND_DNS_SERVERS}" ]; then
    ARGS="${ARGS} --prepend-dns-servers=${SHILL_PREPEND_DNS_SERVERS}"
  fi
  if [ -n "${SHILL_ACCEPT_HOSTNAME_FROM}" ]; then
    ARGS="${ARGS} --accept-hostname-from=${SHILL_ACCEPT_HOSTNAME_FROM}"
  fi
  if [ -n "${SHILL_MINIMUM_MTU}" ]; then
    ARGS="${ARGS} --minimum-mtu=${SHILL_MINIMUM_MTU}"
  fi
  if [ -n "${DHCPV6_ENABLED_DEVICES}" ]; then
    ARGS="${ARGS} --dhcpv6-enabled-devices=${DHCPV6_ENABLED_DEVICES}"
  fi
  if [ -n "${IGNORE_UNKNOWN_ETHERNET}" ]; then
    ARGS="${ARGS} --ignore-unknown-ethernet"
  fi
  ARGS="${ARGS} ${SHILL_TEST_ARGS}"

  # If OOBE has not completed (i.e. EULA not agreed to), do not run
  # portal checks.
  if [ ! -f /home/chronos/.oobe_completed ]; then
    ARGS="${ARGS} --portal-list="
  fi

  exec ${DAEMONBIN} ${ARGS}
end script
