<?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']) && $_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'];
                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');
            }
        } 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];
    $leaseTime = $arrRange[3];

    $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>
        <!-- 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"';
    }

    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" />';
    }
    ?>
    </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>
<?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><!-- /.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
}