вторник, 13 июля 2010 г.

Еще немного о WiFi в гостинице.

По прежнему сижу в Ростове в гостинице "Ростов" в командировке. :)
Так как wifi тут черезжопный, решил немного автоматизировать подключение, что бы на надо было постоянно через броузер проходить аутентификацию. Далее пару скриптиков. ;)

Сначала надо сделать сам скриптик:

#!/usr/bin/env python
# coding: utf-8

# Created 2010-07-13

import httplib, urllib, re

def login_form():
    params = urllib.urlencode({ "Username": "guest",
                                "redir": "%2F",
                                "Password": "waterloo"
                            })
    headers = { "Content-type": "application/x-www-form-urlencoded",
                "Accept": "text/html, text/plain, text/css, text/sgml, */*;q=0.01",
                "Pragma": "no-cache",
                "Cache-Control": "no-cache",
                "Host": "ya.ru"
              }

    conn = httplib.HTTPConnection("ya.ru:80")
    conn.request("POST", "/loginuser/", params, headers)
    response = conn.getresponse()
    print response.status, response.reason
    data = response.read()
    conn.close()

def check_site():
    u = urllib.urlopen("http://ya.ru")
    data = u.read()
    if re.search("Authentication required", data):
        return True
    return False
    
if __name__ == "__main__":      
    if check_site():            
        print "Auth form found"
        login_form()
    else:       
        print "This is ya.ru"

Ну тут думаю все понятно: проверяем есть ли в запрошенной странице строка про аутентификацию, если есть - значит нас спрашивают, тогда делаем POST с именем пользователя и паролем. Все это сложим в /root/bin/.

Теперь это все не плохо было бы сделать автоматически запускаемым. Для этого делаем скриптик /etc/NetworkManager/dispatcher.d/99rostov-hotel со следующим содержимым:

#!/bin/sh -e
# Script to dispatch NetworkManager events
#
# Runs ifupdown scripts when NetworkManager fiddles with interfaces.

if [ -z "$1" ]; then
    echo "$0: called with no interface" 1>&2
    exit 1;
fi

# Fake ifupdown environment
export IFACE="$1"
export LOGICAL="$1"
export ADDRFAM="NetworkManager"
export METHOD="NetworkManager"
export VERBOSITY="0"

# Run the right scripts
case "$2" in
    up)
    export MODE="start"
    export PHASE="up"

    SSID=`nm-tool | grep hotel-rostov`
    if [ ! "x$SSID" = "x" ]; then
        python /root/bin/login.py
    fi

    exit 0
    ;;
    *)
    echo "$0: called with unknown action \`$2'" 1>&2
    exit 1
    ;;
esac

Все, переконнекчиваем nm к точке и больше не паримся с авторизацией в броузере. ;)

P.S. Жаль не нашел может ли nm передать ssid точки доступа, ну да ладно. Для решения за 10 минут вполне покатит. ;) Этот пост и то писал в 3 раза дольше. :)))

P.P.S. Уже когда запостил, прдумал как получить ssid. :)