Нужна помощь в использовании GeekTool с system_profiler и networksetup - PullRequest
0 голосов
/ 18 июля 2011

Алоха всем,

Я создал небольшой скрипт оболочки bash, который я хотел использовать с GeekTool, но у меня были разные результаты при использовании одного и того же скрипта на моем iMac (11,1) и MacBook Pro(8,3).Я извлекаю данные из сети, используя networksetup и system_profiler.Пока что у меня есть несколько вызовов для обоих, но я хотел бы объединить их в один вызов для каждого процесса, создавая переменные для использования в моем сценарии.Вот мой скрипт на данный момент:

# Get Ethernet and Wi-Fi information and display it for GeekTool
WiFi=$(networksetup -getairportnetwork en1 | awk '{print $4 " " $5 " " $6 " " $7 " " $8}')
WiFi_IP=$(networksetup -getinfo Wi-Fi | grep -v IPv6 | awk '/IP address/ {print $3}')
SubMask=$(networksetup -getinfo Wi-Fi | awk '/Subnet mask/ {print $3}')
S2N=$(system_profiler SPAirPortDataType | awk '/Noise/ {print $4 " " $5 " " $6 " " $7 " " $8}')
TRate=$(system_profiler SPAirPortDataType | awk '/Rate/ {print $3 " Mbps"}')
echo  -e "\033[4;33m" AirPort

if [ "$WiFi_IP" = "" ];
    then echo "Not connected to wireless AP."
    else echo -e "Wi-Fi AP: " $WiFi "\nIP Address: " $WiFi_IP "\nSubnet Mask: " $SubMask "\nTransmit Rate: " $TRate
    fi

EthIP=$(networksetup -getinfo Ethernet | grep -v IPv6 | awk '/IP address/ {print $3}')
EthSubMask=$(networksetup -getinfo Ethernet | grep -v IPv6 | awk '/Subnet mask/ {print $3}')
echo -e "\033[4;33m" "\nEthernet"

if [ "$EthIP" = "" ];
    then echo "Not connected to wired network."
    else echo -e "IP Address: " $EthIP "\nSubnet Mask: " $EthSubMask
    fi

Когда я создаю оболочку в GeekTool и указываю путь к своему скрипту, все отлично работает на моем MacBook Pro, но на моем iMac GeekTool отображает результаты один раззатем, после обновления (у меня было установлено значение 15 с), результат исчезает и никогда не возвращается на экран.Хотя я знаю, что то, что у меня есть, работает, оно делает слишком много вызовов обоим процессам, и я хотел бы объединить его в один вызов на процесс, извлекая нужную информацию в контейнер, такой как массив, из которого я могу получить доступ к указанной желаемой информации.

Другими словами, знает ли кто-нибудь, как я могу сделать всего один звонок в networksetup, чтобы получить всю информацию, собранную как из -getairportnetwork en1 и -getinfo Wi-Fi, так и из system_profiler SPAirPortDataType (который занимает больше всего времени -около 5-8 секунд каждый раз)?

1 Ответ

0 голосов
/ 28 июля 2011

Я немного изменил свой скрипт инструмента geek и пропустил функцию «Сигнал к шуму».Вот как выглядит новый файл AirportStatus.sh:

#! /bin/bash

# echo -e "\033[0;30m"       echo in black
# echo -e "\033[0;31m"       echo in red
# echo -e "\033[0;32m"       echo in green
# echo -e "\033[0;33m"       echo in yellow
# echo -e "\033[0;34m"       echo in blue
# echo -e "\033[0;35m"       echo in magenta
# echo -e "\033[0;36m"       echo in cyan
# echo -e "\033[0;37m"       echo in white

# echo -e "\033[4;37m"       echo in white underlined

echo -e "\033[4;33m" "Airport"

# Get Airport status from OS X
Status=$(ifconfig en1 | awk '/status/ {print $2}')


if [ "$Status" = "inactive" ];
    then echo -e "\033[0;31m" "Status: " $Status "\nNot connected to wireless AP."
    else echo -e  "\033[0;32m" "Status" $Status

    # Get wireless stats from OS X

    WiFi=$(networksetup -getairportnetwork en1 | awk '{print $4 " " $5 " " $6 " " $7 " " $8}')
    WiFi_IP=$(networksetup -getinfo Wi-Fi | grep -v IPv6 | awk '/IP address/ {print $3}')
    SubMask=$(networksetup -getinfo Wi-Fi | awk '/Subnet mask/ {print $3}')
    TRate=$(system_profiler SPAirPortDataType | awk '/Transmit/' | sed 's/[^0-9]//g')

    # Get bytes in/out

    # get the current number of bytes in and bytes out
    myvar1=$(netstat -ib | grep -e en1 -m 1 | awk '{print $7}') #  bytes in
    myvar3=$(netstat -ib | grep -e en1 -m 1 | awk '{print $10}') # bytes out

    #wait one second
    sleep 1

    # get the number of bytes in and out one second later
    myvar2=$(netstat -ib | grep -e en1 -m 1 | awk '{print $7}') # bytes in again
    myvar4=$(netstat -ib | grep -e en1 -m 1 | awk '{print $10}') # bytes out again

    # find the difference between bytes in and out during that one second
    subin=$(($myvar2 - $myvar1))
    subout=$(($myvar4 - $myvar3))

    # convert bytes to megabytes
    mbin=$(echo "scale=2 ; $subin/1048576;" | bc) 
    mbout=$(echo "scale=2 ; $subout/1048576 ; " | bc)

    usedMB=$(echo "scale=2 ; $mbin+$mbout ; " | bc)
    AvailBW=$(echo "scale=2 ; $TRate-$usedMB ; " | bc)

    echo -e "\033[0;37m" "Wi-Fi AP: " "\033[0;36m" $WiFi "\033[0;37m" "\nIP Address: " "\033[0;36m" $WiFi_IP $3 "\033[0;37m" "\nSubnet Mask: " "\033[0;36m" $SubMask "\033[0;37m" "\nTransmit Rate: " "\033[0;36m" $TRate " Mbps\n" "\033[0;37m" "Data In: "  "\033[0;36m" $mbin "Mbps" "\n" "\033[0;37m" "Data Out: "  "\033[0;36m" $mbout "Mbps\n" "\033[0;37m" "Available Bandwidth: " "\033[0;36m" $AvailBW " Mbps"

    fi

Я проверил наличие активного статуса, предполагая, что он изначально был неактивным.Если нет, то я вставил массивный оператор if, в котором все переменные инициализированы и вычисления выполнены.Есть только один вызов system_profiler, который возвращает скорость передачи, но я хотел увидеть «скорость линии» моей беспроводной сети.Это работает, не так хорошо, как мне бы хотелось, но это все же было хорошим упражнением, чтобы немного узнать о том, где взять информацию на моем Mac и как использовать awk и see.Мне еще предстоит многому научиться, но пока это было захватывающе.

...