Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

Кто в офисе?

Побывал сегодня на работе и, в перерыве между делами, написал небольшой скрипт на bash. В общем-то, для широкой публики результат его работы бесполезен, зато он является иллюстрацией как можно работать на bash с сокетами, я давно хотел попробовать.

На оптимальность решений не претендую, конечно, всё равно основное время работы — это ожидание данных из сокета.

# Кто сегодня в офисе?

# private data vars
WAPIHOST='██████.██████-████.██'
SAPIHOST='█████.██████.██'
SAPI='/█████/██████.xhtml?██████████=█&█████_██=██'

# non-private data vars
WAPI='/where/%s'
NOW=$(date +%s)

function whereAreYou {
    exec 3<>/dev/tcp/$WAPIHOST/80
    echo -e "GET ${WAPI/\%s/$1} HTTP/1.0\nHost: $WAPIHOST\n\n" >&3

    local DATA=$(grep -E '^.?$' -A1 <&3)

    if [[ ! $DATA =~ 'VPN' && $DATA =~ 'updated_at' ]]; then
        local date=$(echo $DATA | sed -E 's/^.*updated_at"[^"]+"([^"]+).+/\1/' | xargs -Io date -d'o' +%s)

        if [ $(($NOW-$date)) -le 3600 ]; then
            echo "$1 - $(date -d@$date +%k:%M)"
        fi
    fi
}

exec 4<>/dev/tcp/$SAPIHOST/80
echo -e "GET $SAPI HTTP/1.0\nHost: $SAPIHOST\n\n" >&4

while read -r line <&4; do
    nick=$(echo $line | egrep -o "href='http://$SAPIHOST/\w+" | cut -b$((15+${#SAPIHOST}))-)

    [ -n "$nick" ] && whereAreYou $nick
done
12 комментариев
анонимус 2011

function whereAreYou {
exec 3<>/dev/tcp/$WAPIHOST/80

Платформозависимо. :(

Евгений Степанищев (bolknote.ru) 2011

Комментарий для анонимус:

Ну и что? :)

анонимус 2011

ну я уж порадовался что что-то новое о баше узнаю. у тут банальный I/O

анонимус 2011

кстати вполне вероятно curl бы больше подошел :)

Евгений Степанищев (bolknote.ru) 2011

Комментарий для анонимус:

Что ж поделать? :)

Все конструкции этого скрипта знакомы?

Евгений Степанищев (bolknote.ru) 2011

Комментарий для анонимус:

кстати вполне вероятно curl бы больше подошел :)

Тогда зачем вообще это писать на баше? Я хотел решить какую-то задачу, попробовав поработать с сокетами.

анонимус 2011

Все конструкции этого скрипта знакомы?

да

Евгений Степанищев (bolknote.ru) 2011

Комментарий для анонимус:

А можно было что-то проще сделать?

анонимус 2011

хз. вроде достаточно просто все.

sed -E ’s/^.*updated_at«[^»]+«([^»]+).+/\1/

зависит от характера того что там отдается по http.
не скажу как бы я делал.

Евгений Степанищев (bolknote.ru) 2011

Комментарий для анонимус:

JSON там.

jankkhvej (jankkhvej.blogspot.com) 2011

А, например, sed и egrep/grep разве нельзя заменить на встроенные функции bash?

Евгений Степанищев (bolknote.ru) 2011

Комментарий для jankkhvej.blogspot.com:

Возможно. Мне так было проще. Можете предложить ваш вариант?