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

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




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

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...;)








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

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...;)








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

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...;)








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





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



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

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...;)








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