| #! /bin/bash |
| # |
| # Copyright (c) 2024 Apple Inc. All rights reserved. |
| # |
| # This script is for Apple Internal use only. |
| # |
| |
| declare -r version=1.0 |
| declare -r script=${BASH_SOURCE[0]} |
| |
| #============================================================================================================================ |
| # PrintUsage |
| #============================================================================================================================ |
| |
| PrintUsage() |
| { |
| echo "" |
| echo "Attempts to disable Wi-Fi and Ethernet interfaces so that tests from mDNSResponder's presubmission test suite" |
| echo "that are sensitive to network state changes and/or network activity can run without potential disruptions." |
| echo "" |
| echo "Usage: $( basename "${script}" ) [options]" |
| echo "" |
| echo "Options:" |
| echo " -V Display version of this script and exit." |
| echo "" |
| } |
| |
| #============================================================================================================================ |
| # LogOut |
| #============================================================================================================================ |
| |
| LogOut() |
| { |
| echo "$( date '+%Y-%m-%d %H:%M:%S%z' ): $*" |
| } |
| |
| #============================================================================================================================ |
| # ErrQuit |
| #============================================================================================================================ |
| |
| ErrQuit() |
| { |
| LogOut "error: $*" |
| exit 1 |
| } |
| |
| #============================================================================================================================ |
| # main |
| #============================================================================================================================ |
| |
| main() |
| { |
| while getopts ":hV" option; do |
| case "${option}" in |
| h) |
| PrintUsage |
| exit 0 |
| ;; |
| V) |
| echo "$( basename "${script}" ) version ${version}" |
| exit 0 |
| ;; |
| :) |
| ErrQuit "option '${OPTARG}' requires an argument." |
| ;; |
| *) |
| ErrQuit "unknown option '${OPTARG}'." |
| ;; |
| esac |
| done |
| # Check if the networksetup command, which is a macOS-only command, is available. |
| if command -v networksetup &> /dev/null ; then |
| # Turn off Wi-Fi. |
| networksetup -setairportpower Wi-Fi off |
| # Attempt to disable Ethernet network services if we're running in BATS, which sets BATS=1 in the environment, |
| # and the Mac under test is connected to an NCM host, which means that the BATS test host is controlling the Mac |
| # under test via NCM as opposed to Ethernet. If the BATS test host is controlling the Mac under test via |
| # Ethernet, then disabling Ethernet would cause the BATS test host to lose control of the Mac under test. |
| local disable_ethernet=false |
| local -r ethernet_services=( 'Ethernet' 'Thunderbolt Ethernet' ) |
| if [ "${BATS}" == "1" ]; then |
| local connected_to_ncm_host=false |
| remotectl show ncm-host | grep -F -q 'State: connected' |
| if [ $? -eq 0 ]; then |
| connected_to_ncm_host=true |
| fi |
| if "${connected_to_ncm_host}"; then |
| LogOut "Connected ncm-host was detected" |
| networksetup -listallnetworkservices | grep -F -x -q -f <( printf '%s\n' "${ethernet_services[@]}" ) |
| if [ $? -eq 0 ]; then |
| LogOut "Found Ethernet network services, will attempt to disable them" |
| disable_ethernet=true |
| else |
| LogOut "No Ethernet network services were found" |
| fi |
| else |
| LogOut "No connected ncm-host was detected, will not attempt to disable any Ethernet network services" |
| fi |
| fi |
| if "${disable_ethernet}"; then |
| local -r network_location=mDNSResponderTesting |
| networksetup -listlocations | grep -F -x -q "${network_location}" |
| if [ $? -eq 0 ]; then |
| LogOut "Network location '${network_location}' already exists" |
| else |
| LogOut "Network location '${network_location}' doesn't exist, will attempt to create it" |
| networksetup -createlocation "${network_location}" populate |
| if [ $? -eq 0 ]; then |
| LogOut "Created network location '${network_location}'" |
| else |
| ErrQuit "Failed to create network location" |
| fi |
| fi |
| networksetup -switchtolocation "${network_location}" > /dev/null |
| if [ $? -eq 0 ]; then |
| LogOut "Switched to network location '${network_location}'" |
| else |
| ErrQuit "Failed to switch network location to '${network_location}'" |
| fi |
| for network_service in "${ethernet_services[@]}"; do |
| networksetup -listallnetworkservices | grep -F -x -q "${network_service}" |
| if [ $? -eq 0 ]; then |
| networksetup -setnetworkserviceenabled "${network_service}" off |
| if [ $? -eq 0 ]; then |
| LogOut "Disabled network service '${network_service}'" |
| else |
| LogOut "Failed to disable network service '${network_service}'" |
| fi |
| fi |
| done |
| fi |
| # Otherwise, check if the mobilewifitool command is available. |
| elif command -v mobilewifitool &> /dev/null; then |
| # Turn off Wi-Fi. |
| mobilewifitool -- manager power 0 |
| if [ $? -eq 0 ]; then |
| LogOut "Turned off Wi-Fi" |
| else |
| ErrQuit "Failed to turn off Wi-Fi" |
| fi |
| else |
| LogOut "Neither networksetup nor mobilewifitool were available" |
| fi |
| } |
| |
| main "$@" |