#!/bin/sh #---------------------------------------------------------------------------- # /srv/www/admin/status_dhcp-dnsmasq.cgi # # Creation: LanSpezi # Last Update: $Id$ #---------------------------------------------------------------------------- ## functions split_dhcp_host_data () { eval mac=`echo $line | cut -d "=" -f2 | cut -d "," -f1` if [ `echo $mac | cut -c 3` != ":" ] then mac="" fi eval ipaddr=`echo $line | cut -f2 -d ","` eval hostname=`echo $line | cut -f3 -d ","` eval lease_time=`echo $line | cut -d "," -f4` } split_dhcp_range_data () { id_net=$1 while read line do case $line in dhcp-range*static) range_type="static" range_start="-" range_end="-" lease_time="-" ;; dhcp-range*) range_type="dynamic" eval range_start=`echo $line | cut -d "," -f2` eval range_end=`echo $line | cut -d "," -f3` eval lease_time=`echo $line | cut -d "," -f4` ;; dhcp-option*,1,*) eval subnet_mask=`echo $line | cut -d "," -f3` ;; dhcp-option*,3,*) eval def_router=`echo $line | cut -d "," -f3` ;; dhcp-option*,28,*) eval broadcast=`echo $line | cut -d "," -f3` ;; dhcp-option*,6,*) eval dns_server=`echo $line | cut -d "," -f3` ;; dhcp-option*,15,*) eval dns_domain=`echo $line | cut -d "," -f3` ;; dhcp-option*,42,*) eval ntp_server=`echo $line | cut -d "," -f3` ;; esac done < /etc/dnsmasq.d/dhcp_range_NET${id_net}.conf } #main . /srv/www/include/cgi-helper . /var/run/dhcp_leases_dir LEASES_FILE="$DHCP_LEASES_DIR/dnsmasq.leases" if [ -f /tmp/template_dhcp.txt ] then rm /tmp/template_dhcp.txt fi check_rights "status" "change" case $FORM_action in Download|download) check_rights "status" "change" if [ -f /etc/dnsmasq.d/dhcp_hosts_NET*.wwwconf ] then http_header download "ctype=text/plain;filename=dhcp_hosts.txt" { echo "#" echo "# please copy needed host-data to your config/dns_dhcp.txt and replace x by correct nummbers" echo "#" echo "# do not forget to correct HOST_N" echo "#" } >> /tmp/template_dhcp.txt while read netid do if [ -f /etc/dnsmasq.d/dhcp_hosts_NET${netid}.wwwconf ] then while read line do { split_dhcp_host_data echo "HOST_x_NAME='$hostname'" echo "HOST_x_IP4='$ipaddr'" echo "HOST_x_MAC='$mac'" echo "" } >> /tmp/template_dhcp.txt done < /etc/dnsmasq.d/dhcp_hosts_NET${netid}.wwwconf fi done < /var/run/dhcp_range_net.list cat /tmp/template_dhcp.txt else ref="refresh=5;url=$myname?action=view" show_html_header "DHCP (Download DNS/DHCP-Vorlagendatei)" "${ref}" show_info "Download DNS/DHCP-Vorlagendatei" "Es wurden keine zur Laufzeit hinzugefügten DHCP-Host gefunden. Somit ist kein Download einer config-Vorlage möglich!" show_html_footer fi ;; "Hinzufügen"|add) check_rights "status" "change" ref="refresh=15;url=$myname?action=view" show_html_header "DHCP (Hinzufügen eines DHCP-Hosts)" "${ref}" #todo: # - check data and add to /etc/dnsmasq.d/dhcp_hosts${netid}.wwwconf adderror=0 #check for empty ip-field if [ "x$FORM_ip" == "x" ] then show_error "Fehler: keine IP-Adresse" "Es wurde keine IP-Adresse angegeben" echo "
" adderror=1 else #check for same IP in any config-file if grep -q ,$FORM_ip, /etc/dnsmasq.d/dhcp_hosts_NET* then show_error "Fehler: doppelte IP" "Die IP $FORM_ip ist bereits einem anderen Host zugeordnet" echo "
" adderror=1 else #check for valid ip-adress ipok=1 eval ip_okt1=`echo $FORM_ip | cut -d"." -f1` eval ip_okt2=`echo $FORM_ip | cut -d"." -f2` eval ip_okt3=`echo $FORM_ip | cut -d"." -f3` eval ip_okt4=`echo $FORM_ip | cut -d"." -f4` ipokt1=`expr $ip_okt1 + 1 - 1` ipokt2=`expr $ip_okt2 + 1 - 1` ipokt3=`expr $ip_okt3 + 1 - 1` ipokt4=`expr $ip_okt4 + 1 - 1` if [ $ipokt1 -ge 0 -a $ipokt1 -le 255 ]; then ipok_=1 else ipok=0 fi if [ $ipokt2 -ge 0 -a $ipokt2 -le 255 ]; then ipok_=1 else ipok=0 fi if [ $ipokt3 -ge 0 -a $ipokt3 -le 255 ]; then ipok_=1 else ipok=0 fi if [ $ipokt4 -ge 0 -a $ipokt4 -le 255 ]; then ipok_=1 else ipok=0 fi if [ $ipok == 0 ] then show_error "Fehler: ungültige IP" "Die IP $FORM_ip ist keine gültige IP-Adresse" echo "
" adderror=1 else FORM_ip=`echo "${ipokt1}.${ipokt2}.${ipokt3}.${ipokt4}"` split_dhcp_range_data $FORM_netid eval ip_bcast=`netcalc broadcast ${FORM_ip}:${subnet_mask}` eval net_network=`netcalc network ${broadcast}:${subnet_mask}` if [ "$ip_bcast" != "$broadcast" ] then show_error "Fehler: IP-Adresse" "Die IP '$FORM_ip' passt nicht zum Netz 'IP_NET_${FORM_netid}'" echo "
" adderror=1 fi # check if ip is bcast or netwok-adress if [ "${FORM_ip}" == "$broadcast" ] then show_error "Fehler: IP-Adresse" "Die IP '$FORM_ip' darf nicht gleich der Broadcast-Adresse des Netz 'IP_NET_${FORM_netid}' sein" echo "
" adderror=1 fi if [ "${FORM_ip}" == "$net_network" ] then show_error "Fehler: IP-Adresse" "Die IP '$FORM_ip' darf nicht gleich der Netz-Adresse des Netz 'IP_NET_${FORM_netid}' sein" echo "
" adderror=1 fi fi fi fi if [ "x$FORM_host" == "x" ] then show_error "Fehler: kein Hostname" "Es wurde kein Hostname angegeben" echo "
" adderror=1 else #check for same hostname in any config-file if grep -i -q ,$FORM_host, /etc/dnsmasq.d/dhcp_hosts_NET* then show_error "Fehler: doppelter Hostname" "Der Hostname '$FORM_host' ist bereits einem anderen Host zugeordnet" echo "
" adderror=1 fi fi if [ "x$FORM_mac" == "x" ] then show_error "Fehler: keine MAC-Adresse" "Es wurde keine MAC-Adresse angegeben" echo "
" adderror=1 else #check for same hostname in any config-file if grep -i -q $FORM_mac, /etc/dnsmasq.d/dhcp_hosts_NET* then show_error "Fehler: doppelte MAC-Adresse" "Die MAC-Adresse '$FORM_mac' ist bereits einem anderen Host zugeordnet" echo "
" adderror=1 else # 00 00 00 11 11 11 #check mac for correct format 12:45:78:01:34:67 macok=1 if ! echo $FORM_mac | grep -q -i '[0-9A-F]\{2\}\(:[0-9A-F]\{2\}\)\{5\}' then macok=0 fi if [ $macok == 0 ] then show_error "Fehler: Format MAC-Adresse" "Das Format der MAC-Adresse ist nicht korrekt!" echo "
" adderror=1 fi fi fi if [ "x$FORM_leasetime" == "x" ] then show_error "Fehler: keine Leasetime" "Es wurde keine Leasetime angegeben" echo "
" adderror=1 else if [ ! 0$FORM_leasetime -gt 120 ] then show_error "Fehler: Leasetime" "Die Leasetime '$FORM_leasetime' ist zu klein [min=120]" echo "
" adderror=1 fi fi ##check if ip or hostname has an entry in /etc/hosts.d/hosts.* if grep -q -i $FORM_ip /etc/hosts.d/hosts.* then eval hostsentry=`grep -i $FORM_ip /etc/hosts.d/hosts.* if ! echo $hostsentry | grep -q -i $FORM_host then show_error "Fehler: Hosts-Datei" "Für die IP 'FORM_ip' gibt es einen DNS-Eintrag - im DNS ist aber nicht der Hostname '$FORM_host' für diese IP hinterlegt" echo "
" adderror=1 fi fi if grep -q -i $FORM_host /etc/hosts.d/hosts.* then eval hostsentry=`grep -i $FORM_host /etc/hosts.d/hosts.* if ! echo $hostsentry | grep -q -i $FORM_ip then show_error "Fehler: Hosts-Datei" "Für den Hostname 'FORM_host' gibt es einen DNS-Eintrag - im DNS ist aber nicht die IP '$FORM_ip' für diesen Hostname hinterlegt" echo "
" adderror=1 fi fi # all checks done if [ $adderror == 1 ] then show_error "Fehler in den Daten" "Es wurde kein Host zur Konfiguration hinzugefügt. Bitte versuchen Sie es erneut!" echo "
" else # check if hostname or mac exist in lease-file dyn_dhcp_host=0 if grep -q -i " $FORM_host " $LEASES_FILE then dyn_dhcp_host=1 grep -v -i " $FORM_host " $LEASES_FILE > /tmp/new_lease.dhcp fi if grep -q -i " $FORM_mac " $LEASES_FILE then dyn_dhcp_host=1 grep -v -i " $FORM_mac " $LEASES_FILE > /tmp/new_lease.dhcp fi if [ $dyn_dhcp_host == 1 ] then show_info "Info: DHCP-Host" "Der Host '$FORM_host' mit der MAC '$FORM_mac' hat bisher eine IP aus der DHCP-Range benutzt!" cat /tmp/new_lease.dhcp > $LEASES_FILE rm /tmp/new_lease.dhcp fi # format of line to append of config-file # dhcp-host=00:01:01:01:01:01,192.168.6.1,testhost,86400,net:NET1 echo "dhcp-host=$FORM_mac,$FORM_ip,$FORM_host,$FORM_leasetime,net:NET$FORM_netid" >> /etc/dnsmasq.d/dhcp_hosts_NET$FORM_netid.wwwconf chown dns:dns /etc/dnsmasq.d/dhcp_hosts_NET${FORM_netid}.wwwconf chmod 600 /etc/dnsmasq.d/dhcp_hosts_NET${FORM_netid}.wwwconf #add entry to /etc/hosts.d/dhcp.hosts if needed if ! grep -q -i "$FORM_ip" /etc/hosts.d/hosts.* then echo "$FORM_ip $FORM_host" >> /etc/hosts.d/dhcp.hosts fi show_info "Hinzufügen eines DHCP-Hosts" "Der Host '$FORM_host' wurde zur Konfiguration hinzugefügt" echo "1" > /tmp/reload_dnsmasq.wwwflag fi show_html_footer ;; delete|Delete) check_rights "status" "change" ref="refresh=5;url=$myname?action=view" show_html_header "DHCP (Löschen eines DHCP-Hosts)" "${ref}" show_info "Löschen von DHCP-Hosts" "Der Host '$FORM_hostname' wird aus /etc/dnsmasq.d/dhcp_hosts_NET${FORM_net}.wwwconf gelöscht" echo "" if grep -q -i " $FORM_hostname " $LEASES_FILE then grep -v -i " $FORM_hostname " $LEASES_FILE > /tmp/new_lease.dhcp cat /tmp/new_lease.dhcp > $LEASES_FILE rm /tmp/new_lease.dhcp fi grep -v ",$FORM_hostname," /etc/dnsmasq.d/dhcp_hosts_NET${FORM_net}.wwwconf > /tmp/wwwdhcp.$$ set -- `ls -l /tmp/wwwdhcp.$$` if [ "$5" == "0" ] then rm /etc/dnsmasq.d/dhcp_hosts_NET${FORM_net}.wwwconf else mv /tmp/wwwdhcp.$$ /etc/dnsmasq.d/dhcp_hosts_NET${FORM_net}.wwwconf chown dns:dns /etc/dnsmasq.d/dhcp_hosts_NET${FORM_net}.wwwconf chmod 600 /etc/dnsmasq.d/dhcp_hosts_NET${FORM_net}.wwwconf fi rm /tmp/wwwdhcp.$$ #add remove entryr from /etc/hosts.d/dhcp.hosts if grep -q -i "$FORM_hostname" /etc/hosts.d/dhcp.hosts then grep -v -i "$FORM_hostname" /etc/hosts.d/dhcp.hosts > /tmp/wwwdhcphosts.$$ cat /tmp/wwwdhcphost.$$ > /etc/hosts.d/dhcp.hosts rm /tmp/wwwdhcphosts.$$ fi echo "1" > /tmp/reload_dnsmasq.wwwflag show_html_footer ;; *|view) if [ -f /tmp/reload_dnsmasq.wwwflag ] then ref="refresh=5;url=$myname?action=view" show_html_header "DHCP (Reload des DNS/DHCP-Servers)" "${ref}" rm /tmp/reload_dnsmasq.wwwflag killall -HUP dnsmasq show_info "Reload des DNS/DHCP-Servers" "Der DNS/DHCP-Server wurde neu gestartet" echo "
" else show_html_header "DHCP" "${ref}" fi . /var/run/dhcp_leases_dir LEASES_FILE="$DHCP_LEASES_DIR/dnsmasq.leases" #Sind überhaupt leases vorhanden? if [ ! -f $LEASES_FILE ]; then show_error "Fehler!" "Die Leasedatei $LEASES_FILE ist nicht vorhanden.
Bitte überprüfen Sie ob Sie den DHCP Server laufen haben." else if [ -s $LEASES_FILE ] then show_tab_header "DHCP-Leases: $LEASES_FILE" "no" echo "" echo "" datediff=`date +%z` datediff2=`expr $datediff "*" 36` while read line do set -f set -- `echo $line` time=$1 mac=$2 ip=$3 hostname=$4 set +f if [ $time -eq 0 ] then time2="niemals" else time=`expr $time "+" $datediff2` time2=`date -d "1970.1.1-0:0:$time" +%d.%m.%Y' '%H:%M:%S` fi echo "" done < $LEASES_FILE echo "
HostnameIP-AdresseMac-AdresseLäuft ab
[Datum Uhrzeit]
$hostname
$ip
$mac
$time2
" show_tab_footer else show_info "Information" "Es sind keine Leases in der Datei $LEASES_FILE vorhanden." fi fi if [ ! -f /etc/dnsmasq.d/dhcp_range_NET*.conf ] then show_info "Info:" "Es wurden keine DHCP-Ranges konfiguriert." else echo "
" show_tab_header "DHCP-Ranges" "no" echo "" echo "" echo "" echo "" echo "" echo "" echo "" echo "" echo "" echo "" echo "" echo "" echo "" echo "" while read netid do if [ -f /etc/dnsmasq.d/dhcp_range_NET${netid}.conf ] then split_dhcp_range_data $netid echo "" echo "" echo "" echo "" echo "" echo "" echo "" echo "" echo "" echo "" echo "" echo "" echo "" else echo "" echo "" echo "" echo "" echo "" echo "" echo "" echo "" echo "" echo "" echo "" echo "" echo "" fi done < /var/run/dhcp_range_net.list echo "
NetworkTypStartEndLeasetime [sec]SubnetmaskBroadcastDefaultrouterDNS-DomainDNS-ServerNTP-Server
   IP_NET_$netid   
$range_type
$range_start
$range_end
$lease_time
$subnet_mask
$broadcast
$def_router
$dns_domain
$dns_server
$ntp_server
   IP_NET_$netid   
No DHCP-Range
-
-
-
-
-
-
-
-
-
" show_tab_footer fi if [ ! -f /etc/dnsmasq.d/dhcp_hosts_NET*.conf ] then show_info "Info:" "Es wurden keine static DHCP-Hosts konfiguriert." else echo "
" show_tab_header "DHCP-Hosts" "no" echo "" while read netid do echo "" if [ -f /etc/dnsmasq.d/dhcp_hosts_NET${netid}.conf ] then anzahl=0 while read line do anzahl=`expr $anzahl "+" 1` done < /etc/dnsmasq.d/dhcp_hosts_NET${netid}.conf while read line do split_dhcp_host_data echo "" if [ $anzahl -ne 0 ] then echo "" anzahl=0 fi echo "" done < /etc/dnsmasq.d/dhcp_hosts_NET${netid}.conf fi # output hosts defened by Webinterface (future) if [ -f /etc/dnsmasq.d/dhcp_hosts_NET${netid}.wwwconf ] then anzahl=0 while read line do anzahl=`expr $anzahl "+" 1` done < /etc/dnsmasq.d/dhcp_hosts_NET${netid}.wwwconf while read line do split_dhcp_host_data echo "" if [ $anzahl -ne 0 ] then echo "" anzahl=0 fi echo "" echo "" done < /etc/dnsmasq.d/dhcp_hosts_NET${netid}.wwwconf fi echo "" echo "" echo "" echo "" echo "" echo "" echo "" echo "" echo "" echo "" #echo "" echo "" echo "" echo "" done < /var/run/dhcp_range_net.list echo "
NetworkHostnameIP-AdresseMAC-AdresseLeasetime [sec]Aktion
   IP_NET_$netid   
$hostname
$ipaddr
$mac
$lease_time
-
   IP_NET_$netid (added by webconf)   
$hostname
$ipaddr
$mac
$lease_time
\"Delete\"
   IP_NET_$netid (runtime add)     
" show_tab_footer echo "


Hinweis:
" echo "Zur Laufzeit angelegte DHCP-Hosts gehen bei einem Reboot verloren!
" echo "Die Daten können jedoch als Vorlage zum Einfügen in die Konfigurationsdatei \"config/dns_dhcp.txt\" herruntergeladen werden!

" echo '
' echo '' echo '

 ' fi show_html_footer ;; esac