Grzegorz Czerepak

Grzegorz Czerepak Student, Wyższa
Szkoła Technologii
Informatycznych w
Kato...

Temat: Skrypt wywoływany zdarzeniem

Hej mam pewien problem, potrzebowałbym wywołać skrypt po konkretnym zdarzeniu.
Konkretnie sytuacja wygląda tak: Mam postawiony serwer dhcp na debianie i chciałbym aby serwer po przydzieleniu użytkownikowi sieci adresu ip wykonał pewien skrypt.

Macie może jakieś pomysły ?

Temat: Skrypt wywoływany zdarzeniem

Grzegorz Czerepak:
Hej mam pewien problem, potrzebowałbym wywołać skrypt po konkretnym zdarzeniu.
Konkretnie sytuacja wygląda tak: Mam postawiony serwer dhcp na debianie i chciałbym aby serwer po przydzieleniu użytkownikowi sieci adresu ip wykonał pewien skrypt.

Macie może jakieś pomysły ?

Wow aż tak nisko nie grzebałem ale zobacz czy dhcpd nie emituje do systemu jakiś zdarzeń. Jeśli tak to możesz napisać swojego demona, który zarejestruje w systemie swój callback na zdarzenie systemowe pochodzące od dhcpd i z jego poziomu wywoła skrypt.

Drugie podejście opiera się na tym, że dhcpd wykorzystuje standardowy mechanizm pisania do logów a część demonlogów udostępnia mechanizmy powiadamiania o zmianie w logach.

To tak na szybko.
Marek Babik

Marek Babik Senior Software
Engineer

Temat: Skrypt wywoływany zdarzeniem

Może tak?


while true; do tail -f /var/log/daemon.log | awk '/DHCPACK/ {system("echo robię coś z " $8 " na " $10 )}'; done


edit: poprawiłem BBcodeMarek Babik edytował(a) ten post dnia 08.02.12 o godzinie 11:44
Maciej K.

Maciej K. DevOps Engineer

Temat: Skrypt wywoływany zdarzeniem

Z podręcznika dhcp-eval (http://linux.die.net/man/5/dhcp-eval):

execute (command-path [, data-expr1, ... data-exprN]);

The execute statement runs an external command. The first argument is a string literal containing the name or path of the command to run. The other arguments, if present, are either string literals or data- expressions which evaluate to text strings, to be passed as command-line arguments to the command.

execute is synchronous; the program will block until the external command being run has finished. Please note that lengthy program execution (for example, in an "on commit" in dhcpd.conf) may result in bad performance and timeouts. Only external applications with very short execution times are suitable for use.

Passing user-supplied data to an external application might be dangerous. Make sure the external application checks input buffers for validity. Non-printable ASCII characters will be converted into dhcpd.conf language octal escapes ("777"), make sure your external command handles them as such.

It is possible to use the execute statement in any context, not only on events. If you put it in a regular scope in the configuration file you will execute that command every time a scope is evaluated.Maciej K. edytował(a) ten post dnia 08.02.12 o godzinie 11:59
Grzegorz Czerepak

Grzegorz Czerepak Student, Wyższa
Szkoła Technologii
Informatycznych w
Kato...

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


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

Grzegorz Czerepak Student, Wyższa
Szkoła Technologii
Informatycznych w
Kato...

Temat: 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?

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



Wyślij zaproszenie do