Кто в офисе?

Побывал сегодня на работе и, в перерыве между делами, написал небольшой скрипт на 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

Читайте также

Bashnut Battery
Есть такая программа — coconutBattery, красиво показывает под MacOS X состояние батареи и некоторые другие характеристики. Поскольку я тут тренируюсь писать под Bash, решил сегодня повторить её функционал.
2011
Обработка данных интернет-клиента «Альфа-банка»
Накидал небольшую программу для обработки данных из интернет-клиента «Альфа-банка». Первым параметром указывается CSV-файл, выгруженный из клиента, на выходе три столбца — дата операции, сумма и описание.
2011
DBF → text
Попросили сконвертировать кучу досовских файлов формата DBF (dBase) во что-нибудь путное. Вдруг кому-то ещё понадобится, публикую решение.
2014

Комментарии 12

Евгений Степанищев (bolknote.ru) автор № 6

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

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

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