]> git.ipfire.org Git - ipfire-2.x.git/blobdiff - html/cgi-bin/dhcp.cgi
Merge remote-tracking branch 'ms/ipsec-subnets' into next
[ipfire-2.x.git] / html / cgi-bin / dhcp.cgi
index 87134a4690ed2674ee616829ae86312a0ffcb4d9..a22bcd4ebd641d632f56f19cd849ae8b320312b0 100644 (file)
@@ -1,29 +1,29 @@
 #!/usr/bin/perl
-#
-# SmoothWall CGIs
-#
-# This code is distributed under the terms of the GPL
-#
-# (c) The SmoothWall Team
-#
-# Copyright (C) 01-02-2002 Graham Smith <grhm@grhm.co.uk>
-#              - Fixed DHCP Leases added
-#
-# $Id: dhcp.cgi,v 1.14.2.81 2006/01/20 12:05:29 franck78 Exp $
-#
-#  Franck      -rewrite for two or more interface
-#  nov/2004    -check range is in correct subnet
-#              -add NTP option
-#              -add display sorting of actives leases
-#  dec/2004    -add comment field to fixed leases
-# 
-# to do : choose a correct format for displaying dates
-#
+###############################################################################
+#                                                                             #
+# IPFire.org - A linux based firewall                                         #
+# Copyright (C) 2007  Michael Tremer & Christian Schmidt                      #
+#                                                                             #
+# This program is free software: you can redistribute it and/or modify        #
+# it under the terms of the GNU General Public License as published by        #
+# the Free Software Foundation, either version 3 of the License, or           #
+# (at your option) any later version.                                         #
+#                                                                             #
+# This program is distributed in the hope that it will be useful,             #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of              #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               #
+# GNU General Public License for more details.                                #
+#                                                                             #
+# You should have received a copy of the GNU General Public License           #
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.       #
+#                                                                             #
+###############################################################################
+
 use strict;
 
 # enable only the following on debugging purpose
-use warnings;
-use CGI::Carp 'fatalsToBrowser';
+#use warnings;
+#use CGI::Carp 'fatalsToBrowser';
 
 require '/var/ipfire/general-functions.pl';
 require "${General::swroot}/lang.pl";
@@ -44,12 +44,14 @@ our $filename3 = "${General::swroot}/dhcp/advoptions-list"; # Describe the allow
 my $errormessage = '';
 my $warnNTPmessage = '';
 my @nosaved=();
+my %color = ();
 
 #Basic syntax allowed for new Option definition. Not implemented: RECORDS & array of RECORDS 
 our $OptionTypes = 'boolean|((un)?signed )?integer (8|16|32)|ip-address|text|string|encapsulate \w+|array of ip-address';
 
 &Header::showhttpheaders();
-our @ITFs=('GREEN','BLUE');
+our @ITFs=('GREEN');
+if (&Header::blue_used()){push(@ITFs,'BLUE');}
 
 #Settings1 for the first screen box
 foreach my $itf (@ITFs) {
@@ -101,6 +103,7 @@ foreach my $itf (@ITFs) {
 &General::readhash("${General::swroot}/ethernet/settings", \%netsettings);
 &General::readhash("${General::swroot}/main/settings", \%mainsettings);
 &General::readhash("${General::swroot}/time/settings", \%timesettings);
+&General::readhash("/srv/web/ipfire/html/themes/".$mainsettings{'THEME'}."/include/colors.txt", \%color);
 
 #Get GUI values
 &Header::getcgihash(\%dhcpsettings);
@@ -241,7 +244,7 @@ if ($dhcpsettings{'ACTION'} eq $Lang::tr{'save'}) {
        } # enabled
     }#loop interface verify
 
-    map (delete ($dhcpsettings{$_}) ,@nosaved,'ACTION','KEY1','KEY2'); # Must not be saved 
+    map (delete ($dhcpsettings{$_}) ,@nosaved,'ACTION','KEY1','KEY2','q');     # Must not be saved
     &General::writehash($setting, \%dhcpsettings);             # Save good settings
     $dhcpsettings{'ACTION'} = $Lang::tr{'save'};               # create an 'ACTION'
     map ($dhcpsettings{$_} = '',@nosaved,'KEY1','KEY2');       # and reinit vars to empty
@@ -264,7 +267,7 @@ if ($ENV{'QUERY_STRING'} =~ /^FETHER|^FIPADDR/ ) {
        $newsort.=$Rev;
     }
     $dhcpsettings{'SORT_FLEASELIST'}=$newsort;
-    map (delete ($dhcpsettings{$_}) ,@nosaved,'ACTION','KEY1','KEY2'); # Must never be saved 
+    map (delete ($dhcpsettings{$_}) ,@nosaved,'ACTION','KEY1','KEY2', 'q');    # Must never be saved
     &General::writehash($setting, \%dhcpsettings);
     &sortcurrent2;
     $dhcpsettings{'ACTION'} = 'SORT';                  # create an 'ACTION'
@@ -435,6 +438,9 @@ if ($dhcpsettings{'ACTION'} eq $Lang::tr{'add'}.'2') {
        if ($dhcpsettings{'KEY2'} eq '') { #add or edit ?
            unshift (@current2, "$dhcpsettings{'FIX_MAC'},$dhcpsettings{'FIX_ADDR'},$dhcpsettings{'FIX_ENABLED'},$dhcpsettings{'FIX_NEXTADDR'},$dhcpsettings{'FIX_FILENAME'},$dhcpsettings{'FIX_ROOTPATH'},$dhcpsettings{'FIX_REMARK'}\n");
            &General::log($Lang::tr{'fixed ip lease added'});
+
+           # Enter edit mode
+           $dhcpsettings{'KEY2'} = $key;
        } else {
            @current2[$dhcpsettings{'KEY2'}] = "$dhcpsettings{'FIX_MAC'},$dhcpsettings{'FIX_ADDR'},$dhcpsettings{'FIX_ENABLED'},$dhcpsettings{'FIX_NEXTADDR'},$dhcpsettings{'FIX_FILENAME'},$dhcpsettings{'FIX_ROOTPATH'},$dhcpsettings{'FIX_REMARK'}\n";
            $dhcpsettings{'KEY2'} = '';       # End edit mode
@@ -546,34 +552,34 @@ print <<END
     <td width='25%' class='base'>$Lang::tr{'end address'}&nbsp;<img src='/blob.gif' alt='*' /></td>
     <td width='25%'><input type='text' name='END_ADDR_${itf}' value='$dhcpsettings{"END_ADDR_${itf}"}' /></td>
 </tr><tr>
-    <td class='base'>$Lang::tr{'default lease time'}</td>
+    <td class='base'>$Lang::tr{'default lease time'}&nbsp;<img src='/blob.gif' alt='*' /></td>
     <td><input type='text' name='DEFAULT_LEASE_TIME_${itf}' value='$dhcpsettings{"DEFAULT_LEASE_TIME_${itf}"}' /></td>
-    <td class='base'>$Lang::tr{'max lease time'}</td>
+    <td class='base'>$Lang::tr{'max lease time'}&nbsp;<img src='/blob.gif' alt='*' /></td>
     <td><input type='text' name='MAX_LEASE_TIME_${itf}' value='$dhcpsettings{"MAX_LEASE_TIME_${itf}"}' /></td>
 </tr><tr>
-    <td class='base'>$Lang::tr{'domain name suffix'}&nbsp;<img src='/blob.gif' alt='*' /></td>
+    <td class='base'>$Lang::tr{'domain name suffix'}</td>
     <td><input type='text' name='DOMAIN_NAME_${itf}' value='$dhcpsettings{"DOMAIN_NAME_${itf}"}' /></td>
     <td>$Lang::tr{'dhcp allow bootp'}:</td>
     <td><input type='checkbox' name='ENABLEBOOTP_${itf}' $checked{'ENABLEBOOTP'}{'on'} /></td>
 </tr><tr>
-    <td class='base'>$Lang::tr{'primary dns'}</td>
+    <td class='base'>$Lang::tr{'primary dns'}&nbsp;<img src='/blob.gif' alt='*' /></td>
     <td><input type='text' name='DNS1_${itf}' value='$dhcpsettings{"DNS1_${itf}"}' /></td>
-    <td class='base'>$Lang::tr{'secondary dns'}&nbsp;<img src='/blob.gif' alt='*' /></td>
+    <td class='base'>$Lang::tr{'secondary dns'}</td>
     <td><input type='text' name='DNS2_${itf}' value='$dhcpsettings{"DNS2_${itf}"}' /></td>
 </tr><tr>
-    <td class='base'>$Lang::tr{'primary ntp server'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
+    <td class='base'>$Lang::tr{'primary ntp server'}:</td>
     <td><input type='text' name='NTP1_${itf}' value='$dhcpsettings{"NTP1_${itf}"}' /></td>
-    <td class='base'>$Lang::tr{'secondary ntp server'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
+    <td class='base'>$Lang::tr{'secondary ntp server'}:</td>
     <td><input type='text' name='NTP2_${itf}' value='$dhcpsettings{"NTP2_${itf}"}' /></td>
 </tr><tr>
-    <td class='base'>$Lang::tr{'primary wins server address'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
+    <td class='base'>$Lang::tr{'primary wins server address'}:</td>
     <td><input type='text' name='WINS1_${itf}' value='$dhcpsettings{"WINS1_${itf}"}' /></td>
-    <td class='base'>$Lang::tr{'secondary wins server address'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
+    <td class='base'>$Lang::tr{'secondary wins server address'}:</td>
     <td><input type='text' name='WINS2_${itf}' value='$dhcpsettings{"WINS2_${itf}"}' /></td>
 </tr><tr>
-    <td class='base'>next-server:&nbsp;<img src='/blob.gif' alt='*' /></td>
+    <td class='base'>next-server:</td>
     <td><input type='text' name='NEXT_${itf}' value='$dhcpsettings{"NEXT_${itf}"}' /></td>
-    <td class='base'>filename:&nbsp;<img src='/blob.gif' alt='*' /></td>
+    <td class='base'>filename:</td>
     <td><input type='text' name='FILE_${itf}' value='$dhcpsettings{"FILE_${itf}"}' /></td>
 </tr>
 </table>
@@ -585,10 +591,9 @@ END
 print <<END
 <table width='100%'>
 <tr>
-    <td class='base' width='25%'><img src='/blob.gif' align='top' alt='*' />&nbsp;$Lang::tr{'this field may be blank'}</td>
+    <td class='base' width='25%'><img src='/blob.gif' align='top' alt='*' />&nbsp;$Lang::tr{'required field'}</td>
     <td class='base' width='30%'>$warnNTPmessage</td>
-    <td width='40%' align='center'><input type='submit' name='ACTION' value='$Lang::tr{'save'}' /></td>
-    <td width='5%' align='right'>&nbsp;</td>
+    <td width='40%' align='right'><input type='submit' name='ACTION' value='$Lang::tr{'save'}' /></td>
 </tr>
 </table>
 </form>
@@ -620,13 +625,13 @@ if ($opt ne '') {
 }
 print <<END
 <tr>
-    <td class='base'>$Lang::tr{'dhcp advopt name'}:</td>
+    <td class='base'>$Lang::tr{'dhcp advopt name'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
     <td><input type='text' name='ADVOPT_NAME' value='$dhcpsettings{'ADVOPT_NAME'}' size='18' /></td>
-    <td class='base'>$Lang::tr{'dhcp advopt value'}:</td>
+    <td class='base'>$Lang::tr{'dhcp advopt value'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
     <td><input type='text' name='ADVOPT_DATA' value='$dhcpsettings{'ADVOPT_DATA'}' size='40' /></td>
 </tr>$opt<tr>
     <td class='base'>$Lang::tr{'enabled'}</td><td><input type='checkbox' name='ADVOPT_ENABLED' $checked{'ADVOPT_ENABLED'}{'on'} /></td>
-    <td class='base'>$Lang::tr{'dhcp advopt scope'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
+    <td class='base'>$Lang::tr{'dhcp advopt scope'}:</td>
     <td>
 END
 ;
@@ -647,8 +652,8 @@ print <<END
 <hr />
 <table width='100%'>
 <tr>
-    <td class='base' width='50%'><img src='/blob.gif' align='top' alt='*' />&nbsp;$Lang::tr{'dhcp advopt scope help'}</td>
-    <td width='50%' align='center'>
+    <td class='base' width='50%'>$Lang::tr{'dhcp advopt scope help'}</td>
+    <td width='50%' align='right'>
     <input type='hidden' name='ACTION' value='$Lang::tr{'add'}1' />
     <input type='submit' name='SUBMIT' value='$buttontext' />
     <input type='submit' name='SUBMIT' value='$Lang::tr{'dhcp advopt help'}' />
@@ -720,9 +725,9 @@ foreach my $line (@current1) {
     if ($dhcpsettings{'KEY1'} eq $key) {
        print "<tr bgcolor='${Header::colouryellow}'>";
     } elsif ($key % 2) {
-       print "<tr bgcolor='${Header::table2colour}'>";
+       print "<tr bgcolor='$color{'color22'}'>";
     } else {
-       print "<tr bgcolor='${Header::table1colour}'>"; 
+       print "<tr bgcolor='$color{'color20'}'>"; 
     }
 
     print <<END
@@ -825,30 +830,30 @@ if ($dhcpsettings{'KEY2'} ne '') {
 }
 print <<END
 <tr>
-    <td class='base'>$Lang::tr{'mac address'}:</td>
+    <td class='base'>$Lang::tr{'mac address'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
     <td><input type='text' name='FIX_MAC' value='$dhcpsettings{'FIX_MAC'}' size='18' /></td>
-    <td class='base'>$Lang::tr{'ip address'}:</td>
+    <td class='base'>$Lang::tr{'ip address'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
     <td><input type='text' name='FIX_ADDR' value='$dhcpsettings{'FIX_ADDR'}' size='18' /></td>
-    <td class='base'>$Lang::tr{'remark'}:&nbsp;<img src='/blob.gif' alt='*' /></td>
+    <td class='base'>$Lang::tr{'remark'}:</td>
     <td><input type='text' name='FIX_REMARK' value='$dhcpsettings{'FIX_REMARK'}' size='18' /></td>
 </tr><tr>
     <td class='base'>$Lang::tr{'enabled'}</td><td><input type='checkbox' name='FIX_ENABLED' $checked{'FIX_ENABLED'}{'on'} /></td>
 </tr><tr>
     <td colspan = '3'><b>$Lang::tr{'dhcp bootp pxe data'}</b></td>
 </tr><tr>
-    <td class='base'>next-server:&nbsp;<img src='/blob.gif' alt='*' /></td>
+    <td class='base'>next-server:</td>
     <td><input type='text' name='FIX_NEXTADDR' value='$dhcpsettings{'FIX_NEXTADDR'}' size='18' /></td>
-    <td class='base'>filename:&nbsp;<img src='/blob.gif' alt='*' /></td>
+    <td class='base'>filename:</td>
     <td><input type='text' name='FIX_FILENAME' value='$dhcpsettings{'FIX_FILENAME'}' size='18' /></td>
-    <td class='base'>root path:&nbsp;<img src='/blob.gif' alt='*' /></td>
+    <td class='base'>root path:</td>
     <td><input type='text' name='FIX_ROOTPATH' value='$dhcpsettings{'FIX_ROOTPATH'}' size='18' /></td>
 </tr>
 </table>
 <hr />
 <table width='100%'>
 <tr>
-    <td class='base' width='50%'><img src='/blob.gif' align='top' alt='*' />&nbsp;$Lang::tr{'this field may be blank'}</td>
-    <td width='50%' align='center'>
+    <td class='base' width='50%'><img src='/blob.gif' align='top' alt='*' />&nbsp;$Lang::tr{'required field'}</td>
+    <td width='50%' align='right'>
        <input type='hidden' name='ACTION' value='$Lang::tr{'add'}2' />
        <input type='submit' name='SUBMIT' value='$buttontext' />
        <input type='hidden' name='KEY2' value='$dhcpsettings{'KEY2'}' /></td>
@@ -859,17 +864,35 @@ END
 ;
 #Edited line number (KEY2) passed until cleared by 'save' or 'remove' or 'new sort order'
 
+# Search for static leases
+my $search_query = $dhcpsettings{'q'};
+
+if (scalar @current2 >= 10) {
+       print <<END;
+               <form method="POST" action="#search">
+                       <a name="search"></a>
+                       <table width='100%'>
+                               <tr>
+                                       <td>
+                                               <input type="text" name="q" value="$search_query">
+                                               <input type="submit" value="$Lang::tr{'search'}">
+                                       </td>
+                               </tr>
+                       </table>
+               </form>
+END
+}
+
 print <<END
-<hr />
-<table width='100%'>
+<table width='100%' class='tbl'>
 <tr>
-    <td width='20%' align='center'><a href='$ENV{'SCRIPT_NAME'}?FETHER'><b>$Lang::tr{'mac address'}</b></a></td>
-    <td width='20%' align='center'><a href='$ENV{'SCRIPT_NAME'}?FIPADDR'><b>$Lang::tr{'ip address'}</b></a></td>
-    <td width='15%' align='center'><b>$Lang::tr{'remark'}</b></td>
-    <td width='15%' class='boldbase' align='center'><b>next-server</b></td>
-    <td width='15%' class='boldbase' align='center'><b>filename</b></td>
-    <td width='15%' class='boldbase' align='center'><b>root path</b></td>
-    <td colspan='3' class='boldbase' align='center'><b>$Lang::tr{'action'}</b></td>
+    <th width='20%' align='center'><a href='$ENV{'SCRIPT_NAME'}?FETHER'><b>$Lang::tr{'mac address'}</b></a></th>
+    <th width='20%' align='center'><a href='$ENV{'SCRIPT_NAME'}?FIPADDR'><b>$Lang::tr{'ip address'}</b></a></th>
+    <th width='15%' align='center'><b>$Lang::tr{'remark'}</b></th>
+    <th width='15%' class='boldbase' align='center'><b>next-server</b></th>
+    <th width='15%' class='boldbase' align='center'><b>filename</b></th>
+    <th width='15%' class='boldbase' align='center'><b>root path</b></th>
+    <th colspan='3' class='boldbase' align='center'><b>$Lang::tr{'action'}</b></th>
 </tr>
 END
 ;
@@ -901,6 +924,7 @@ foreach my $line (@current2) {
 }
 
 $key = 0;
+my $col="";
 foreach my $line (@current2) {
     my $gif = '';
     my $gdesc = '';
@@ -915,12 +939,23 @@ foreach my $line (@current2) {
        $gdesc = $Lang::tr{'click to enable'}; 
     }
 
+    # Skip all entries that do not match the search query
+    if ($search_query ne "") {
+       if (!grep(/$search_query/, @temp)) {
+               $key++;
+               next;
+       }
+    }
+
     if ($dhcpsettings{'KEY2'} eq $key) {
-       print "<tr bgcolor='${Header::colouryellow}'>";
+       print "<tr>";
+       $col="bgcolor='${Header::colouryellow}'";
     } elsif ($key % 2) {
-       print "<tr bgcolor='${Header::table2colour}'>";
+       print "<tr>";
+       $col="bgcolor='$color{'color20'}'";
     } else {
-       print "<tr bgcolor='${Header::table1colour}'>"; 
+       print "<tr>";
+       $col="bgcolor='$color{'color22'}'";
     }
     my $TAG0 = '';
     my $TAG1 = '';
@@ -940,14 +975,14 @@ foreach my $line (@current2) {
     }
 
     print <<END
-<td align='center'>$TAG2$temp[0]$TAG3</td>
-<td align='center' $TAG4>$TAG0$temp[1]$TAG1</td>
-<td align='center'>$temp[6]&nbsp;</td>
-<td align='center'>$temp[3]&nbsp;</td>
-<td align='center'>$temp[4]&nbsp;</td>
-<td align='center'>$temp[5]&nbsp;</td>
-
-<td align='center'>
+<td align='center' $col>$TAG2$temp[0]$TAG3</td>
+<td align='center' $col $TAG4>$TAG0$temp[1]$TAG1</td>
+<td align='center' $col>$temp[6]&nbsp;</td>
+<td align='center' $col>$temp[3]&nbsp;</td>
+<td align='center' $col>$temp[4]&nbsp;</td>
+<td align='center' $col>$temp[5]&nbsp;</td>
+
+<td align='center' $col>
 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
 <input type='hidden' name='ACTION' value='$Lang::tr{'toggle enable disable'}2' />
 <input type='image' name='$Lang::tr{'toggle enable disable'}' src='/images/$gif' alt='$gdesc' title='$gdesc' />
@@ -955,7 +990,7 @@ foreach my $line (@current2) {
 </form>
 </td>
 
-<td align='center'>
+<td align='center' $col>
 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
 <input type='hidden' name='ACTION' value='$Lang::tr{'edit'}2' />
 <input type='image' name='$Lang::tr{'edit'}' src='/images/edit.gif' alt='$Lang::tr{'edit'}' title='$Lang::tr{'edit'}' />
@@ -963,7 +998,7 @@ foreach my $line (@current2) {
 </form>
 </td>
 
-<td align='center'>
+<td align='center' $col>
 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
 <input type='hidden' name='ACTION' value='$Lang::tr{'remove'}2' />
 <input type='image' name='$Lang::tr{'remove'}' src='/images/delete.gif' alt='$Lang::tr{'remove'}' title='$Lang::tr{'remove'}' />
@@ -1011,33 +1046,6 @@ END
 
 &Header::closebox();
 
-&Header::openbox('100%', 'left', $Lang::tr{'arp table entries'});
-my @ip = qx(/sbin/ip neigh show | awk '{print \$1}');
-my @mac = qx(/sbin/ip neigh show | awk '{print \$5}');
-
-print <<END
-<hr />
-<table width='100%'>
-<tr>
-<td width='40%'><b>$Lang::tr{'ip address'}</b></td><td width='40%'><b>$Lang::tr{'mac address'}</b></td><td width='20%'>Optionen</td>
-</tr>
-END
-;
-my $i=0;
-
-foreach my $ip(@ip)
-{
- print"<tr><form method='post' action='$ENV{'SCRIPT_NAME'}'><td><input type='hidden' name='FIX_ADDR' value='$ip' />$ip</td>";
- print"<td><input type='hidden' name='FIX_MAC' value='@mac[$i]' />@mac[$i]</td>";
- print"<td><input type='hidden' name='ACTION' value='$Lang::tr{'add'}2' /><input type='submit' name='SUBMIT' value='$buttontext' /></td></form></tr>";
-}
-
-
-print"</table>";
-
-&Header::closebox();
-
-
 foreach my $itf (@ITFs) {
     if ($dhcpsettings{"ENABLE_${itf}"} eq 'on') {
        # display leases with a list of actions to do with the global select checkbox.
@@ -1223,8 +1231,11 @@ sub buildconf {
            $key++;
        }
     }
+    print FILE "include \"${General::swroot}/dhcp/dhcpd.conf.local\";\n";
     close FILE;
-    system '/usr/local/bin/restartdhcp';
+    if ( $dhcpsettings{"ENABLE_GREEN"} eq 'on' || $dhcpsettings{"ENABLE_BLUE"} eq 'on' ) {system '/usr/local/bin/dhcpctrl enable >/dev/null 2>&1';}
+    else {system '/usr/local/bin/dhcpctrl disable >/dev/null 2>&1';}
+    system '/usr/local/bin/dhcpctrl restart >/dev/null 2>&1';
 }
 
 #