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/.
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
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
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
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
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
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
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:
[url]http://forum.dug.net.pl/viewtopic.php?pid=151913#p151913[/url]
Pozdro
;-)
Ostatnio edytowany przez Jacekalex (2012-02-08 00:14:46)
Offline
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" . . . done
Offline
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)
Offline
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
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
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 done
Offline
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:
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)
Offline
Time (s) | Query |
---|---|
0.00012 | SET CHARSET latin2 |
0.00005 | SET NAMES latin2 |
0.00117 | 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='18.117.154.134' WHERE u.id=1 |
0.00088 | UPDATE punbb_online SET logged=1732493565 WHERE ident='18.117.154.134' |
0.00059 | SELECT * FROM punbb_online WHERE logged<1732493265 |
0.00075 | DELETE FROM punbb_online WHERE ident='185.65.134.138' |
0.00087 | SELECT topic_id FROM punbb_posts WHERE id=193616 |
0.00093 | SELECT id FROM punbb_posts WHERE topic_id=20607 ORDER BY posted |
0.00072 | 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.00006 | SELECT search_for, replace_with FROM punbb_censoring |
0.00100 | 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.00073 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=20607 |
Total query time: 0.00787 s |