mirror of
				https://github.com/billz/raspap-webgui.git
				synced 2025-03-01 10:31:47 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			260 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			260 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
<?php
 | 
						|
 | 
						|
include_once( 'includes/status_messages.php' );
 | 
						|
 | 
						|
/**
 | 
						|
*
 | 
						|
* Manage DHCP configuration
 | 
						|
*
 | 
						|
*/
 | 
						|
function DisplayDHCPConfig() {
 | 
						|
 | 
						|
  $status = new StatusMessages();
 | 
						|
  if( isset( $_POST['savedhcpdsettings'] ) ) {
 | 
						|
    if (CSRFValidate()) {
 | 
						|
        $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'])) {
 | 
						|
            $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,'.$_POST['RangeLeaseTime'].$_POST['RangeLeaseTimeUnits'];
 | 
						|
            exec('echo "'.$config.'" > /tmp/dhcpddata', $temp);
 | 
						|
            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');
 | 
						|
        }
 | 
						|
    } else {
 | 
						|
      error_log('CSRF violation');
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  exec( 'pidof dnsmasq | wc -l',$dnsmasq );
 | 
						|
  $dnsmasq_state = ($dnsmasq[0] > 0);
 | 
						|
 | 
						|
  if( isset( $_POST['startdhcpd'] ) ) {
 | 
						|
    if (CSRFValidate()) {
 | 
						|
      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');
 | 
						|
        }
 | 
						|
      }
 | 
						|
    } else {
 | 
						|
      error_log('CSRF violation');
 | 
						|
    }
 | 
						|
  } elseif( isset($_POST['stopdhcpd'] ) ) {
 | 
						|
    if (CSRFValidate()) {
 | 
						|
      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 {
 | 
						|
      error_log('CSRF violation');
 | 
						|
    }
 | 
						|
  } 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];
 | 
						|
  preg_match( '/([0-9]*)([a-z])/i', $arrRange[3], $arrRangeLeaseTime );
 | 
						|
 | 
						|
  $hselected = '';
 | 
						|
  $mselected = '';
 | 
						|
  $dselected = '';
 | 
						|
 | 
						|
  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>
 | 
						|
        <!-- 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="#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>
 | 
						|
    <form method="POST" action="?page=dhcpd_conf">
 | 
						|
    <?php CSRFToken() ?>
 | 
						|
    <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"';  // FIXED use xhtml valid attribute
 | 
						|
          }
 | 
						|
 | 
						|
          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; ?>>Minute(s)</option>
 | 
						|
            <option value="h" <?php echo $hselected; ?>>Hour(s)</option>
 | 
						|
            <option value="d" <?php echo $dselected; ?>>Day(s)</option>
 | 
						|
            <option value="infinite">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" />';
 | 
						|
    }
 | 
						|
?>
 | 
						|
    </form>
 | 
						|
    </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>
 | 
						|
              <tr>
 | 
						|
<?php
 | 
						|
exec( 'cat ' . RASPI_DNSMASQ_LEASES, $leases );
 | 
						|
foreach( $leases as $lease ) {
 | 
						|
    $lease_items = explode(' ', $lease);
 | 
						|
    foreach( $lease_items as $lease_item ) {
 | 
						|
        echo '                  <td>'.htmlspecialchars($lease_item, ENT_QUOTES).'</td>'.PHP_EOL;
 | 
						|
    }
 | 
						|
 | 
						|
    echo '                </tr>'.PHP_EOL;
 | 
						|
};
 | 
						|
 | 
						|
?>
 | 
						|
              </tr>
 | 
						|
            </tbody>
 | 
						|
          </table>
 | 
						|
        </div><!-- /.table-responsive -->
 | 
						|
      </div><!-- /.panel-body -->
 | 
						|
      </div><!-- /.panel -->
 | 
						|
    </div><!-- /.col-lg-6 -->
 | 
						|
    </div><!-- /.tab-pane -->
 | 
						|
    </div><!-- /.tab-content -->
 | 
						|
    </div><!-- ./ Panel body -->
 | 
						|
    <div class="panel-footer"> <?php echo _("Information provided by Dnsmasq"); ?></div>
 | 
						|
        </div><!-- /.panel-primary -->
 | 
						|
    </div><!-- /.col-lg-12 -->
 | 
						|
  </div><!-- /.row -->
 | 
						|
<?php
 | 
						|
}
 | 
						|
 |