mirror of
				https://github.com/billz/raspap-webgui.git
				synced 2025-03-01 10:31:47 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			326 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			326 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
| <?php
 | |
| 
 | |
| include_once('includes/status_messages.php');
 | |
| 
 | |
| /**
 | |
| *
 | |
| * Manage DHCP configuration
 | |
| *
 | |
| */
 | |
| function DisplayDHCPConfig()
 | |
| {
 | |
| 
 | |
|     $status = new StatusMessages();
 | |
|     if (isset($_POST['savedhcpdsettings'])) {
 | |
|         $errors = '';
 | |
|         define('IFNAMSIZ', 16);
 | |
|         if (!preg_match('/^[a-zA-Z0-9]+$/', $_POST['interface']) ||
 | |
|         strlen($_POST['interface']) >= IFNAMSIZ) {
 | |
|               $errors .= _('Invalid interface name.').'<br />'.PHP_EOL;
 | |
|         }
 | |
| 
 | |
|         if (!preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z/', $_POST['RangeStart']) &&
 | |
|         !empty($_POST['RangeStart'])) {  // allow ''/null ?
 | |
|               $errors .= _('Invalid DHCP range start.').'<br />'.PHP_EOL;
 | |
|         }
 | |
| 
 | |
|         if (!preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z/', $_POST['RangeEnd']) &&
 | |
|         !empty($_POST['RangeEnd'])) {  // allow ''/null ?
 | |
|               $errors .= _('Invalid DHCP range end.').'<br />'.PHP_EOL;
 | |
|         }
 | |
| 
 | |
|         if (!ctype_digit($_POST['RangeLeaseTime']) && $_POST['RangeLeaseTimeUnits'] !== 'infinite') {
 | |
|             $errors .= _('Invalid DHCP lease time, not a number.').'<br />'.PHP_EOL;
 | |
|         }
 | |
| 
 | |
|         if (!in_array($_POST['RangeLeaseTimeUnits'], array('m', 'h', 'd', 'infinite'))) {
 | |
|             $errors .= _('Unknown DHCP lease time unit.').'<br />'.PHP_EOL;
 | |
|         }
 | |
| 
 | |
|         $return = 1;
 | |
|         if (empty($errors)) {
 | |
|             $config = 'interface='.$_POST['interface'].PHP_EOL.
 | |
|                   'dhcp-range='.$_POST['RangeStart'].','.$_POST['RangeEnd'].
 | |
|                   ',255.255.255.0,';
 | |
|             if ($_POST['RangeLeaseTimeUnits'] !== 'infinite') {
 | |
|                 $config .= $_POST['RangeLeaseTime'];
 | |
|             }
 | |
| 
 | |
|             $config .= $_POST['RangeLeaseTimeUnits'].PHP_EOL;
 | |
| 
 | |
|             for ($i=0; $i < count($_POST["static_leases"]["mac"]); $i++) {
 | |
|                 $mac = trim($_POST["static_leases"]["mac"][$i]);
 | |
|                 $ip  = trim($_POST["static_leases"]["ip"][$i]);
 | |
|                 if ($mac != "" && $ip != "") {
 | |
|                     $config .= "dhcp-host=$mac,$ip".PHP_EOL;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             file_put_contents("/tmp/dhcpddata", $config);
 | |
|             system('sudo cp /tmp/dhcpddata '.RASPI_DNSMASQ_CONFIG, $return);
 | |
|         } else {
 | |
|             $status->addMessage($errors, 'danger');
 | |
|         }
 | |
| 
 | |
|         if ($return == 0) {
 | |
|             $status->addMessage('Dnsmasq configuration updated successfully', 'success');
 | |
|         } else {
 | |
|             $status->addMessage('Dnsmasq configuration failed to be updated.', 'danger');
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     exec('pidof dnsmasq | wc -l', $dnsmasq);
 | |
|     $dnsmasq_state = ($dnsmasq[0] > 0);
 | |
| 
 | |
|     if (isset($_POST['startdhcpd'])) {
 | |
|         if ($dnsmasq_state) {
 | |
|             $status->addMessage('dnsmasq already running', 'info');
 | |
|         } else {
 | |
|             exec('sudo /etc/init.d/dnsmasq start', $dnsmasq, $return);
 | |
|             if ($return == 0) {
 | |
|                 $status->addMessage('Successfully started dnsmasq', 'success');
 | |
|                 $dnsmasq_state = true;
 | |
|             } else {
 | |
|                 $status->addMessage('Failed to start dnsmasq', 'danger');
 | |
|             }
 | |
|         }
 | |
|     } elseif (isset($_POST['stopdhcpd'])) {
 | |
|         if ($dnsmasq_state) {
 | |
|             exec('sudo /etc/init.d/dnsmasq stop', $dnsmasq, $return);
 | |
|             if ($return == 0) {
 | |
|                 $status->addMessage('Successfully stopped dnsmasq', 'success');
 | |
|                 $dnsmasq_state = false;
 | |
|             } else {
 | |
|                 $status->addMessage('Failed to stop dnsmasq', 'danger');
 | |
|             }
 | |
|         } else {
 | |
|             $status->addMessage('dnsmasq already stopped', 'info');
 | |
|         }
 | |
|     } else {
 | |
|         if ($dnsmasq_state) {
 | |
|             $status->addMessage('Dnsmasq is running', 'success');
 | |
|         } else {
 | |
|             $status->addMessage('Dnsmasq is not running', 'warning');
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     exec('cat '. RASPI_DNSMASQ_CONFIG, $return);
 | |
|     $conf = ParseConfig($return);
 | |
|     $arrRange = explode(",", $conf['dhcp-range']);
 | |
|     $RangeStart = $arrRange[0];
 | |
|     $RangeEnd = $arrRange[1];
 | |
|     $RangeMask = $arrRange[2];
 | |
|     $leaseTime = $arrRange[3];
 | |
|     $dhcpHost = $conf["dhcp-host"];
 | |
|     $dhcpHost = empty($dhcpHost) ? [] : $dhcpHost;
 | |
|     $dhcpHost = is_array($dhcpHost) ? $dhcpHost : [ $dhcpHost ];
 | |
| 
 | |
|     $hselected = '';
 | |
|     $mselected = '';
 | |
|     $dselected = '';
 | |
|     $infiniteselected = '';
 | |
|     preg_match('/([0-9]*)([a-z])/i', $leaseTime, $arrRangeLeaseTime);
 | |
|     if ($leaseTime === 'infinite') {
 | |
|         $infiniteselected = ' selected="selected"';
 | |
|     } else {
 | |
|         switch ($arrRangeLeaseTime[2]) {
 | |
|             case 'h':
 | |
|                 $hselected = ' selected="selected"';
 | |
|                 break;
 | |
|             case 'm':
 | |
|                 $mselected = ' selected="selected"';
 | |
|                 break;
 | |
|             case 'd':
 | |
|                 $dselected = ' selected="selected"';
 | |
|                 break;
 | |
|         }
 | |
|     }
 | |
| 
 | |
| ?>
 | |
|   <div class="row">
 | |
|   <div class="col-lg-12">
 | |
|       <div class="panel panel-primary">
 | |
|       <div class="panel-heading"><i class="fa fa-exchange fa-fw"></i> <?php echo _("Configure DHCP"); ?></div>
 | |
|         <!-- /.panel-heading -->
 | |
|         <div class="panel-body">
 | |
|         <p><?php $status->showMessages(); ?></p>
 | |
|         <form method="POST" action="?page=dhcpd_conf" class="js-dhcp-settings-form">
 | |
|         <?php echo CSRFTokenFieldTag() ?>
 | |
|         <!-- Nav tabs -->
 | |
|             <ul class="nav nav-tabs">
 | |
|                 <li class="active"><a href="#server-settings" data-toggle="tab"><?php echo _("Server settings"); ?></a>
 | |
|                 </li>
 | |
|                 <li><a href="#static-leases" data-toggle="tab"><?php echo _("Static Leases") ?></a></li>
 | |
|                 <li><a href="#client-list" data-toggle="tab"><?php echo _("Client list"); ?></a>
 | |
|                 </li>
 | |
|             </ul>
 | |
|         <!-- Tab panes -->
 | |
|         <div class="tab-content">
 | |
|     <div class="tab-pane fade in active" id="server-settings">
 | |
|     <h4>DHCP server settings</h4>
 | |
|     <div class="row">
 | |
|       <div class="form-group col-md-4">
 | |
|         <label for="code">Interface</label>
 | |
|         <select class="form-control" name="interface">
 | |
| <?php
 | |
|         exec("ip -o link show | awk -F': ' '{print $2}'", $interfaces);
 | |
| 
 | |
| foreach ($interfaces as $inet) {
 | |
|     $select = '';
 | |
|     if ($inet === $conf['interface']) {
 | |
|         $select = ' selected="selected"';
 | |
|     }
 | |
| 
 | |
|     echo '        <option value="'.htmlspecialchars($inet, ENT_QUOTES).'"'.
 | |
|     $select.'>'.htmlspecialchars($inet, ENT_QUOTES).'</option>' , PHP_EOL;
 | |
| }
 | |
| ?>
 | |
|         </select>
 | |
|       </div>
 | |
|     </div>
 | |
|     <div class="row">
 | |
|       <div class="form-group col-md-4">
 | |
|         <label for="code"><?php echo _("Starting IP Address"); ?></label>
 | |
|         <input type="text" class="form-control"name="RangeStart" value="<?php echo htmlspecialchars($RangeStart, ENT_QUOTES); ?>" />
 | |
|       </div>
 | |
|     </div>
 | |
| 
 | |
|     <div class="row">
 | |
|       <div class="form-group col-md-4">
 | |
|         <label for="code"><?php echo _("Ending IP Address"); ?></label>
 | |
|         <input type="text" class="form-control" name="RangeEnd" value="<?php echo htmlspecialchars($RangeEnd, ENT_QUOTES); ?>" />
 | |
|       </div>
 | |
|     </div>
 | |
| 
 | |
|     <div class="row">
 | |
|       <div class="form-group col-xs-2 col-sm-2">
 | |
|         <label for="code"><?php echo _("Lease Time"); ?></label>
 | |
|         <input type="text" class="form-control" name="RangeLeaseTime" value="<?php echo htmlspecialchars($arrRangeLeaseTime[1], ENT_QUOTES); ?>" />
 | |
|       </div>
 | |
|       <div class="col-xs-2 col-sm-2">
 | |
|         <label for="code"><?php echo _("Interval"); ?></label>
 | |
|         <select name="RangeLeaseTimeUnits" class="form-control" >
 | |
|           <option value="m"<?php echo $mselected; ?>><?php echo _("Minute(s)"); ?></option>
 | |
|           <option value="h"<?php echo $hselected; ?>><?php echo _("Hour(s)"); ?></option>
 | |
|           <option value="d"<?php echo $dselected; ?>><?php echo _("Day(s)"); ?></option>
 | |
|           <option value="infinite"<?php echo $infiniteselected; ?>><?php echo _("Infinite"); ?></option>
 | |
|         </select> 
 | |
|       </div>
 | |
|     </div>
 | |
| 
 | |
|     <input type="submit" class="btn btn-outline btn-primary" value="<?php echo _("Save settings"); ?>" name="savedhcpdsettings" />
 | |
|     <?php
 | |
| 
 | |
|     if ($dnsmasq_state) {
 | |
|         echo '<input type="submit" class="btn btn-warning" value="' . _("Stop dnsmasq") . '" name="stopdhcpd" />';
 | |
|     } else {
 | |
|         echo'<input type="submit" class="btn btn-success" value="' .  _("Start dnsmasq") . '" name="startdhcpd" />';
 | |
|     }
 | |
|     ?>
 | |
|     </div><!-- /.tab-pane -->
 | |
| 
 | |
|     <div class="tab-pane fade in" id="client-list">
 | |
|     <h4>Client list</h4>
 | |
|     <div class="col-lg-12">
 | |
|       <div class="panel panel-default">
 | |
|       <div class="panel-heading"><?php echo _("Active DHCP leases"); ?></div>
 | |
|       <!-- /.panel-heading -->
 | |
|       <div class="panel-body">
 | |
|         <div class="table-responsive">
 | |
|           <table class="table table-hover">
 | |
|             <thead>
 | |
|               <tr>
 | |
|                 <th><?php echo _("Expire time"); ?></th>
 | |
|                 <th><?php echo _("MAC Address"); ?></th>
 | |
|                 <th><?php echo _("IP Address"); ?></th>
 | |
|                 <th><?php echo _("Host name"); ?></th>
 | |
|                 <th><?php echo _("Client ID"); ?></th>
 | |
|               </tr>
 | |
|             </thead>
 | |
|             <tbody>
 | |
| <?php
 | |
| exec('cat ' . RASPI_DNSMASQ_LEASES, $leases);
 | |
| foreach ($leases as $lease) {
 | |
|     echo '              <tr>'.PHP_EOL;
 | |
|     $lease_items = explode(' ', $lease);
 | |
|     foreach ($lease_items as $lease_item) {
 | |
|         echo '                <td>'.htmlspecialchars($lease_item, ENT_QUOTES).'</td>'.PHP_EOL;
 | |
|     }
 | |
|     echo '              </tr>'.PHP_EOL;
 | |
| };
 | |
| ?>
 | |
|             </tbody>
 | |
|           </table>
 | |
|         </div><!-- /.table-responsive -->
 | |
|       </div><!-- /.panel-body -->
 | |
|       </div><!-- /.panel -->
 | |
|     </div><!-- /.col-lg-6 -->
 | |
|     </div><!-- /.tab-pane -->
 | |
| 
 | |
|     <div class="tab-pane fade in" id="static-leases">
 | |
|         <div class="dhcp-static-leases js-dhcp-static-lease-container">
 | |
|             <?php foreach ($dhcpHost as $host): ?>
 | |
|             <?php list($mac, $ip) = array_map("trim", explode(",", $host)); ?>
 | |
|             <div class="row dhcp-static-lease-row js-dhcp-static-lease-row">
 | |
|                 <div class="col-md-5 col-xs-5">
 | |
|                     <input type="text" name="static_leases[mac][]" value="<?php echo htmlspecialchars($mac, ENT_QUOTES) ?>" placeholder="<?php echo _("MAC address") ?>" class="form-control">
 | |
|                 </div>
 | |
|                 <div class="col-md-5 col-xs-4">
 | |
|                     <input type="text" name="static_leases[ip][]" value="<?php echo htmlspecialchars($ip, ENT_QUOTES) ?>" placeholder="<?php echo _("IP address") ?>" class="form-control">
 | |
|                 </div>
 | |
|                 <div class="col-md-2 col-xs-3">
 | |
|                     <button type="button" class="btn btn-danger js-remove-dhcp-static-lease"><?php echo _("Remove") ?></button>
 | |
|                 </div>
 | |
|             </div>
 | |
|             <?php endforeach ?>
 | |
|         </div>
 | |
| 
 | |
|         <h5><?php echo _("Add static DHCP lease") ?></h5>
 | |
|         <div class="row dhcp-static-lease-row js-new-dhcp-static-lease">
 | |
|             <div class="col-md-5 col-xs-5">
 | |
|                 <input type="text" name="mac" value="" placeholder="<?php echo _("MAC address") ?>" class="form-control" autofocus="autofocus">
 | |
|             </div>
 | |
|             <div class="col-md-5 col-xs-4">
 | |
|                 <input type="text" name="ip" value="" placeholder="<?php echo _("IP address") ?>" class="form-control">
 | |
|             </div>
 | |
|             <div class="col-md-2 col-xs-3">
 | |
|                 <button type="button" class="btn btn-success js-add-dhcp-static-lease"><?php echo _("Add") ?></button>
 | |
|             </div>
 | |
|         </div>
 | |
| 
 | |
|         <template id="js-dhcp-static-lease-row">
 | |
|             <div class="row dhcp-static-lease-row js-dhcp-static-lease-row">
 | |
|                 <div class="col-md-5 col-xs-5">
 | |
|                     <input type="text" name="static_leases[mac][]" value="{{ mac }}" placeholder="<?php echo _("MAC address") ?>" class="form-control">
 | |
|                 </div>
 | |
|                 <div class="col-md-5 col-xs-4">
 | |
|                     <input type="text" name="static_leases[ip][]" value="{{ ip }}" placeholder="<?php echo _("IP address") ?>" class="form-control">
 | |
|                 </div>
 | |
|                 <div class="col-md-2 col-xs-3">
 | |
|                     <button type="button" class="btn btn-warning js-remove-dhcp-static-lease"><?php echo _("Remove") ?></button>
 | |
|                 </div>
 | |
|             </div>
 | |
|         </template>
 | |
| 
 | |
|         <input type="submit" class="btn btn-outline btn-primary" value="<?php echo _("Save settings"); ?>" name="savedhcpdsettings" />
 | |
|         <?php
 | |
| 
 | |
|         if ($dnsmasq_state) {
 | |
|             echo '<input type="submit" class="btn btn-warning" value="' . _("Stop dnsmasq") . '" name="stopdhcpd" />';
 | |
|         } else {
 | |
|             echo'<input type="submit" class="btn btn-success" value="' .  _("Start dnsmasq") . '" name="startdhcpd" />';
 | |
|         }
 | |
|         ?>
 | |
|     </div>
 | |
| 
 | |
|     </div><!-- /.tab-content -->
 | |
|     </form>
 | |
|     </div><!-- ./ Panel body -->
 | |
|     <div class="panel-footer"> <?php echo _("Information provided by Dnsmasq"); ?></div>
 | |
|         </div><!-- /.panel-primary -->
 | |
|     </div><!-- /.col-lg-12 -->
 | |
|   </div><!-- /.row -->
 | |
| <?php
 | |
| }
 | |
| 
 |