1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-09-02 22:11:54 +02:00
zsh/Completion/Darwin/Command/_networksetup

320 lines
14 KiB
Text

#compdef networksetup
# Notes:
# - Inconsistent option capitalisation is intentional; see networksetup(1)
# - Options related to user/log-in/system profiles are omitted, since they no
# longer function (despite appearing in the manual)
# - Each d/p/s could list associated d/p/s in the descriptions
# - Options that take multiple devices/services (e.g. -createBond) could exclude
# those previously specified on the command line
# - Bond, PPPoE, and VLAN functionality couldn't be tested; some option-
# arguments aren't completed (-deleteBond, -deleteVLAN, ...)
# - -createpppoeservice arguments in particular may not be right
# Complete network devices
(( $+functions[_networksetup_devices] )) ||
_networksetup_devices() {
local -a expl tmp
tmp=( ${(f)"$(
_call_program network-devices $words[1] -listallhardwareports
)"} )
tmp=( ${(@M)tmp##Device:*} )
tmp=( ${(@)tmp##Device:[[:space:]]##} )
_wanted -x devices expl 'network device' compadd -a "$@" - tmp
}
# Complete network locations
(( $+functions[_networksetup_locations] )) ||
_networksetup_locations() {
local -a expl tmp
tmp=( ${(f)"$( _call_program network-locations $words[1] -listlocations )"} )
_wanted -x locations expl 'network location' compadd -a "$@" - tmp
}
# Complete hardware ports
(( $+functions[_networksetup_ports] )) ||
_networksetup_ports() {
local -a expl tmp
tmp=( ${(f)"$(
_call_program hardware-ports $words[1] -listallhardwareports
)"} )
tmp=( ${(@M)tmp##Hardware Port:*} )
tmp=( ${(@)tmp##Hardware Port:[[:space:]]##} )
_wanted -x ports expl 'hardware port' compadd -a "$@" - tmp
}
# Complete network services
(( $+functions[_networksetup_services] )) ||
_networksetup_services() {
local -a expl tmp
tmp=( ${(f)"$(
_call_program network-services $words[1] -listallnetworkservices
)"} )
# The command output doesn't distinguish between a leading asterisk used to
# indicate an inactive service and one that's just used in the service name
# itself... but the latter scenario seems uncommon, so we'll assume it's
# always the former
tmp=( ${(@)tmp#\*} )
# The first line is an explanation of the asterisk thing; skip it
tmp=( ${(@)tmp[2,-1]} )
_wanted -x services expl 'network service' compadd -a "$@" - tmp
}
# Complete Wi-Fi networks — this function expects the final argument to be the
# name of a wireless device (pre-escaped, as if taken from $words)
(( $+functions[_networksetup_wifi_networks] )) ||
_networksetup_wifi_networks() {
local -a expl tmp
tmp=( ${(f)"$(
_call_program wifi-networks $words[1] \
-listpreferredwirelessnetworks ${(q-)@[-1]}
)"} )
# Lines with Wi-Fi networks on them are prefixed by white space
tmp=( ${(@M)tmp##[[:space:]]*} )
tmp=( ${(@)tmp##[[:space:]]##} )
shift -p # Discard device argument
_wanted -x wifi-networks expl 'Wi-Fi network' compadd -a "$@" - tmp
}
_networksetup() {
local i j ret=1
local -a context line state state_descr args tmp
local -A opt_args val_args proxies
args=(
+ '(cmd)'
'-addDeviceToBond[add specified device/port to bond]: :->dp: :->b'
'-addpreferredwirelessnetworkatindex[add preferred Wi-Fi network for specified device]: :->d: :->w:*::: :->wifi-idx-info'
'-connectpppoeservice[connect specified PPPoE service]: :->P'
'-create6to4service[create new 6to4 service]:6to4 service name'
'-createBond[create bond with specified devices/ports]:bond name: :*: :->dp'
'-createlocation[create new network location]:network location name: :*: :->s'
'-createnetworkservice[create new network service on specified device/port]: :->dp:network service name'
'-createpppoeservice[create new PPPoE service on specified device/port]: :->dp: :->s:PPPoE account name: :PPPoE password: :PPPoE service name'
'-createVLAN[create VLAN on specified device/port]:VLAN name: : :->dp:VLAN tag'
'-deleteBond[delete specified bond]: :->b'
'-deletelocation[delete specified network location]: :->l'
'-deletepppoeservice[delete specified PPPoE service]: :->P'
'-deleteVLAN[delete VLAN from specified device/port]:VLAN name: : :->dp:VLAN tag'
'-detectnewhardware[detect new network hardware]'
'-disconnectpppoeservice[disconnect specified PPPoE service]: :->P'
'-duplicatenetworkservice[duplicate specified network service]: :->s:network service name'
'-getadditionalroutes[list additional IPv4 routes for specified network service]: :->s'
'-getairportnetwork[display Wi-Fi network for specified device]: :->d'
'-getairportpower[display Wi-Fi power state for specified device]: :->d'
'-getautoproxyurl[display proxy auto-config URL for specified network service]: :->s'
'-getv6additionalroutes[list additional IPv6 routes for specified network service]: :->s'
'-getcomputername[display computer name]'
'-getcurrentlocation[display current network location]'
'-getdnsservers[display DNS info for specified network service]: :->s'
'-getinfo[display info for specified network service]: :->s'
'-getmacaddress[display MAC address for specified device/port]: :->dp'
'-getMedia[display media for specified device/port]: :->dp'
'-getMTU[display MTU for specified device/port]: :->dp'
'-getnetworkserviceenabled[get enabled state for specified network service]: :->s'
'-getpassiveftp[display passive FTP state for specified network service]: :->s'
'-getproxyautodiscovery[display proxy auto-discovery state for specified network service]: :->s'
'-getproxybypassdomains[display proxy bypass domains for specified network service]: :->s'
'-getsearchdomains[display DNS search domains for specified network service]: :->s'
'-help[display help information]'
'-isBondSupported[display whether device/port can be added to a bond]: :->dp'
'-listallhardwareports[list hardware ports]'
'-listallnetworkservices[list network services]'
'-listBonds[list bonds]'
'-listdevicesthatsupportVLAN[list devices that support VLANs]'
'-listlocations[list network locations]'
'-listnetworkserviceorder[list network services and their devices/ports in order]'
'-listpreferredwirelessnetworks[list preferred Wi-Fi networks for the specified device]: :->d'
'-listpppoeservices[list PPPoE services]'
'-listValidMedia[list valid media for specified device/port]: :->dp'
'-listValidMTURange[display valid MTU range for specified device/port]: :->dp'
'-listVLANs[list VLANs]'
'-ordernetworkservices[set network service order]:*: :->s'
'-printcommands[list commands]'
'-removeallpreferredwirelessnetwork[remove all preferred Wi-Fi networks from specified device]: :->d'
'-removeDeviceFromBond[remove specified device/port from bond]: :->dp: :->b'
'-removenetworkservice[remove specified network service]: :->s'
'-removepreferredwirelessnetwork[remove preferred Wi-Fi network from specified device]: :->d: :->w'
'-renamenetworkservice[rename specified network service]: :->s:network service name'
'-set6to4automatic[set specified 6to4 service to get relay address automatically]:6to4 service:->s'
'-set6to4manual[set specified 6to4 service to use manual relay address]:6to4 service:->s:relay address'
'-setadditionalroutes[set additional IPv4 routes for specified network service]: :->s:*::: :->routes-v4'
'-setairportnetwork[set Wi-Fi network for specified device]: :->d: :->w:Wi-Fi network password'
'-setairportpower[set Wi-Fi power state for specified device]: :->d:Wi-Fi power state:(on off)'
'-setautoproxyurl[set proxy auto-config URL for specified network service]: :->s:proxy auto-config URL:_urls'
'-setcomputername[set computer name]:computer name'
'-setbootp[set specified network service to use BOOTP]: :->s'
'-setdhcp[set specified network service to use DHCP]: :->s:client ID (optional)'
'-setdnsservers[set DNS servers for specified network service]: :->s:*:DNS server address'
'-setmanual[set specified network service to use manual IPv4 IP/subnet/router]: :->s:IP address: :subnet mask: :router address'
'-setmanualwithdhcprouter[set specified network service to use DHCP with manual IP]: :->s:IP address'
'-setMedia[set media for specified device/port]: :->dp: :->media:*:media option'
'-setMTU[set MTU for specified device/port]: :->dp: :->mtu'
'-setMTUAndMediaAutomatically[set specified device/port to automatically set MTU and media type]: :->dp'
'-setnetworkserviceenabled[set enabled state for specified network service]: :->s:network service enabled state:(on off)'
'-setpassiveftp[set passive FTP state for specified network service]: :->s:passive FTP state:(on off)'
'-setpppoeaccountname[set account name for specified PPPoE service]: :->P:PPPoE account name'
'-setpppoepassword[set password for specified PPPoE service]: :->P:PPPoE password'
'-setproxyautodiscovery[set proxy auto-discovery state for specified network service]: :->s:proxy auto-discovery state:(on off)'
'-setproxybypassdomains[set proxy bypass domains for specified network service]: :->s:*:proxy bypass domain'
'-setsearchdomains[set DNS search domains for specified network service]: :->s:*:DNS search domain'
'-setv6additionalroutes[set additional IPv6 routes for specified network service]: :->s:*::: :->routes-v6'
'-setv4automatic[set specified network service to get IPv4 address automatically]: :->s'
'-setv6automatic[set specified network service to get IPv6 address automatically]: :->s'
'-setv6linklocal[set specified network service to use link-local address only for IPv6]: :->s'
'-setv6manual[set specified network service to use manual IPv6 IP/prefix/router]: :->s:IP address: :prefix length: :router address'
'-setv4off[disable IPv4 for specified network service]: :->s'
'-setv6off[disable IPv6 for specified network service]: :->s'
'-showBondStatus[display status for specified bond]: :->b'
'-showpppoestatus[display status for specified PPPoE service]: :->P'
'-switchtolocation[switch to specified network location]: :->l'
)
proxies=(
ftp FTP
gopher Gopher
socksfirewall SOCKS
secureweb HTTPS
streaming RTSP
web HTTP
)
for i j in ${(kv)proxies}; do
args+=(
"-get${i}proxy[display $j proxy info for specified network service]: :->s"
"-set${i}proxy[set $j proxy info for specified network service]: :->s:*::: :->proxy-info"
"-set${i}proxystate[set $j proxy state for specified network service]: :->s:proxy state:(on off)"
)
done
_arguments : $args && ret=0
case $state in
b) _message -e bonds 'interface bond' && ret=0 ;;
d) _networksetup_devices && ret=0 ;;
l) _networksetup_locations && ret=0 ;;
p) _networksetup_ports && ret=0 ;;
P) _message -e pppoe-services 'PPPoE service' && ret=0 ;;
s) _networksetup_services && ret=0 ;;
dp)
_alternative \
'devices::_networksetup_devices' \
'ports::_networksetup_ports' \
&& ret=0
;;
dps)
_alternative \
'devices::_networksetup_devices' \
'ports::_networksetup_ports' \
'services::_networksetup_services' \
&& ret=0
;;
ps)
_alternative \
'ports::_networksetup_ports' \
'services::_networksetup_services' \
&& ret=0
;;
w)
# Wi-Fi network always follows device/port on command line
_networksetup_wifi_networks $words[(CURRENT - 1)] && ret=0
;;
media)
# Media type always follows device/port on command line
tmp=( ${(f)"$(
_call_program media-types $words[1] \
-listValidMedia $words[(CURRENT - 1)]
)"} )
tmp=( ${tmp##\**} ) # Error message
if (( $#tmp )); then
_describe -t media-types 'media type' tmp && ret=0
else
_message -e media-types 'media type' && ret=0
fi
;;
mtu)
# MTU value always follows device/port on command line
tmp=( ${(f)"$(
_call_program mtu-ranges $words[1] \
-listValidMTURange $words[(CURRENT - 1)]
)"} )
tmp=( ${(M)tmp##Valid MTU Range:*} )
tmp=( ${tmp##*:[[:space:]]#} )
_message -e mtu-value "MTU value${tmp:+ (${tmp})}" && ret=0
;;
proxy-info)
(( CURRENT > 5 )) ||
case $(( CURRENT % 5 )) in
1) _message -e hosts 'proxy server address' && ret=0 ;;
2) _message -e ports 'proxy port number' && ret=0 ;;
3) _values 'authenticated proxy support' on off && ret=0 ;;
4)
[[ $words[(CURRENT - 1)] == on ]] &&
_message -e users 'proxy user name' &&
ret=0
;;
0)
[[ $words[(CURRENT - 2)] == on ]] &&
_message -e passwords 'proxy password' &&
ret=0
;;
esac
;;
routes-v4)
case $(( CURRENT % 3 )) in
1) _message -e addresses 'destination address' && ret=0 ;;
2) _message -e masks 'subnet mask' && ret=0 ;;
0) _message -e addresses 'router address' && ret=0 ;;
esac
;;
routes-v6)
case $(( CURRENT % 3 )) in
1) _message -e addresses 'destination address' && ret=0 ;;
2) _message -e prefixes 'prefix length' && ret=0 ;;
0) _message -e addresses 'router address' && ret=0 ;;
esac
;;
wifi-idx-info)
(( CURRENT > 3 )) ||
case $(( CURRENT % 3 )) in
1)
_message -e wifi-indexes 'index in preferred Wi-Fi networks list' &&
ret=0
;;
2)
tmp=(
'OPEN:none (unsecured)'
'WPA:WPA Personal'
'WPA2:WPA2 Personal'
'WPA/WPA2:WPA/WPA2 Personal'
'WPAE:WPA Enterprise'
'WPA2E:WPA2 Enterprise'
'WPAE/WPA2E:WPA/WPA2 Enterprise'
'WEP:plain WEP'
'8021XWEP:802.1X WEP'
)
_describe -t security-types 'Wi-Fi network security type' tmp && ret=0
;;
0)
[[ ${(U)words[(CURRENT - 1)]} != OPEN ]] &&
_message -e passwords 'Wi-Fi network password' &&
ret=0
;;
esac
;;
esac
return ret
}
_networksetup "$@"