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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2012-02-07 18:41:43

  czeri - Użytkownik

czeri
Użytkownik
Zarejestrowany: 2011-07-08

Skrypt wywoływany zdarzeniem

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

 

#2  2012-02-07 18:52:31

  ethanak - Użytkownik

ethanak
Użytkownik
Skąd: Ungwenor
Zarejestrowany: 2010-07-19
Serwis

Re: Skrypt wywoływany zdarzeniem

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.


Nim mechaniczne larum zagrasz mi, kanalio,
głosząc nadejście Javy - śmiertelnego wroga!
[i]Zespół Adwokacki Dyskrecja[/i]

Offline

 

#3  2012-02-07 18:53:08

  P@blo - Nadworny matematyk

P@blo
Nadworny matematyk
Skąd: Wrocław v Jasło
Zarejestrowany: 2010-11-11

Re: Skrypt wywoływany zdarzeniem

Może coś w stylu ifconfig | grep ADRES... Potem jeśli jest IP to robisz coś dalej? Chyba by musiał działać jako deamon...


[tt]ThinkPadX220i
| Procesor: Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz |
|  Debian: sid   |   Arch: amd64   |   Sound: alsa   |
| No DE | WM: DWM  |  DM: .bash_profile  |  BIOS+MBR |[/tt]

Offline

 

#4  2012-02-07 19:03:04

  czeri - Użytkownik

czeri
Użytkownik
Zarejestrowany: 2011-07-08

Re: Skrypt wywoływany zdarzeniem

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

 

#5  2012-02-07 20:28:37

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/urandom
Zarejestrowany: 2008-01-07

Re: Skrypt wywoływany zdarzeniem

Czyli monitorowal stan pliku

Kod:

/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)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#6  2012-02-07 22:43:44

  czeri - Użytkownik

czeri
Użytkownik
Zarejestrowany: 2011-07-08

Re: Skrypt wywoływany zdarzeniem

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

 

#7  2012-02-08 00:10:59

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/urandom
Zarejestrowany: 2008-01-07

Re: Skrypt wywoływany zdarzeniem

Kawałek przykładowego kodu (funkcja) z perla:

Kod:

   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:
[url]http://forum.dug.net.pl/viewtopic.php?pid=151913#p151913[/url]

Pozdro
;-)

Ostatnio edytowany przez Jacekalex (2012-02-08 00:14:46)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#8  2012-02-16 15:35:17

  czeri - Użytkownik

czeri
Użytkownik
Zarejestrowany: 2011-07-08

Re: Skrypt wywoływany zdarzeniem

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ść.

Kod:

#!/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"         
        .
        .
        .

        done

Offline

 

#9  2012-02-16 16:18:26

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/urandom
Zarejestrowany: 2008-01-07

Re: Skrypt wywoływany zdarzeniem

W bashu zatrudniłbym osobiście  program swatch, jest w końcu od takiej zabawy.
Tu masz [url=http://en.gentoo-wiki.com/wiki/Swatch]przykład[/url] (dosć typowy).

jeśli natomiast skrypt czyni swoją powinnośc, to ok.

Pozdro
;-)

Ostatnio edytowany przez Jacekalex (2012-02-16 16:18:43)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#10  2012-02-16 18:16:49

  qluk - Pan inż. Cyc

qluk
Pan inż. Cyc
Skąd: Katowice
Zarejestrowany: 2006-05-22

Re: Skrypt wywoływany zdarzeniem

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

 

#11  2012-02-16 20:02:43

  bobycob - Członek z Ramienia

bobycob
Członek z Ramienia
Skąd: Wrocław
Zarejestrowany: 2007-08-15

Re: Skrypt wywoływany zdarzeniem

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

 

#12  2012-02-19 23:44:07

  czeri - Użytkownik

czeri
Użytkownik
Zarejestrowany: 2011-07-08

Re: Skrypt wywoływany zdarzeniem

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?


Kod:

#!/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

done

Offline

 

#13  2012-02-20 01:08:04

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/urandom
Zarejestrowany: 2008-01-07

Re: Skrypt wywoływany zdarzeniem

A nie prościej naskrobać demona, który słucha na gnieździe, sokecie lub kolejce fifo., a potem w [b]rsyslog[/b] 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:

Kod:

tail -f /var/log/syslog | grep dhcp....

Albo [b]swatch[/b] 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)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)

[ Generated in 0.013 seconds, 11 queries executed ]

Informacje debugowania

Time (s) Query
0.00017 SET CHARSET latin2
0.00007 SET NAMES latin2
0.00135 SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.138.134.221' WHERE u.id=1
0.00103 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.138.134.221', 1732225612)
0.00067 SELECT * FROM punbb_online WHERE logged<1732225312
0.00075 SELECT topic_id FROM punbb_posts WHERE id=195241
0.00238 SELECT id FROM punbb_posts WHERE topic_id=20607 ORDER BY posted
0.00112 SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=20607 AND t.moved_to IS NULL
0.00005 SELECT search_for, replace_with FROM punbb_censoring
0.00098 SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=20607 ORDER BY p.id LIMIT 0,25
0.00098 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=20607
Total query time: 0.00955 s