Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
 Użytkownik
 Użytkownik
	
Hej, mam taki problem a mianowicie chciałbym wywołać skrypt po konkretnym zdarzeniu, a konkretnie po przydzieleniu adresu ip przez serwer dhcp.
Czy macie jakiś pomysł jak to zrobić ?
Offline



 Użytkownik
 Użytkownik
	nawet dwa :)
prosty: monitorowanie adresu przydzielonego dla interfejsu (ifconfig albo ip a l)
skomplikowany: zajrzenie do flaczków dhcpcd (czy czego tam uzywasz do gadania z serwerem dhcp) - nie wiem czy przypadkiem -c tu nie wystarczy.
Offline



 Nadworny matematyk
 Nadworny matematyk
	




Może coś w stylu ifconfig | grep ADRES... Potem jeśli jest IP to robisz coś dalej? Chyba by musiał działać jako deamon...
Offline
 Użytkownik
 Użytkownik
	
Może troche źle sprecyzowałem. Nie chodzi o przydział ip dla mojej maszyny, tylko przydział ip przez mój serwer dhcp.
Czyli skrypt miałby się uruchamiac jeśli serwer dhcp postawiony na debianie przydzieli jakiemuś użytkownikowi sieci adres IP.
Offline







 Podobno człowiek...;)
 Podobno człowiek...;)
	








Czyli monitorowal stan pliku
/var/lib/dhcp/leasses
Prosty demon wiszacy na porcie, albo monitoring ww pliku, albo lepiej logi w rsyslogu do /dev/interfejs - a ten demon  monitorujący /dev/interfejs.
Wykonalne jak najbardziej.
Trochę rzeźbienia, ale żadna magia, chyba nawet w bashu dałoby radę, w perlu na 100%.
Ostatnio edytowany przez Jacekalex (2012-02-07 21:53:19)
Offline
 Użytkownik
 Użytkownik
	
hmm demonów nigdy nie tworzyłem, mógłbys napisać jakby miał on wyglądać, albo gdzie szukać informacji o tworzeniu takiego demona.
Offline







 Podobno człowiek...;)
 Podobno człowiek...;)
	








Kawałek przykładowego kodu (funkcja) z perla:
 
   use POSIX "setsid";
   
    sub daemonize {
    chdir("/") || die "can't chdir to /: $!";
    open(STDIN, "< /dev/null") || die "can't read /dev/null: $!";
   open(STDOUT, "> /dev/null") || die "can't write to /dev/null: $!";
    defined(my $pid = fork()) || die "can't fork: $!";
    exit if $pid; # non-zero now means I am the parent
    (setsid() != -1) || die "Can't start a new session: $!"
  open(STDERR, ">&STDOUT") || die "can't dup stdout: $!";
 }Pochodzi z tej dokumentacji: http://perldoc.perl.org/perlipc.html
A tu masz działający program ips napisany w pythonie, i przy okazji Autora do dyspozycji:
http://forum.dug.net.pl/viewtopic.php?pid=151913#p151913
Pozdro
;-)
Ostatnio edytowany przez Jacekalex (2012-02-08 00:14:46)
Offline
 Użytkownik
 Użytkownik
	
A co sądzicie o takim rozwiązaniu? Skrypt po uruchomieniu wisi na pliku dhcpd.leases i w razie przydziału/zwolnienia adresu wykonuje daną czynność.
#!/bin/bash
DHCPDLEASES="/var/lib/dhcp/dhcpd.leases"
touch "$DHCPDLEASES"
exec 0< "$DHCPDLEASES"
# go to the end of file
while read line; do
    true;
    done
    
    # process new entries
    while true; do
        if read line; then
           # ...
        echo "LINE: $line"         
        .
        .
        .
        doneOffline







 Podobno człowiek...;)
 Podobno człowiek...;)
	








W bashu zatrudniłbym osobiście  program swatch, jest w końcu od takiej zabawy.
Tu masz przykład (dosć typowy).
jeśli natomiast skrypt czyni swoją powinnośc, to ok.
Pozdro
;-)
Ostatnio edytowany przez Jacekalex (2012-02-16 16:18:43)
Offline




 Pan inż. Cyc
 Pan inż. Cyc
	




Jesli chodzi o skrytpty to nie ważne w czym napiszesz tylko żeby działało - co juz powyżej kolega napisał. Jedną z zalet skryptów w bash, sh, itp. to fakt że interpretery sa już w systemie i nie wymagają dodatkowych zasobów.
Offline


 Członek z Ramienia
 Członek z Ramienia
	



Dnsmasq poza tym, że jest dns forwarderem jest też serwerem dhcp, który potrafi po przydzieleniu adresu wywołać skrypt. Choć jest to tylko wiedza teoretyczna - nigdy go nie używałem jako dhcp.
Ostatnio edytowany przez bobycob (2012-02-16 20:05:38)
Offline
 Użytkownik
 Użytkownik
	
Naskrobałem taki oto skrypcik, lecz jest z nim pewien problem. Po uruchomieniu działa dobrze nasłuchuje na pliku dhcp.leases, puszcza oraz blokuje ruch, zapisuje przydzielony adres ip do bazy danych. Lecz po mniej więcej półtorej godziny od uruchomienia skryptu skrypt przestaje działać. Niby dalej sobie nasłuchuje ale nie wykonuje żadnych akcji zawartych w tym skrypcie, trzeba go an nowo uruchomić i wtedy działa poprawnie. Wiecie co może być powodem takiego zachowania?
#!/bin/bash
DHCPDLEASES="/var/lib/dhcp/dhcpd.leases"
touch "$DHCPDLEASES"
exec 0< "$DHCPDLEASES"
toupper()    # funkcja zamieniająca małe znaki na wielki
{
    local char="$*"
    out=$(echo $char | tr [:lower:] [:upper:])
    local retval=$?
    echo "$out"
    unset out char
    return $retval
}
# go to the end of file
while read line; do
    true;
    done
    
    # process new entries
while true; do
    if read line; then
           # ...
    #    echo "LINE: $line" 
    zmienna4=$zmienna4`echo $line | grep 'lease' | awk '{print $2}'`    # wyciągamy adres ip
    zmienna2=$zmienna2`echo $line | grep 'state'| awk '{print $3}'| cut -c 1-6`    #wyciągamy status
    zmienna3=$zmienna3`echo $line | grep 'hardware' | awk '{print $3}' | cut -c 1-17`    #wyciągamy adres mac 
    zmienna3=$(toupper $zmienna3)    #sprawiamy by adres mac miał wielki znaki
    zmienna3=`echo $zmienna3 | tr -s : -`
    
    zmienna="Line: $zmienna4 $zmienna2 $zmienna3"    #do zmiennej przypisujemy adres ip, stan oraz adres mac
    ip=`echo "$zmienna " | grep 'Line' | awk '{print $2 } '`
    if [ $ip <> " " ]
    then
    state=`echo "$zmienna " | grep 'Line' | awk '{print $3}'`
    if [ $state <> " " ]
    then
        mac=`echo "$zmienna " | grep 'Line' | awk '{print $4}'`
        if [ $mac <> " " ]
        then
        echo "$zmienna"
        zmienna4=" ";         #zerujemy zmienną
        zmienna3=" ";         #zerujemy zmienną
        zmienna2=" ";          #zerujemy zmienną
        if [ $state == "free;" ]        #jeśli zwolniony został adres ip
        then
            iptables -D FORWARD --source $ip -j ACCEPT        #usuwamy regułę
            iptables -D FORWARD --destination $ip -j ACCEPT    #usuwamy regułę
            iptables -I FORWARD --source $ip -j DROP
            iptables -I FORWARD --destination $ip -j DROP
        else     # jeśli adres p został przydzielony
            echo "update radacct set framedipaddress = '$ip' where acctstoptime IS NULL and callingstationid = '$mac' " | mysql -u root -pzaq12wsx radius        # aktualizujemy bazę danych o adres ip
            iptables -D FORWARD --source $ip -j DROP                     
            iptables -D FORWARD --destination $ip -j DROP
            iptables -I FORWARD --source $ip -j ACCEPT
            iptables -I FORWARD --destination $ip -j ACCEPT
        fi
        fi
    fi
    fi
    #-------------------------------------------------------    
    else
    zmienna4=" ";    #zerujemy zmienną
    zmienna3=" ";    #zerujemy zmienną
    zmienna2=" ";    #zerujemy zmienną
        sleep 0.01
    fi
doneOffline







 Podobno człowiek...;)
 Podobno człowiek...;)
	








A nie prościej naskrobać demona, który słucha na gnieździe, sokecie lub kolejce fifo., a potem w rsyslog skierować logi  DHCP na to gniazdo|kolejkę|soket?
Całość pięknie siedziałaby w ramie, i po krzyku.
W ostateczność moze być nawet plik logu, np:
tail -f /var/log/syslog | grep dhcp....
Albo swatch do sysloga, dopisany filtr i akcja do skryptu wynikowego.
Podejrzewam, że każdo z powyższych  rozwiązań, to byłoby połowa roboty,w porównaniu z Twoim skryptem.
Pozdro
;-)
Ostatnio edytowany przez Jacekalex (2012-02-20 01:12:15)
Offline