Кто в офисе?

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

анонимус (инкогнито)
19 февраля 2011, 21:20

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

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

bolk (bolknote.ru)
19 февраля 2011, 21:34, ответ предназначен анонимусу

Ну и что? :)

анонимус (инкогнито)
19 февраля 2011, 21:36

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

анонимус (инкогнито)
19 февраля 2011, 21:37

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

bolk (bolknote.ru)
19 февраля 2011, 21:38, ответ предназначен анонимусу

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

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

bolk (bolknote.ru)
19 февраля 2011, 21:49, ответ предназначен анонимусу

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

анонимус (инкогнито)
19 февраля 2011, 21:57

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

bolk (bolknote.ru)
19 февраля 2011, 22:13, ответ предназначен анонимусу

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

анонимус (инкогнито)
19 февраля 2011, 22:33

хз. вроде достаточно просто все.
sed -E 's/^.*updated_at"[^"]+"([^"]+).+/\1/
зависит от характера того что там отдается по http.
не скажу как бы я делал.

bolk (bolknote.ru)
19 февраля 2011, 22:35, ответ предназначен анонимусу

JSON там.

jankkhvej (jankkhvej.blogspot.com)
20 февраля 2011, 10:20

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

bolk (bolknote.ru)
20 февраля 2011, 11:08, ответ предназначен jankkhvej (jankkhvej.blogspot.com):

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

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)