<?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 }