setAiportNetwork.sh

rob_potvin
Contributor III
Contributor III

Not working with 10.7

2 ACCEPTED SOLUTIONS

rob_potvin
Contributor III
Contributor III

How is this folks? not sure if I should be using airport of networksetup for the older versions... It works on 10.7 and 10.6 for me, needs to be tested on the other versions, so if someone could test and let us know that would be great :-).

(Sorry about posting 4 times before, something with Safari didn't work.)

#!/bin/sh
####################################################################################################
#
# Copyright (c) 2010, JAMF Software, LLC.  All rights reserved.
#
#       Redistribution and use in source and binary forms, with or without
#       modification, are permitted provided that the following conditions are met:
#               * Redistributions of source code must retain the above copyright
#                 notice, this list of conditions and the following disclaimer.
#               * Redistributions in binary form must reproduce the above copyright
#                 notice, this list of conditions and the following disclaimer in the
#                 documentation and/or other materials provided with the distribution.
#               * Neither the name of the JAMF Software, LLC nor the
#                 names of its contributors may be used to endorse or promote products
#                 derived from this software without specific prior written permission.
#
#       THIS SOFTWARE IS PROVIDED BY JAMF SOFTWARE, LLC "AS IS" AND ANY
#       EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
#       WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
#       DISCLAIMED. IN NO EVENT SHALL JAMF SOFTWARE, LLC BE LIABLE FOR ANY
#       DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
#       (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
#       LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
#       ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
#       (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
#       SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
####################################################################################################
#
# SUPPORT FOR THIS PROGRAM
#
#       This program is distributed "as is" by JAMF Software, LLC's Resource Kit team. For more
#       information or support for the Resource Kit, please utilize the following resources:
#
#               http://list.jamfsoftware.com/mailman/listinfo/resourcekit
#
#               http://www.jamfsoftware.com/support/resource-kit
#
#       Please reference our SLA for information regarding support of this application:
#
#               http://www.jamfsoftware.com/support/resource-kit-sla
#
####################################################################################################
#
# ABOUT THIS PROGRAM
#
# NAME
#   setAirPortNetwork.sh -- Disassociates from the current wireless network and sets the SSID and WEP or 
#                    WPA password on the AirPort assuming the AirPort is on
#
# SYNOPSIS
#   sudo setAirPortNetwork.sh
#   sudo setAirPortNetwork.sh <SSID> <password> 
#
# DESCRIPTION
#   This script was designed to configure the AirPort network settings, including which SSID the
#   AirPort is pointed to, as well as what password should be used to connect to the network
#   if the network is a secured wireless network.
#
####################################################################################################
#
# HISTORY
#
#   Version: 1.1
#
#   - Created by Eric Krause on March 5th, 2010
#   - Modified by Eric Krause on June 22, 2010 to fix the command for 10.5
# 
####################################################################################################
#
# DEFINE VARIABLES & READ IN PARAMETERS
#
####################################################################################################

# HARDCODED VALUES SET HERE
SSID=""                   #The SSID of the wireless network to connect to
password=""               #This only needs to be set if a password is required


# CHECK TO SEE IF A VALUE WERE PASSED IN FOR PARAMETERS $4 THROUGH $5 AND, IF SO, ASSIGN THEM
if [ "$4" != "" ] && [ "$SSID" == "" ]; then
    SSID=$4
fi

if [ "$5" != "" ] && [ "$password" == "" ]; then
    password=$5
fi


####################################################################################################
# 
# SCRIPT CONTENTS - DO NOT MODIFY BELOW THIS LINE
#
####################################################################################################

if [ "$SSID" == "" ]; then
echo “Error: The parameter ‘SSID’ is blank. Please specify a SSID.”
exit 1
fi

OS=`/usr/bin/sw_vers -productVersion | /usr/bin/colrm 5`
wifiDevice=`/usr/sbin/networksetup -listallhardwareports | awk '/^Hardware Port: Wi-Fi/,/^Ethernet Address/' | head -2 | tail -1 | cut -c 9-`

case $OS in

10.4*)
    echo "Setting airport SSID to" $SSID
    System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -z -A"$SSID" –password="$password"
    ;;
10.5*)
    echo "Setting airport SSID to" $SSID
    /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -z -A"$SSID" –password="$password"
    ;;
10.6*)
    echo "Setting airport SSID to $SSID..."
    /usr/sbin/networksetup -setairportnetwork AirPort "$SSID" "$password"
    ;;
10.7*)
    checkWireless=$(networksetup -listallhardwareports | egrep "Hardware Port: (Air|Wi-)" | cut -c 16-)
    # First we need to get the Wi-Fi device's name
    echo "Setting airport SSID to" $SSID
    /usr/sbin/networksetup -setairportnetwork "$wifiDevice" "$SSID" "$password"   ;;
esac

View solution in original post

tlarkin
Honored Contributor

looks good to me and you seem to have covered your bases on it. I'd say toss this in the resource kit, errrr or whatever the resource kit is going to be now.

View solution in original post

16 REPLIES 16

rob_potvin
Contributor III
Contributor III

I re-worked the script a bit here and just wanted to share.

http://macmule.com/2011/09/09/how-to-turn-off-wireless-card/

MacMule created a script on his site to turn airport off and I took some of what he wrote concerning 10.7 and added it to this script. I only have 10.6 and 10.7 clients here.

Feedback needed and the outcome is that maybe we can create a new setAirportNetwork.sh script that works with every OS and have it added here

if [[ "$OS" == "10.6" ]]; then
    echo "Setting airport SSID to $SSID..."
    /usr/sbin/networksetup -setairportnetwork AirPort "$SSID" "$password"
else
    checkWireless=$(networksetup -listallhardwareports | egrep "Hardware Port: (Air|Wi-)" | cut -c 16-)
    # First we need to get the Wi-Fi device's name
    wifiDevice=`/usr/sbin/networksetup -listallhardwareports | awk '/^Hardware Port: Wi-Fi/,/^Ethernet Address/' | head -2 | tail -1 | cut -c 9-`
    echo "Setting airport SSID to" $SSID
    /usr/sbin/networksetup -setairportnetwork "$wifiDevice" "$SSID" "$password"
fi

bentoms
Release Candidate Programs Tester

glad i could help :)

tlarkin
Honored Contributor

In 10.7 Apple changed the Airport Card to "Wi-Fi", it is better to build an array of enabled services first, then pass them through the script. This is just my opinion.

-Tom

rtrouton
Release Candidate Programs Tester

You could also try this:

#!/bin/sh

# Set the SSID variable to your wireless network name
# to set the network name you want to connect to.
SSID=

# Set the SECURITY variable to the security type of the
# wireless network (NONE, WEP, WPA, WPA2, WPAE or
# WPA2E) Setting it to NONE means that it's an open
# network with no encryption.
SECURITY=

# If you've set the SECURITY variable to something other than NONE,
# set the password here. For example, if you are using WPA
# encryption with a password of "thedrisin", set the PASSWORD
# variable to "thedrisin" (no quotes.)
PASSWORD=

# Determines which OS the script is running on
OS=`/usr/bin/sw_vers | grep ProductVersion | cut -c 17-20`

# On 10.7, the Wi-Fi interface needs to be identified
wifiDevice=`/usr/sbin/networksetup -listallhardwareports | awk '/^Hardware Port: Wi-Fi/,/^Ethernet Address/' | head -2 | tail -1 | cut -c 9-`

if [ "${OS}" = "10.7" ]; then
    echo "Setting airport SSID to" $SSID
    /usr/sbin/networksetup -setairportnetwork $wifiDevice $SSID $SECURITY $PASSWORD
else
    echo "Setting airport SSID to $SSID..."
    /usr/sbin/networksetup -setairportnetwork AirPort $SSID $SECURITY $PASSWORD 
fi

tlarkin
Honored Contributor

This is how I would do it. This is written on the fly, use at own risk, test, test, test, etc.

#!/bin/bash

# determine OS Version

OSvers=$(/usr/bin/sw_vers -productVersion)

case ${OSvers} in

    10.6* ))`/usr/sbin/networksetup my-10.6-commands`;;
    10.7* ))`/usr/sbin/networksetup my-10.7-commands`;;
esac

exit 0

rob_potvin
Contributor III
Contributor III

Thanks for all the feed back! What shall we do? Case or if else, best way to rewrite this so everyone can use it, and have it support 10.4 up ? Or just 10.5 and up

Thanks

rob_potvin
Contributor III
Contributor III

Thanks for all the feed back! What shall we do? Case or if else, best way to rewrite this so everyone can use it, and have it support 10.4 up ? Or just 10.5 and up

Thanks

rob_potvin
Contributor III
Contributor III

Thanks for all the feed back! What shall we do? Case or if else, best way to rewrite this so everyone can use it, and have it support 10.4 up ? Or just 10.5 and up

Thanks

rob_potvin
Contributor III
Contributor III

Thanks for all the feed back! What shall we do? Case or if else, best way to rewrite this so everyone can use it, and have it support 10.4 up ? Or just 10.5 and up

Thanks

tlarkin
Honored Contributor

Correct, as far as I can tell the code:

sw_vers -productVersion

works on 10.4, 10.5, 10.6, and 10.7. Just verified on my old 10.4 box which acts as a file server

Odin:~ sadmin$ sw_vers
ProductName:    Mac OS X Server
ProductVersion: 10.4.11
BuildVersion:   8S169
Odin:~ sadmin$ sw_vers -productVersion
10.4.11
Odin:~ sadmin$

So, you could write a case statement and wild card the OS version from 10.4 to 10.7 and then apply the proper code.

-Tom

rob_potvin
Contributor III
Contributor III

How is this folks? not sure if I should be using airport of networksetup for the older versions... It works on 10.7 and 10.6 for me, needs to be tested on the other versions, so if someone could test and let us know that would be great :-).

(Sorry about posting 4 times before, something with Safari didn't work.)

#!/bin/sh
####################################################################################################
#
# Copyright (c) 2010, JAMF Software, LLC.  All rights reserved.
#
#       Redistribution and use in source and binary forms, with or without
#       modification, are permitted provided that the following conditions are met:
#               * Redistributions of source code must retain the above copyright
#                 notice, this list of conditions and the following disclaimer.
#               * Redistributions in binary form must reproduce the above copyright
#                 notice, this list of conditions and the following disclaimer in the
#                 documentation and/or other materials provided with the distribution.
#               * Neither the name of the JAMF Software, LLC nor the
#                 names of its contributors may be used to endorse or promote products
#                 derived from this software without specific prior written permission.
#
#       THIS SOFTWARE IS PROVIDED BY JAMF SOFTWARE, LLC "AS IS" AND ANY
#       EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
#       WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
#       DISCLAIMED. IN NO EVENT SHALL JAMF SOFTWARE, LLC BE LIABLE FOR ANY
#       DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
#       (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
#       LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
#       ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
#       (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
#       SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
####################################################################################################
#
# SUPPORT FOR THIS PROGRAM
#
#       This program is distributed "as is" by JAMF Software, LLC's Resource Kit team. For more
#       information or support for the Resource Kit, please utilize the following resources:
#
#               http://list.jamfsoftware.com/mailman/listinfo/resourcekit
#
#               http://www.jamfsoftware.com/support/resource-kit
#
#       Please reference our SLA for information regarding support of this application:
#
#               http://www.jamfsoftware.com/support/resource-kit-sla
#
####################################################################################################
#
# ABOUT THIS PROGRAM
#
# NAME
#   setAirPortNetwork.sh -- Disassociates from the current wireless network and sets the SSID and WEP or 
#                    WPA password on the AirPort assuming the AirPort is on
#
# SYNOPSIS
#   sudo setAirPortNetwork.sh
#   sudo setAirPortNetwork.sh <SSID> <password> 
#
# DESCRIPTION
#   This script was designed to configure the AirPort network settings, including which SSID the
#   AirPort is pointed to, as well as what password should be used to connect to the network
#   if the network is a secured wireless network.
#
####################################################################################################
#
# HISTORY
#
#   Version: 1.1
#
#   - Created by Eric Krause on March 5th, 2010
#   - Modified by Eric Krause on June 22, 2010 to fix the command for 10.5
# 
####################################################################################################
#
# DEFINE VARIABLES & READ IN PARAMETERS
#
####################################################################################################

# HARDCODED VALUES SET HERE
SSID=""                   #The SSID of the wireless network to connect to
password=""               #This only needs to be set if a password is required


# CHECK TO SEE IF A VALUE WERE PASSED IN FOR PARAMETERS $4 THROUGH $5 AND, IF SO, ASSIGN THEM
if [ "$4" != "" ] && [ "$SSID" == "" ]; then
    SSID=$4
fi

if [ "$5" != "" ] && [ "$password" == "" ]; then
    password=$5
fi


####################################################################################################
# 
# SCRIPT CONTENTS - DO NOT MODIFY BELOW THIS LINE
#
####################################################################################################

if [ "$SSID" == "" ]; then
echo “Error: The parameter ‘SSID’ is blank. Please specify a SSID.”
exit 1
fi

OS=`/usr/bin/sw_vers -productVersion | /usr/bin/colrm 5`
wifiDevice=`/usr/sbin/networksetup -listallhardwareports | awk '/^Hardware Port: Wi-Fi/,/^Ethernet Address/' | head -2 | tail -1 | cut -c 9-`

case $OS in

10.4*)
    echo "Setting airport SSID to" $SSID
    System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -z -A"$SSID" –password="$password"
    ;;
10.5*)
    echo "Setting airport SSID to" $SSID
    /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -z -A"$SSID" –password="$password"
    ;;
10.6*)
    echo "Setting airport SSID to $SSID..."
    /usr/sbin/networksetup -setairportnetwork AirPort "$SSID" "$password"
    ;;
10.7*)
    checkWireless=$(networksetup -listallhardwareports | egrep "Hardware Port: (Air|Wi-)" | cut -c 16-)
    # First we need to get the Wi-Fi device's name
    echo "Setting airport SSID to" $SSID
    /usr/sbin/networksetup -setairportnetwork "$wifiDevice" "$SSID" "$password"   ;;
esac

tlarkin
Honored Contributor

looks good to me and you seem to have covered your bases on it. I'd say toss this in the resource kit, errrr or whatever the resource kit is going to be now.

rob_potvin
Contributor III
Contributor III

So should work then, 10.4 and 10.5 use airport ??

tlarkin
Honored Contributor

Yes, Airport used to be the standard service name for the wireless card in OS X until 10.7.

sean
Valued Contributor

I'd be tempted to condense the main section down to the following (explanation below):

OS=/usr/bin/sw_vers -productVersion | /usr/bin/cut -d "." -f 1,2

case $OS in
10.[4-5]) logger -t $0 "Setting airport SSID to" $SSID System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -z -A"$SSID" –password="$password" ;;
10.[6-7]) deviceName=networksetup -listallhardwareports | egrep -A 1 "Hardware Port: (Air|Wi-)" | tail -1 | awk '{print $NF}' logger -t $0 "Setting airport SSID to" $SSID /usr/sbin/networksetup -setairportnetwork $deviceName "$SSID" "$password" ;;
esac

The script will error on 10.4. networksetup lives in a different place prior to Leopard
/System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Support/networksetup

If you only want that command for 10.7 then run that in the case statement. Saying that, it doesn't seem to be doing anything.

I would also be tempted to replace the line
OS=/usr/bin/sw_vers -productVersion | /usr/bin/colrm 5
with
OS=/usr/bin/sw_vers -productVersion | cut -d "." -f 1,2

Maybe we wont get to 10.10, but if we do then this script would break with the above line.

As you are explicitly limiting the variable OS, then you don't need the * in each of the case statements

so

10.4)
10.5)
etc instead and in fact you can use ranges, so

10.[4-5])

I also believe you can use the device name on both 10.6 and 10.7

I've also chosen to write to system.log instead of using echo!

tlarkin
Honored Contributor

Oh yeah I totally forgot in 10.4 networksetup was in a way different place, also the binary has had many updates so make sure the code works on each system.