Files
web/settings.php

1230 lines
72 KiB
PHP

<?php /*
* Pi-hole: A black hole for Internet advertisements
* (c) 2017 Pi-hole, LLC (https://pi-hole.net)
* Network-wide ad blocking via your own hardware.
*
* This file is copyright under the latest version of the EUPL.
* Please see LICENSE file for your rights under this license. */
require "scripts/pi-hole/php/header.php";
require "scripts/pi-hole/php/savesettings.php";
// Reread ini file as things might have been changed
$setupVars = parse_ini_file("/etc/pihole/setupVars.conf");
function command_exist($cmd)
{
return !empty(shell_exec(sprintf("which %s", escapeshellarg($cmd))));
}
?>
<style type="text/css">
.tooltip-inner {
max-width: none;
white-space: nowrap;
}
@-webkit-keyframes Pulse {
from {
color: #630030;
-webkit-text-shadow: 0 0 9px #333;
}
50% {
color: #e33100;
-webkit-text-shadow: 0 0 18px #e33100;
}
to {
color: #630030;
-webkit-text-shadow: 0 0 9px #333;
}
}
p.lookatme {
-webkit-animation-name: Pulse;
-webkit-animation-duration: 2s;
-webkit-animation-iteration-count: infinite;
}
</style>
<?php // Check if ad lists should be updated after saving ...
if (isset($_POST["submit"])) {
if ($_POST["submit"] == "saveupdate") {
// If that is the case -> refresh to the gravity page and start updating immediately
?>
<meta http-equiv="refresh" content="1;url=gravity.php?go">
<?php }
} ?>
<?php if (isset($debug)) { ?>
<div id="alDebug" class="alert alert-warning alert-dismissible fade in" role="alert">
<button type="button" class="close" data-hide="alert" aria-label="Close"><span aria-hidden="true">&times;</span>
</button>
<h4><i class="icon fa fa-warning"></i> Debug</h4>
<pre><?php print_r($_POST); ?></pre>
</div>
<?php } ?>
<?php if (strlen($success) > 0) { ?>
<div id="alInfo" class="alert alert-info alert-dismissible fade in" role="alert">
<button type="button" class="close" data-hide="alert" aria-label="Close"><span aria-hidden="true">&times;</span>
</button>
<h4><i class="icon fa fa-info"></i> Info</h4>
<?php echo $success; ?>
</div>
<?php } ?>
<?php if (strlen($error) > 0) { ?>
<div id="alError" class="alert alert-danger alert-dismissible fade in" role="alert">
<button type="button" class="close" data-hide="alert" aria-label="Close"><span aria-hidden="true">&times;</span>
</button>
<h4><i class="icon fa fa-ban"></i> Error</h4>
<?php echo $error; ?>
</div>
<?php } ?>
<?php
// Networking
if (isset($setupVars["PIHOLE_INTERFACE"])) {
$piHoleInterface = $setupVars["PIHOLE_INTERFACE"];
} else {
$piHoleInterface = "unknown";
}
if (isset($setupVars["IPV4_ADDRESS"])) {
$piHoleIPv4 = $setupVars["IPV4_ADDRESS"];
} else {
$piHoleIPv4 = "unknown";
}
$IPv6connectivity = false;
if (isset($setupVars["IPV6_ADDRESS"])) {
$piHoleIPv6 = $setupVars["IPV6_ADDRESS"];
sscanf($piHoleIPv6, "%2[0-9a-f]", $hexstr);
if (strlen($hexstr) == 2) {
// Convert HEX string to number
$hex = hexdec($hexstr);
// Global Unicast Address (2000::/3, RFC 4291)
$GUA = (($hex & 0x70) === 0x20);
// Unique Local Address (fc00::/7, RFC 4193)
$ULA = (($hex & 0xfe) === 0xfc);
if ($GUA || $ULA) {
// Scope global address detected
$IPv6connectivity = true;
}
}
} else {
$piHoleIPv6 = "unknown";
}
$hostname = trim(file_get_contents("/etc/hostname"), "\x00..\x1F");
?>
<?php
// DNS settings
$DNSservers = [];
$DNSactive = [];
$i = 1;
while (isset($setupVars["PIHOLE_DNS_" . $i])) {
if (isinserverlist($setupVars["PIHOLE_DNS_" . $i])) {
array_push($DNSactive, $setupVars["PIHOLE_DNS_" . $i]);
} elseif (strpos($setupVars["PIHOLE_DNS_" . $i], ".")) {
if (!isset($custom1)) {
$custom1 = $setupVars["PIHOLE_DNS_" . $i];
} else {
$custom2 = $setupVars["PIHOLE_DNS_" . $i];
}
} elseif (strpos($setupVars["PIHOLE_DNS_" . $i], ":")) {
if (!isset($custom3)) {
$custom3 = $setupVars["PIHOLE_DNS_" . $i];
} else {
$custom4 = $setupVars["PIHOLE_DNS_" . $i];
}
}
$i++;
}
if (isset($setupVars["DNS_FQDN_REQUIRED"])) {
if ($setupVars["DNS_FQDN_REQUIRED"]) {
$DNSrequiresFQDN = true;
} else {
$DNSrequiresFQDN = false;
}
} else {
$DNSrequiresFQDN = true;
}
if (isset($setupVars["DNS_BOGUS_PRIV"])) {
if ($setupVars["DNS_BOGUS_PRIV"]) {
$DNSbogusPriv = true;
} else {
$DNSbogusPriv = false;
}
} else {
$DNSbogusPriv = true;
}
if (isset($setupVars["DNSSEC"])) {
if ($setupVars["DNSSEC"]) {
$DNSSEC = true;
} else {
$DNSSEC = false;
}
} else {
$DNSSEC = false;
}
if (isset($setupVars["DNSMASQ_LISTENING"])) {
if ($setupVars["DNSMASQ_LISTENING"] === "single") {
$DNSinterface = "single";
} elseif ($setupVars["DNSMASQ_LISTENING"] === "all") {
$DNSinterface = "all";
} else {
$DNSinterface = "local";
}
} else {
$DNSinterface = "single";
}
?>
<?php
// Query logging
if (isset($setupVars["QUERY_LOGGING"])) {
if ($setupVars["QUERY_LOGGING"] == 1) {
$piHoleLogging = true;
} else {
$piHoleLogging = false;
}
} else {
$piHoleLogging = true;
}
?>
<?php
// Excluded domains in API Query Log call
if (isset($setupVars["API_EXCLUDE_DOMAINS"])) {
$excludedDomains = explode(",", $setupVars["API_EXCLUDE_DOMAINS"]);
} else {
$excludedDomains = [];
}
// Exluded clients in API Query Log call
if (isset($setupVars["API_EXCLUDE_CLIENTS"])) {
$excludedClients = explode(",", $setupVars["API_EXCLUDE_CLIENTS"]);
} else {
$excludedClients = [];
}
// Exluded clients
if (isset($setupVars["API_QUERY_LOG_SHOW"])) {
$queryLog = $setupVars["API_QUERY_LOG_SHOW"];
} else {
$queryLog = "all";
}
// Privacy Mode
if (isset($setupVars["API_PRIVACY_MODE"])) {
$privacyMode = $setupVars["API_PRIVACY_MODE"];
} else {
$privacyMode = false;
}
?>
<div class="row justify-content-md-center">
<div class="col-md-12">
<div class="nav-tabs-custom">
<ul class="nav nav-tabs">
<li class="active"><a data-toggle="tab" href="#blocklists">Block Lists</a></li>
<li><a data-toggle="tab" href="#dns">DNS</a></li>
<li><a data-toggle="tab" href="#piholedhcp">DHCP</a></li>
<li><a data-toggle="tab" href="#api">API</a></li>
<li><a data-toggle="tab" href="#web">Web Interface</a></li>
<li><a data-toggle="tab" href="#teleporter">Teleporter</a></li>
<li><a data-toggle="tab" href="#sysadmin">System</a></li>
</ul>
<div class="tab-content">
<!-- ######################################################### Blocklists ######################################################### -->
<div id="blocklists" class="tab-pane fade in active">
<div class="box">
<div class="box-header with-border">
<h3 class="box-title">Lists used to generate Pi-hole's Gravity</h3>
</div>
<div class="box-body">
<form role="form" method="post">
<div class="row">
<div class="col-md-12">
<table class="table table-striped">
<thead>
<tr>
<th>Enabled</th>
<th>List</th>
<th>Delete</th>
<td></td>
</tr>
</thead>
<tbody>
<?php foreach ($adlist as $key => $value) { ?>
<div class="form-group">
<tr>
<td>
<div class="checkbox">
<label style="word-break: break-word;">
<input type="checkbox"
name="adlist-enable-<?php echo $key; ?>"
<?php if ($value[0]){ ?>checked<?php } ?>>
</label>
</div>
<td>
<a href="<?php echo htmlentities($value[1]); ?>"
target="_new" id="adlist-text-<?php echo $key; ?>"><?php echo htmlentities($value[1]); ?></a>
</td>
<td>
<input type="checkbox" name="adlist-del-<?php echo $key; ?>"
hidden>
<br>
<button class="btn btn-danger btn-xs"
id="adlist-btn-<?php echo $key; ?>">
<span class="glyphicon glyphicon-trash"></span>
</button>
</td>
</tr>
</div>
<?php } ?>
</tbody>
</table>
<div class="form-group">
<textarea name="newuserlists" class="form-control" rows="1"
placeholder="Enter one URL per line to add new ad lists"></textarea>
</div>
<input type="hidden" name="field" value="adlists">
<input type="hidden" name="token" value="<?php echo $token ?>">
<button type="submit" class="btn btn-primary" name="submit" value="save" id="blockinglistsave">Save
</button>
<button type="submit" class="btn btn-primary pull-right" name="submit" id="blockinglistsaveupdate"
value="saveupdate">
Save and Update
</button>
</div>
</div>
</form>
</div>
</div>
</div>
<!-- ######################################################### DHCP ######################################################### -->
<div id="piholedhcp" class="tab-pane fade">
<?php
// Pi-hole DHCP server
if (isset($setupVars["DHCP_ACTIVE"])) {
if ($setupVars["DHCP_ACTIVE"] == 1) {
$DHCP = true;
} else {
$DHCP = false;
}
// Read setings from config file
$DHCPstart = $setupVars["DHCP_START"];
$DHCPend = $setupVars["DHCP_END"];
$DHCProuter = $setupVars["DHCP_ROUTER"];
// This setting has been added later, we have to check if it exists
if (isset($setupVars["DHCP_LEASETIME"])) {
$DHCPleasetime = $setupVars["DHCP_LEASETIME"];
if (strlen($DHCPleasetime) < 1) {
// Fallback if empty string
$DHCPleasetime = 24;
}
} else {
$DHCPleasetime = 24;
}
if (isset($setupVars["DHCP_IPv6"])) {
$DHCPIPv6 = $setupVars["DHCP_IPv6"];
} else {
$DHCPIPv6 = false;
}
} else {
$DHCP = false;
// Try to guess initial settings
if ($piHoleIPv4 !== "unknown") {
$DHCPdomain = explode(".", $piHoleIPv4);
$DHCPstart = $DHCPdomain[0] . "." . $DHCPdomain[1] . "." . $DHCPdomain[2] . ".201";
$DHCPend = $DHCPdomain[0] . "." . $DHCPdomain[1] . "." . $DHCPdomain[2] . ".251";
$DHCProuter = $DHCPdomain[0] . "." . $DHCPdomain[1] . "." . $DHCPdomain[2] . ".1";
} else {
$DHCPstart = "";
$DHCPend = "";
$DHCProuter = "";
}
$DHCPleasetime = 24;
$DHCPIPv6 = false;
}
if (isset($setupVars["PIHOLE_DOMAIN"])) {
$piHoleDomain = $setupVars["PIHOLE_DOMAIN"];
} else {
$piHoleDomain = "local";
}
?>
<div class="row">
<!--DHCP Settings Box-->
<div class="col-md-6">
<div class="box box-warning">
<div class="box-header with-border">
<h3 class="box-title">DHCP Settings</h3>
</div>
<div class="box-body">
<div role="form" method="post">
<div class="row">
<div class="col-md-12">
<div class="form-group">
<div class="checkbox"><label><input type="checkbox" name="active"
<?php if ($DHCP){ ?>checked<?php } ?>
id="DHCPchk"> DHCP server
enabled</label></div>
</div>
<p id="dhcpnotice" <?php if (!$DHCP){ ?>hidden<?php } ?>>Make sure your
router's DHCP
server is disabled when using the Pi-hole DHCP server!</p>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<label>Range of IP addresses to hand out</label>
</div>
<div class="col-xs-6">
<div class="form-group">
<div class="input-group">
<div class="input-group-addon">From</div>
<input type="text" class="form-control DHCPgroup" name="from"
data-inputmask="'alias': 'ip'" data-mask
value="<?php echo $DHCPstart; ?>"
<?php if (!$DHCP){ ?>disabled<?php } ?>>
</div>
</div>
</div>
<div class="col-xs-6">
<div class="form-group">
<div class="input-group">
<div class="input-group-addon">To</div>
<input type="text" class="form-control DHCPgroup" name="to"
data-inputmask="'alias': 'ip'" data-mask
value="<?php echo $DHCPend; ?>"
<?php if (!$DHCP){ ?>disabled<?php } ?>>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<label>Router (gateway) IP address</label>
<div class="form-group">
<div class="input-group">
<div class="input-group-addon">Router</div>
<input type="text" class="form-control DHCPgroup" name="router"
data-inputmask="'alias': 'ip'" data-mask
value="<?php echo $DHCProuter; ?>"
<?php if (!$DHCP){ ?>disabled<?php } ?>>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!--Advanced DHCP Settings Box-->
<div class="col-md-6">
<div class="col-md-12">
<div class="box box-warning">
<div class="box-header with-border">
<h3 class="box-title">Advanced DHCP settings</h3>
</div>
<div class="box-body">
<div class="col-md-12">
<label>Pi-hole domain name</label>
<div class="form-group">
<div class="input-group">
<div class="input-group-addon">Domain</div>
<input type="text" class="form-control DHCPgroup" name="domain"
value="<?php echo $piHoleDomain; ?>"
<?php if (!$DHCP){ ?>disabled<?php } ?>>
</div>
</div>
</div>
<div class="col-md-12">
<label>DHCP lease time</label>
<div class="form-group">
<div class="input-group">
<div class="input-group-addon">Lease time in hours</div>
<input type="text" class="form-control DHCPgroup"
name="leasetime"
id="leasetime" value="<?php echo $DHCPleasetime; ?>"
data-inputmask="'mask': '9', 'repeat': 7, 'greedy' : false"
data-mask <?php if (!$DHCP){ ?>disabled<?php } ?>>
</div>
</div>
<p>Hint: 0 = infinite, 24 = one day, 168 = one week, 744 = one month,
8760 =
one year</p>
</div>
<div class="col-md-12">
<div class="form-group">
<div class="checkbox"><label><input type="checkbox" name="useIPv6"
<?php if ($DHCPIPv6){ ?>checked<?php } ?>
class="DHCPgroup"
<?php if (!$DHCP){ ?>disabled<?php } ?>>
Enable IPv6 support (SLAAC + RA)</label></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!--DHCP Leases Box-->
<div class="row">
<?php
$dhcp_leases = array();
if ($DHCP) {
// Read leases file
$leasesfile = true;
$dhcpleases = @fopen('/etc/pihole/dhcp.leases', 'r');
if (!is_resource($dhcpleases))
$leasesfile = false;
function convertseconds($argument)
{
$seconds = round($argument);
if ($seconds < 60) {
return sprintf('%ds', $seconds);
} elseif ($seconds < 3600) {
return sprintf('%dm %ds', ($seconds / 60), ($seconds % 60));
} elseif ($seconds < 86400) {
return sprintf('%dh %dm %ds', ($seconds / 3600 % 24), ($seconds / 60 % 60), ($seconds % 60));
} else {
return sprintf('%dd %dh %dm %ds', ($seconds / 86400), ($seconds / 3600 % 24), ($seconds / 60 % 60), ($seconds % 60));
}
}
while (!feof($dhcpleases) && $leasesfile) {
$line = explode(" ", trim(fgets($dhcpleases)));
if (count($line) == 5) {
$counter = intval($line[0]);
if ($counter == 0) {
$time = "Infinite";
} elseif ($counter <= 315360000) // 10 years in seconds
{
$time = convertseconds($counter);
} else // Assume time stamp
{
$time = convertseconds($counter - time());
}
if (strpos($line[2], ':') !== false) {
// IPv6 address
$type = 6;
} else {
// IPv4 lease
$type = 4;
}
$host = $line[3];
if ($host == "*") {
$host = "<i>unknown</i>";
}
$clid = $line[4];
if ($clid == "*") {
$clid = "<i>unknown</i>";
}
array_push($dhcp_leases, ["TIME" => $time, "hwaddr" => strtoupper($line[1]), "IP" => $line[2], "host" => $host, "clid" => $clid, "type" => $type]);
}
}
}
readStaticLeasesFile();
?>
<div class="col-md-12">
<div class="box box-warning">
<div class="box-header with-border">
<h3 class="box-title">DHCP leases</h3>
</div>
<div class="box-body">
<div clas="row">
<div class="col-md-12">
<label>Currently active DHCP leases</label>
<table id="DHCPLeasesTable"
class="table table-striped table-bordered dt-responsive nowrap"
cellspacing="0" width="100%">
<thead>
<tr>
<th>MAC address</th>
<th>IP address</th>
<th>Hostname</th>
<td></td>
</tr>
</thead>
<tbody>
<?php foreach ($dhcp_leases as $lease) { ?>
<tr data-placement="auto" data-container="body"
data-toggle="tooltip"
title="Lease type: IPv<?php echo $lease["type"]; ?><br/>Remaining lease time: <?php echo $lease["TIME"]; ?><br/>DHCP UID: <?php echo $lease["clid"]; ?>">
<td id="MAC"><?php echo $lease["hwaddr"]; ?></td>
<td id="IP"><?php echo $lease["IP"]; ?></td>
<td id="HOST"><?php echo $lease["host"]; ?></td>
<td>
<button class="btn btn-warning btn-xs" type="button"
id="button"
data-static="alert"><span
class="glyphicon glyphicon-copy"></span>
</button>
</td></tr><?php } ?>
</tbody>
</table>
<br>
</div>
<div class="col-md-12">
<label>Static DHCP leases configuration</label>
<table id="DHCPStaticLeasesTable"
class="table table-striped table-bordered dt-responsive nowrap"
cellspacing="0" width="100%">
<thead>
<tr>
<th>MAC address</th>
<th>IP address</th>
<th>Hostname</th>
<td></td>
</tr>
</thead>
<tbody>
<?php foreach ($dhcp_static_leases as $lease) { ?>
<tr>
<td><?php echo $lease["hwaddr"]; ?></td>
<td><?php echo $lease["IP"]; ?></td>
<td><?php echo $lease["host"]; ?></td>
<td><?php if (strlen($lease["hwaddr"]) > 0) { ?>
<button class="btn btn-danger btn-xs" type="submit"
name="removestatic"
value="<?php echo $lease["hwaddr"]; ?>"><span
class="glyphicon glyphicon-trash"></span>
</button><?php } ?></td></tr><?php } ?>
</tbody>
<tfoot style="display: table-row-group">
<tr>
<td><input type="text" name="AddMAC"></td>
<td><input type="text" name="AddIP"></td>
<td><input type="text" name="AddHostname" value=""></td>
<td>
<button class="btn btn-success btn-xs" type="submit"
name="addstatic"><span
class="glyphicon glyphicon-plus"></span>
</button>
</td>
</tr>
</tfoot>
</table>
<p>Specifying the MAC address is mandatory and only one entry per MAC
address is allowed. If the IP address is omitted and a host name is
given, the IP address will still be generated dynamically and the
specified host name will be used. If the host name is omitted, only
a
static lease will be added.</p>
</div>
</div>
</div>
</div>
<input type="hidden" name="field" value="DHCP">
<input type="hidden" name="token" value="<?php echo $token ?>">
<button type="submit" class="btn btn-primary pull-right">Save</button>
</form>
</div>
</div>
</div>
<!-- ######################################################### DNS ######################################################### -->
<div id="dns" class="tab-pane fade">
<form role="form" method="post">
<div class="row">
<div class="col-md-6">
<div class="box box-warning">
<div class="box-header">
<h1 class="box-title">Upstream DNS Servers</h1>
</div>
<div class="box-body">
<div class="row">
<div class="col-md-6">
<table class="table table-bordered">
<tr>
<th colspan="2">IPv4</th>
<th colspan="2">IPv6</th>
<th>Name</th>
</tr>
<?php foreach ($DNSserverslist as $key => $value) { ?>
<tr>
<?php if (isset($value["v4_1"])) { ?>
<td title="<?php echo $value["v4_1"]; ?>"><input
type="checkbox"
name="DNSserver<?php echo $value["v4_1"]; ?>"
value="true"
<?php if (in_array($value["v4_1"], $DNSactive)){ ?>checked<?php } ?> >
</td><?php } else { ?>
<td></td><?php } ?>
<?php if (isset($value["v4_2"])) { ?>
<td title="<?php echo $value["v4_2"]; ?>"><input
type="checkbox"
name="DNSserver<?php echo $value["v4_2"]; ?>"
value="true"
<?php if (in_array($value["v4_2"], $DNSactive)){ ?>checked<?php } ?> >
</td><?php } else { ?>
<td></td><?php } ?>
<?php if (isset($value["v6_1"])) { ?>
<td title="<?php echo $value["v6_1"]; ?>"><input
type="checkbox"
name="DNSserver<?php echo $value["v6_1"]; ?>"
value="true"
<?php if (in_array($value["v6_1"], $DNSactive) && $IPv6connectivity){ ?>checked<?php }
if (!$IPv6connectivity) { ?> disabled <?php } ?> >
</td><?php } else { ?>
<td></td><?php } ?>
<?php if (isset($value["v6_2"])) { ?>
<td title="<?php echo $value["v6_2"]; ?>"><input
type="checkbox"
name="DNSserver<?php echo $value["v6_2"]; ?>"
value="true"
<?php if (in_array($value["v6_2"], $DNSactive) && $IPv6connectivity){ ?>checked<?php }
if (!$IPv6connectivity) { ?> disabled <?php } ?> >
</td><?php } else { ?>
<td></td><?php } ?>
<td><?php echo $key; ?></td>
</tr>
<?php } ?>
</table>
</div>
<div class="col-lg-6">
<label>&nbsp;</label>
<div class="form-group">
<label>Custom 1 (IPv4)</label>
<div class="input-group">
<div class="input-group-addon"><input type="checkbox"
name="custom1"
value="Customv4"
<?php if (isset($custom1)){ ?>checked<?php } ?>>
</div>
<input type="text" name="custom1val" class="form-control"
data-inputmask="'alias': 'ip'" data-mask
<?php if (isset($custom1)){ ?>value="<?php echo $custom1; ?>"<?php } ?>>
</div>
<label>Custom 2 (IPv4)</label>
<div class="input-group">
<div class="input-group-addon"><input type="checkbox"
name="custom2"
value="Customv4"
<?php if (isset($custom2)){ ?>checked<?php } ?>>
</div>
<input type="text" name="custom2val" class="form-control"
data-inputmask="'alias': 'ip'" data-mask
<?php if (isset($custom2)){ ?>value="<?php echo $custom2; ?>"<?php } ?>>
</div>
<label>Custom 3 (IPv6)</label>
<div class="input-group">
<div class="input-group-addon"><input type="checkbox"
name="custom3"
value="Customv6"
<?php if (isset($custom3)){ ?>checked<?php } ?>>
</div>
<input type="text" name="custom3val" class="form-control"
data-inputmask="'alias': 'ipv6'" data-mask
<?php if (isset($custom3)){ ?>value="<?php echo $custom3; ?>"<?php } ?>>
</div>
<label>Custom 4 (IPv6)</label>
<div class="input-group">
<div class="input-group-addon"><input type="checkbox"
name="custom4"
value="Customv6"
<?php if (isset($custom4)){ ?>checked<?php } ?>>
</div>
<input type="text" name="custom4val" class="form-control"
data-inputmask="'alias': 'ipv6'" data-mask
<?php if (isset($custom4)){ ?>value="<?php echo $custom4; ?>"<?php } ?>>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="box box-warning">
<div class="box-header">
<h1 class="box-title">Interface listening behavior</h1>
</div>
<div class="box-body">
<div class="row">
<div class="col-lg-12">
<div class="form-group">
<div class="radio">
<label><input type="radio" name="DNSinterface" value="local"
<?php if ($DNSinterface == "local"){ ?>checked<?php } ?> ><strong>Listen
on all interfaces</strong><br>Allows only queries from
devices that are at most one hop away (local
devices)</label>
</div>
<div class="radio">
<label><input type="radio" name="DNSinterface" value="single"
<?php if ($DNSinterface == "single"){ ?>checked<?php } ?> ><strong>Listen
only on
interface <?php echo $piHoleInterface; ?></strong>
</label>
</div>
<div class="radio">
<label><input type="radio" name="DNSinterface" value="all"
<?php if ($DNSinterface == "all"){ ?>checked<?php } ?> ><strong>Listen
on all interfaces, permit all origins</strong></label>
</div>
</div>
<p>Note that the last option should not be used on devices which are
directly connected to the Internet. This option is safe if your
Pi-hole is located within your local network, i.e. protected behind
your router, and you have not forwarded port 53 to this device. In
virtually all other cases you have to make sure that your Pi-hole is
properly firewalled.</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<div class="box box-warning">
<div class="box-header with-border">
<h3 class="box-title">Advanced DNS settings</h3>
</div>
<div class="box-body">
<div class="col-lg-12">
<div class="form-group">
<div class="checkbox"><label><input type="checkbox"
name="DNSrequiresFQDN"
<?php if ($DNSrequiresFQDN){ ?>checked<?php } ?>
title="domain-needed"> never
forward
non-FQDNs</label></div>
</div>
<div class="form-group">
<div class="checkbox"><label><input type="checkbox"
name="DNSbogusPriv"
<?php if ($DNSbogusPriv){ ?>checked<?php } ?>
title="bogus-priv"> never
forward
reverse lookups for private IP ranges</label></div>
</div>
<p>Note that enabling these two options may increase your privacy
slightly, but
may also prevent you from being able to access local hostnames
if the
Pi-hole is not used as DHCP server</p>
<div class="form-group">
<div class="checkbox"><label><input type="checkbox"
name="DNSSEC"
<?php if ($DNSSEC){ ?>checked<?php } ?>>
Use DNSSEC</label></div>
</div>
<p>Validate DNS replies and cache DNSSEC data. When forwarding DNS
queries,
Pi-hole requests the DNSSEC records needed to validate the
replies. Use
Google or Norton DNS servers when activating DNSSEC. Note that
the size of
your log might increase significantly when enabling DNSSEC. A
DNSSEC
resolver test can be found <a
href="http://dnssec.vs.uni-due.de/"
target="_blank">here</a>.</p>
</div>
</div>
</div>
<input type="hidden" name="field" value="DNS">
<input type="hidden" name="token" value="<?php echo $token ?>">
<button type="submit" class="btn btn-primary pull-right">Save</button>
</div>
</div>
</form>
</div>
<!-- ######################################################### API ######################################################### -->
<div id="api" class="tab-pane fade">
<form role="form" method="post">
<div class="row">
<div class="col-lg-12">
<h4>Top Lists</h4>
<p>Exclude the following domains from being shown in</p>
</div>
<div class="col-lg-6">
<div class="form-group">
<label>Top Domains / Top Advertisers</label>
<textarea name="domains" class="form-control" rows="4"
placeholder="Enter one domain per line"><?php foreach ($excludedDomains as $domain) {
echo $domain . "\n";
} ?></textarea>
</div>
</div>
<div class="col-lg-6">
<div class="form-group">
<label>Top Clients</label>
<textarea name="clients" class="form-control" rows="4"
placeholder="Enter one IP address or host name per line"><?php foreach ($excludedClients as $client) {
echo $client . "\n";
} ?></textarea>
</div>
</div>
<div class="col-lg-12">
<h4>Privacy settings (Statistics / Query Log)</h4>
</div>
<div class="col-lg-6">
<div class="form-group">
<div class="checkbox"><label><input type="checkbox"
name="querylog-permitted"
<?php if ($queryLog === "permittedonly" || $queryLog === "all"){ ?>checked<?php } ?>>
Show permitted domain entries</label></div>
</div>
</div>
<div class="col-lg-6">
<div class="form-group">
<div class="checkbox"><label><input type="checkbox" name="querylog-blocked"
<?php if ($queryLog === "blockedonly" || $queryLog === "all"){ ?>checked<?php } ?>>
Show blocked domain entries</label></div>
</div>
</div>
<div class="col-lg-12">
<h4>Privacy mode</h4>
<div class="form-group">
<div class="checkbox"><label><input type="checkbox" name="privacyMode"
<?php if ($privacyMode){ ?>checked<?php } ?>>
Don't
show origin of DNS requests in query log</label></div>
</div>
<input type="hidden" name="field" value="API">
<input type="hidden" name="token" value="<?php echo $token ?>">
<button type="button" class="btn btn-primary api-token">Show API token</button>
<button type="submit" class="btn btn-primary pull-right">Save</button>
</div>
</div>
</form>
</div>
<!-- ######################################################### Web interface ######################################################### -->
<div id="web" class="tab-pane fade">
<?php
// CPU temperature unit
if (isset($setupVars["TEMPERATUREUNIT"])) {
$temperatureunit = $setupVars["TEMPERATUREUNIT"];
} else {
$temperatureunit = "C";
}
// Use $boxedlayout value determined in header.php
?>
<form role="form" method="post">
<div class="row">
<div class="col-lg-12">
<?php /*
<h4>Query Log Page</h4>
<div class="col-lg-6">
<div class="form-group">
<label>Default value for <em>Show XX entries</em></label>
<select class="form-control" disabled>
<option>10</option>
<option>25</option>
<option>50</option>
<option>100</option>
<option>All</option>
</select>
</div>
</div>
*/ ?>
<h4>Interface appearance</h4>
<div class="form-group">
<div class="checkbox"><label><input type="checkbox" name="boxedlayout"
value="yes"
<?php if ($boxedlayout){ ?>checked<?php } ?> >Use
boxed layout (helpful when working on large screens)</label></div>
</div>
<h4>CPU Temperature Unit</h4>
<div class="form-group">
<div class="radio"><label><input type="radio" name="tempunit" value="C"
<?php if ($temperatureunit === "C"){ ?>checked<?php } ?> >Celsius</label>
</div>
<div class="radio"><label><input type="radio" name="tempunit" value="K"
<?php if ($temperatureunit === "K"){ ?>checked<?php } ?> >Kelvin</label>
</div>
<div class="radio"><label><input type="radio" name="tempunit" value="F"
<?php if ($temperatureunit === "F"){ ?>checked<?php } ?> >Fahrenheit</label>
</div>
</div>
<input type="hidden" name="field" value="webUI">
<input type="hidden" name="token" value="<?php echo $token ?>">
<button type="submit" class="btn btn-primary pull-right">Save</button>
</div>
</div>
</form>
</div>
<!-- ######################################################### Teleporter ######################################################### -->
<div id="teleporter" class="tab-pane fade">
<div class="row">
<div class="col-lg-12">
<?php if (extension_loaded('Phar')) { ?>
<form role="form" method="post" id="takeoutform"
action="scripts/pi-hole/php/teleporter.php"
target="_blank" enctype="multipart/form-data">
<input type="hidden" name="token" value="<?php echo $token ?>">
<div class="col-lg-12">
<p>Export your Pi-hole lists as downloadable archive</p>
<button type="submit" class="btn btn-default">Export</button>
<hr>
</div>
<div class="col-lg-6">
<label>Import ...</label>
<div class="form-group">
<div class="checkbox">
<label><input type="checkbox" name="whitelist" value="true"
checked>
Whitelist</label>
</div>
<div class="checkbox">
<label><input type="checkbox" name="blacklist" value="true"
checked>
Blacklist (exact)</label>
</div>
<div class="checkbox">
<label><input type="checkbox" name="wildlist" value="true"
checked>
Blacklist (wildcard)</label>
</div>
</div>
</div>
<div class="col-lg-6">
<div class="form-group">
<label for="zip_file">File input</label>
<input type="file" name="zip_file" id="zip_file">
<p class="help-block">Upload only Pi-hole backup files.</p>
<button type="submit" class="btn btn-default" name="action"
value="in">Import
</button>
</div>
</div>
</form>
<?php } else { ?>
<p>The PHP extension <code>Phar</code> is not loaded. Please ensure it is installed
and loaded
if you want to use the Pi-hole teleporter.
<?php } ?>
</div>
</div>
</div>
<!-- ######################################################### System admin ######################################################### -->
<div id="sysadmin" class="tab-pane fade">
<div class="row">
<div class="col-md-6">
<div class="box">
<div class="box-header with-border">
<h3 class="box-title">Network Information</h3>
</div>
<div class="box-body">
<div class="col-md-12">
<table class="table table-striped">
<tbody>
<tr>
<th scope="row">Pi-hole Ethernet Interface:</th>
<td><?php echo $piHoleInterface; ?></td>
</tr>
<tr>
<th scope="row">Pi-hole IPv4 address:</th>
<td><?php echo $piHoleIPv4; ?></td>
</tr>
<tr>
<th scope="row">Pi-hole IPv6 address:</th>
<td><?php echo $piHoleIPv6; ?></td>
</tr>
<tr>
<th scope="row">Pi-hole hostname</th>
<td><?php echo $hostname; ?></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<?php
if ($FTL) {
function get_FTL_data($arg)
{
global $FTLpid;
return trim(exec("ps -p " . $FTLpid . " -o " . $arg));
}
$FTLversion = exec("/usr/bin/pihole-FTL version");
}
?>
<div class="col-md-6">
<div class="box">
<div class="box-header with-border">
<h3 class="box-title">FTL Information</h3>
</div>
<div class="box-body">
<div class="col-lg-12">
<table class="table table-striped">
<tbody>
<tr>
<th scope="row">FTL version:</th>
<td><?php echo $FTLversion; ?></td>
</tr>
<tr>
<th scope="row">Process identifier (PID):</th>
<td><?php echo $FTLpid; ?></td>
</tr>
<tr>
<th scope="row">Time FTL started:</th>
<td><?php print_r(get_FTL_data("start")); ?></td>
</tr>
<tr>
<th scope="row">User / Group:</th>
<td><?php print_r(get_FTL_data("euser")); ?>
/ <?php print_r(get_FTL_data("egroup")); ?></td>
</tr>
<tr>
<th scope="row">Total CPU utilization:</th>
<td><?php print_r(get_FTL_data("%cpu")); ?>%</td>
</tr>
<tr>
<th scope="row">Memory utilization:</th>
<td>
<?php print_r(get_FTL_data("%mem")); ?>%
</td>
</tr>
<tr>
<th scope="row"><span
title="Resident memory is the portion of memory occupied by a process that is held in main memory (RAM). The rest of the occupied memory exists in the swap space or file system.">Used memory:</span>
</th>
<td>
<?php echo formatSizeUnits(1e3 * floatval(get_FTL_data("rss"))); ?></td>
</td>
</tr
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="box">
<div class="box-header with-border">
<h3 class="box-title">Logging</h3>
</div>
<div class="box-body">
<p>Current status:
<?php if ($piHoleLogging) { ?>
Enabled (recommended)
<?php } else { ?>
Disabled
<?php } ?></p>
<?php if ($piHoleLogging) { ?>
<p>Note that disabling will render graphs on the web user interface useless</p>
<?php } ?>
<form role="form" method="post">
<div class="col-md-4">
<button type="button"
class="btn btn-default confirm-flushlogs form-control">Flush logs
</button>
</div>
<input type="hidden" name="field" value="Logging">
<input type="hidden" name="token" value="<?php echo $token ?>">
<div class="col-md-4 pull-right">
<?php if ($piHoleLogging) { ?>
<input type="hidden" name="action" value="Disable">
<button type="submit" class="btn btn-primary form-control">
Disable query
logging
</button>
<?php } else { ?>
<input type="hidden" name="action" value="Enable">
<button type="submit" class="btn btn-primary form-control">
Enable
query
logging
</button>
<?php } ?>
</div>
</form>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="box box-warning">
<div class="box-header with-border">
<h3 class="box-title">Danger Zone!</h3><br/>
</div>
<div class="box-body">
<div class="col-md-4">
<button type="button" class="btn btn-warning confirm-restartdns form-control">
Restart Dnsmasq
</button>
</div>
<div class="col-md-4">
<button type="button" class="btn btn-danger confirm-poweroff form-control">Power
off system
</button>
</div>
<div class="col-md-4">
<button type="button" class="btn btn-danger confirm-reboot form-control">Restart
system
</button>
</div>
<form role="form" method="post" id="poweroffform">
<input type="hidden" name="field" value="poweroff">
<input type="hidden" name="token" value="<?php echo $token ?>">
</form>
<form role="form" method="post" id="rebootform">
<input type="hidden" name="field" value="reboot">
<input type="hidden" name="token" value="<?php echo $token ?>">
</form>
<form role="form" method="post" id="restartdnsform">
<input type="hidden" name="field" value="restartdns">
<input type="hidden" name="token" value="<?php echo $token ?>">
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<?php
require "scripts/pi-hole/php/footer.php";
?>
<script src="scripts/vendor/jquery.inputmask.js"></script>
<script src="scripts/vendor/jquery.inputmask.extensions.js"></script>
<script src="scripts/vendor/jquery.confirm.min.js"></script>
<script src="scripts/pi-hole/js/settings.js"></script>