wip2
This commit is contained in:
parent
d6da7a6a2e
commit
55ac3e1d44
18
db.php
18
db.php
@ -1,18 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
try {
|
|
||||||
$db = new SQLite3('ipam.db');
|
|
||||||
} catch (Exception $e) {
|
|
||||||
echo $e->getMessage();
|
|
||||||
exit();
|
|
||||||
}
|
|
||||||
|
|
||||||
$db->exec(<<<SQL
|
|
||||||
CREATE TABLE IF NOT EXISTS networks (
|
|
||||||
adress INTEGER NOT NULL,
|
|
||||||
mask INTEGER NOT NULL,
|
|
||||||
nom TEXT,
|
|
||||||
description TEXT,
|
|
||||||
PRIMARY KEY (adress, masque)
|
|
||||||
);
|
|
||||||
SQL);
|
|
123
edit.php
Normal file
123
edit.php
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
<?php
|
||||||
|
include_once "load-networks.php";
|
||||||
|
|
||||||
|
$tag = "";
|
||||||
|
$network = [];
|
||||||
|
if (isset($_SERVER["QUERY_STRING"]) && preg_match(
|
||||||
|
"/^$namePtn$/", $_SERVER["QUERY_STRING"], $matches
|
||||||
|
)) {
|
||||||
|
$tag = $matches[0];
|
||||||
|
|
||||||
|
if (isset($networks[$tag])) {
|
||||||
|
$network = $networks[$tag];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($network == []) {
|
||||||
|
preg_match("/\n\d+: (?P<iface>[a-z0-9]+) inet (?<ipaddr>$ipPtn)\/(?<mask>\d+) brd (?<broadcast>$ipPtn)/", `ip -o -4 a`, $network);
|
||||||
|
$ip_addr = ip2long($network["ipaddr"]);
|
||||||
|
$network["cidr_mask"] = $network["mask"];
|
||||||
|
$mask = $long_mask[(int)$network["mask"]];
|
||||||
|
$tag = "local";
|
||||||
|
$network["network-addr"] = $ip_addr & $netmask;
|
||||||
|
$network["netmask"] = long2ip($mask);
|
||||||
|
$network["broadcast"] = ip2long($network["broadcast"]);
|
||||||
|
if (preg_match("/default via ($ipPtn)/", `ip -4 route`, $router)) {
|
||||||
|
$network["router"] = $router[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="fr">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>IPAM</title>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js"></script>
|
||||||
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/fomantic-ui@2.9.4/dist/semantic.min.css">
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/fomantic-ui@2.9.4/dist/semantic.min.js"></script>
|
||||||
|
<link rel="stylesheet" href="style.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<nav class="ui inverted teal menu">
|
||||||
|
<a class="header item" href=".">IP<em>AM</em></a>
|
||||||
|
</nav>
|
||||||
|
<main class="ui container">
|
||||||
|
<h1>Éditer un réseau</h1>
|
||||||
|
<form action="update-network.php" method="post" class="ui form">
|
||||||
|
<input type="hidden" name="previous-tag" value="<?=$tag?>"/>
|
||||||
|
<div class="field">
|
||||||
|
<label for="tag" class="required">Nom</label>
|
||||||
|
<input id="tag" name="tag" type="text" pattern="[a-zA-Z_][\w\-]*" placeholder="local" required value="<?=$tag?>" title="une lettre suivie par des lettres, des chiffres ou des tirets"/>
|
||||||
|
</div>
|
||||||
|
<div class="two fields">
|
||||||
|
<div class="field">
|
||||||
|
<label for="network-addr" class="required">Adresse réseau</label>
|
||||||
|
<div class="ui labeled input">
|
||||||
|
<input id="network-addr" name="network-addr" type="text" title="xxx.xxx.xxx.xxx" required
|
||||||
|
pattern="(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)"
|
||||||
|
placeholder="<?=long2ip($network["network-addr"]) ?? "192.168.1.0" ?>"
|
||||||
|
value="<?=long2ip($network["network-addr"]) ?? "" ?>"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="netmask" class="required">Masque</label>
|
||||||
|
<select id="netmask" name="netmask" class="ui search selection dropdown">
|
||||||
|
<?php foreach ($long_mask as $cidr_mask => $netmask) :
|
||||||
|
$netmask = long2ip($netmask);
|
||||||
|
?>
|
||||||
|
<option value="<?=$netmask?>"<?=$netmask == ($network["netmask"] ?? 24) ? " selected" : ""?>>/<?=$cidr_mask?> <?=$netmask?></option>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</select>
|
||||||
|
<script>$('#netmask').dropdown()</script>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="router">Passerelle</label>
|
||||||
|
<input id="router" name="router" type="text" title="xxx.xxx.xxx.xxx"
|
||||||
|
pattern="(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)"
|
||||||
|
placeholder="<?=$network["router"] ?? "192.168.1.1"?>"
|
||||||
|
value="<?=$network["router"] ?? ""?>"/>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="dns-server">Serveur(s) DNS (laisser vide pour ce serveur)</label>
|
||||||
|
<select id="dns-server" name="dns-server" multiple class="ui search multiple selection dropdown" autocomplete="off">
|
||||||
|
</select>
|
||||||
|
<script>
|
||||||
|
const ipRegex = /^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)$/;
|
||||||
|
$('#dns-server').dropdown({
|
||||||
|
allowAdditions: true,
|
||||||
|
forceSelection: false,
|
||||||
|
onAdd: function(value, text, $choice) {
|
||||||
|
if (!ipRegex.test(value)) {
|
||||||
|
$(this).dropdown('remove selected', value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
<h4 class="ui header">DHCP dynamique</h4>
|
||||||
|
<div class="two fields">
|
||||||
|
<div class="field">
|
||||||
|
<label for="start-addr">Première adresse</label>
|
||||||
|
<div class="ui labeled input">
|
||||||
|
<input id="start-addr" name="start-addr" type="text" title="xxx.xxx.xxx.xxx"
|
||||||
|
pattern="(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)"
|
||||||
|
placeholder="<?=$network["dhcp-range"]["start_addr"] ?? "192.168.1.100" ?>"
|
||||||
|
value="<?=$network["dhcp-range"]["start_addr"] ?? "" ?>"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="end-addr">Dernière adresse</label>
|
||||||
|
<div class="ui labeled input">
|
||||||
|
<input id="end-addr" name="end-addr" type="text" title="xxx.xxx.xxx.xxx"
|
||||||
|
pattern="(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)"
|
||||||
|
placeholder="<?=$network["end-addr"] ?? "192.168.1.200" ?>"
|
||||||
|
value="<?=$network["dhcp-range"]["end"] ?? "" ?>"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button type="submit" class="ui button">Enregistrer</button>
|
||||||
|
</form>
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
</html>
|
140
index.php
140
index.php
@ -1,100 +1,46 @@
|
|||||||
|
<?php
|
||||||
|
require_once "load-networks.php";
|
||||||
|
|
||||||
|
if (isset($_SERVER["QUERY_STRING"]) && preg_match(
|
||||||
|
"/^$namePtn$/", $_SERVER["QUERY_STRING"], $matches
|
||||||
|
)) {
|
||||||
|
$tag = $matches[0];
|
||||||
|
if (isset($networks[$tag])) {
|
||||||
|
include("show-network.php");
|
||||||
|
} else {
|
||||||
|
header("Location: edit.php?$tag");
|
||||||
|
}
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
?>
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="fr">
|
<html lang="fr">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>IPAM</title>
|
<title>IPAM</title>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js"></script>
|
<script src="https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js"></script>
|
||||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/fomantic-ui@2.9.4/dist/semantic.min.css">
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/fomantic-ui@2.9.4/dist/semantic.min.css">
|
||||||
<script src="https://cdn.jsdelivr.net/npm/fomantic-ui@2.9.4/dist/semantic.min.js"></script>
|
<script src="https://cdn.jsdelivr.net/npm/fomantic-ui@2.9.4/dist/semantic.min.js"></script>
|
||||||
<style>
|
<link rel="stylesheet" href="style.css">
|
||||||
.ui.form input[type="number"].textfield {
|
</head>
|
||||||
appearance: textfield;
|
<body>
|
||||||
}
|
<nav class="ui inverted teal menu">
|
||||||
.ui.form input[type="number"].textfield ::-webkit-inner-spin-button,
|
<a class="header item">IP<em>AM</em></a>
|
||||||
.ui.form input[type="number"].textfield ::-webkit-outer-spin-button {
|
</nav>
|
||||||
-webkit-appearance: none;
|
<main class="ui container">
|
||||||
margin: 0;
|
<h1>Réseaux</h1>
|
||||||
}
|
<ul class="ui link list">
|
||||||
.ui.input.address input {
|
<?php foreach ($networks as $tag => $options) : ?>
|
||||||
text-align: right;
|
<li class="item">
|
||||||
}
|
<a class="header" href="?<?=$tag?>"><?=$tag?></a>
|
||||||
.address :not(:first-child):not(:last-child) {
|
<div class="description"><?=long2ip($options["network-addr"])?>/<?=$options["cidr_mask"]?></div>
|
||||||
border-radius: 0 !important;
|
</li>
|
||||||
}
|
<?php endforeach; ?>
|
||||||
.address :first-child {
|
<li class="item">
|
||||||
border-top-right-radius: 0 !important;
|
<a class='header' href="edit.php">Nouveau réseau...</a>
|
||||||
border-bottom-right-radius: 0 !important;
|
</li>
|
||||||
}
|
</ul>
|
||||||
.address :last-child {
|
</main>
|
||||||
border-top-left-radius: 0 !important;
|
</body>
|
||||||
border-bottom-left-radius: 0 !important;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<main class="ui container">
|
|
||||||
<div class="ui segment">
|
|
||||||
<form action="add-network.php" method="post" class="ui form">
|
|
||||||
<div class="field">
|
|
||||||
<label for="name">Nom</label>
|
|
||||||
<input type="text" id="name" name="name">
|
|
||||||
</div>
|
|
||||||
<div class="fields">
|
|
||||||
<div class="field">
|
|
||||||
<label for="address">Adresse</label>
|
|
||||||
<div class="ui labeled address input">
|
|
||||||
<input type="number" id="octet1Input" min="0" max="255" step="1" required class="textfield">
|
|
||||||
<div class="ui label">.</div>
|
|
||||||
<input type="number" id="octet2Input" min="0" max="255" step="1" required class="textfield">
|
|
||||||
<div class="ui label">.</div>
|
|
||||||
<input type="number" id="octet3Input" min="0" max="255" step="1" required class="textfield">
|
|
||||||
<div class="ui label">.</div>
|
|
||||||
<input type="number" id="octet4Input" min="0" max="255" step="1" required class="textfield">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<input type="hidden" id="addressInput" name="address">
|
|
||||||
<div class="field">
|
|
||||||
<label>Masque</label>
|
|
||||||
<div class="ui labeled input">
|
|
||||||
<div class="ui label">/</div>
|
|
||||||
<input type="number" id="maskInput" name="mask" min="0" max="32" step="1" required class="textfield" title="Masque au format CIDR">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<script>
|
|
||||||
let otctetInputs = [octet1Input, octet2Input, octet3Input, octet4Input]
|
|
||||||
console.log(otctetInputs.forEach)
|
|
||||||
otctetInputs.forEach(input => {
|
|
||||||
input.oninput = () => {
|
|
||||||
o1 = octet1Input.valueAsNumber || 0;
|
|
||||||
o2 = octet2Input.valueAsNumber || 0;
|
|
||||||
o3 = octet3Input.valueAsNumber || 0;
|
|
||||||
o4 = octet4Input.valueAsNumber || 0;
|
|
||||||
addressInput.value = ((o1 << 24) | (o2 << 16) | (o3 << 8) | o4) >>> 0
|
|
||||||
}
|
|
||||||
input.onfocus = () => {
|
|
||||||
input.select();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
[octet1Input, octet2Input, octet3Input].forEach((input, index) => {
|
|
||||||
input.onkeydown = function (event) {
|
|
||||||
if (event.key == ".") {
|
|
||||||
event.preventDefault();
|
|
||||||
otctetInputs[index + 1].focus()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
octet4Input.onkeydown = function (event) {
|
|
||||||
if (event.key == "/") {
|
|
||||||
event.preventDefault();
|
|
||||||
maskInput.focus()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
</div>
|
|
||||||
<button type="submit" class="ui button">Ajouter</button>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
</body>
|
|
||||||
</html>
|
</html>
|
4
ipam.conf
Normal file
4
ipam.conf
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
dhcp-optsfile=/var/lib/misc/dhcp.options
|
||||||
|
dhcp-hostsfile=/var/lib/misc/dhcp.hosts
|
||||||
|
dhcp-leasefile=/var/lib/misc/dnsmasq.leases
|
||||||
|
conf-file=/var/lib/misc/dhcp.ranges
|
29
load-conf.php
Normal file
29
load-conf.php
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
$conf_paths = [
|
||||||
|
"/etc/dnsmasq.d/ipam.conf",
|
||||||
|
__DIR__ . "/ipam.conf"
|
||||||
|
];
|
||||||
|
|
||||||
|
$default = [
|
||||||
|
"dhcp-optsfile" => "/var/lib/misc/dhcp.options",
|
||||||
|
"dhcp-hostsfile" => "/var/lib/misc/dhcp.hosts",
|
||||||
|
"dhcp-leasefile" => "/var/lib/misc/dnsmasq.leases",
|
||||||
|
"conf-file" => "/var/lib/misc/dhcp.ranges",
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach($conf_paths as $path) {
|
||||||
|
if (file_exists($path)) {
|
||||||
|
$conf = array_merge($default, parse_ini_file($path, true, INI_SCANNER_TYPED));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$namePtn = "[a-zA-Z_][\w-]*";
|
||||||
|
$ipPtn = "\d+\.\d+\.\d+\.\d+";
|
||||||
|
$macPtn = "[\da-f]{2}(?:[:-][\da-f]{2}){5}";
|
||||||
|
$domainPtn = "[\w-]+(\.[\w-]+)*";
|
||||||
|
$ifacePtn = "[\w,]+";
|
||||||
|
$modesPtn = "static|proxya-only|slaac|ra-names|ra-stateless|ra-advrouter|off-link";
|
||||||
|
$timePtn = "\d+[mhds]";
|
||||||
|
$commentPtn = "[ \t]*(?:# ?(?<comment>.*))?";
|
39
load-hosts.php
Normal file
39
load-hosts.php
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
require_once "load-conf.php";
|
||||||
|
|
||||||
|
$hosts = [];
|
||||||
|
if (isset($conf["dhcp-hostsfile"]) && file_exists($conf["dhcp-hostsfile"])) {
|
||||||
|
foreach(file($conf["dhcp-hostsfile"]) as $line) {
|
||||||
|
if (preg_match(
|
||||||
|
"/^(?<hwaddrs>$macPtn(,$macPtn)*)(id:[^,]+)*(?:,(?:tag|set):(?<tag>$namePtn))?(?:,(?<ipaddr>$ipPtn))?(?:,(?<hostnames>$domainPtn(,$domainPtn)*))?(?:,(?<lease_time>$timePtn|infinite))?([ \t]+#services:(?<services>\w[,\w]*))?$commentPtn$/",
|
||||||
|
$line, $host, PREG_UNMATCHED_AS_NULL
|
||||||
|
)) {
|
||||||
|
$hosts[ip2long($host["ipaddr"])] = [
|
||||||
|
"hwaddrs" => $host["hwaddrs"] ? explode(',', $host["hwaddrs"]) : [],
|
||||||
|
"tag" => $host["tag"] ?? "local",
|
||||||
|
"hostnames" => $host["hostnames"] ? explode(',', $host["hostnames"]) : [],
|
||||||
|
"lease_time" => $host["lease_time"],
|
||||||
|
"services" => $host["services"]? explode(',', $host["services"]) : [],
|
||||||
|
"comment" => $host["comment"],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(isset($conf["dhcp-leasefile"]) && file_exists($conf["dhcp-leasefile"])) {
|
||||||
|
foreach(file($conf["dhcp-leasefile"]) as $line) {
|
||||||
|
if (preg_match(
|
||||||
|
"/^(?<expiry>\d+) (?<hwaddr>$macPtn) (?<ipaddr>$ipPtn) (?:\*|(?<hostname>\$domainPtn)) (?<duid>[^ ]+)(?: (?<tag>.*))?$/",
|
||||||
|
$line, $lease, PREG_UNMATCHED_AS_NULL
|
||||||
|
)) {
|
||||||
|
$hosts[ip2long($lease["ipaddr"])] = [
|
||||||
|
"hwaddrs" => [$lease["hwaddr"]],
|
||||||
|
"tag" => $host["tag"] ?? "local",
|
||||||
|
"hostnames" => [$lease["hostname"]],
|
||||||
|
"lease_time" => null,
|
||||||
|
"services" => [],
|
||||||
|
"comment" => "DHCP dynamique",
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
78
load-networks.php
Normal file
78
load-networks.php
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
require_once "load-conf.php";
|
||||||
|
|
||||||
|
$networks = [];
|
||||||
|
if (isset($conf["dhcp-optsfile"]) && file_exists($conf["dhcp-optsfile"])) {
|
||||||
|
foreach(file($conf["dhcp-optsfile"]) as $line) {
|
||||||
|
if (preg_match(
|
||||||
|
"/^(?:tag:(?<tag>$namePtn),)?option:(?<option>$namePtn),(?<value>[^#\r\n]*)$commentPtn$/",
|
||||||
|
$line, $option
|
||||||
|
)) {
|
||||||
|
if (!isset($networks[$option["tag"] ?? "default"])) $networks[$option["tag"] ?? "default"] = [];
|
||||||
|
$networks[$option["tag"] ?? "default"][$option["option"]] = $option["value"];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($conf["conf-file"]) && file_exists($conf["conf-file"])) {
|
||||||
|
foreach(file($conf["conf-file"]) as $line) {
|
||||||
|
if (preg_match(
|
||||||
|
"/^dhcp-range=(?:(?:tag|set):(?<tag>$namePtn),)?(?<start_addr>$ipPtn),(?:(?<end_addr>$ipPtn)|$modesPtn)(?:,(?<netmask>$ipPtn)(?:,$ipPtn)?)?(?:,(?<lease_time>$timePtn|infinite))?$commentPtn$/",
|
||||||
|
$line, $range, PREG_UNMATCHED_AS_NULL
|
||||||
|
)) {
|
||||||
|
if (!isset($networks[$range["tag"] ?? "default"])) $networks[$range["tag"] ?? "default"] = [];
|
||||||
|
$networks[$range["tag"] ?? "default"]["dhcp-range"] = [
|
||||||
|
"start_addr" => $range["start_addr"],
|
||||||
|
"end_addr" => $range["end_addr"],
|
||||||
|
"netmask" => $range["netmask"],
|
||||||
|
"lease_time" => $range["lease_time"],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$long_mask = [
|
||||||
|
0b00000000000000000000000000000000,
|
||||||
|
0b10000000000000000000000000000000,
|
||||||
|
0b11000000000000000000000000000000,
|
||||||
|
0b11100000000000000000000000000000,
|
||||||
|
0b11110000000000000000000000000000,
|
||||||
|
0b11111000000000000000000000000000,
|
||||||
|
0b11111100000000000000000000000000,
|
||||||
|
0b11111110000000000000000000000000,
|
||||||
|
0b11111111000000000000000000000000,
|
||||||
|
0b11111111100000000000000000000000,
|
||||||
|
0b11111111110000000000000000000000,
|
||||||
|
0b11111111111000000000000000000000,
|
||||||
|
0b11111111111100000000000000000000,
|
||||||
|
0b11111111111110000000000000000000,
|
||||||
|
0b11111111111111000000000000000000,
|
||||||
|
0b11111111111111100000000000000000,
|
||||||
|
0b11111111111111110000000000000000,
|
||||||
|
0b11111111111111111000000000000000,
|
||||||
|
0b11111111111111111100000000000000,
|
||||||
|
0b11111111111111111110000000000000,
|
||||||
|
0b11111111111111111111000000000000,
|
||||||
|
0b11111111111111111111100000000000,
|
||||||
|
0b11111111111111111111110000000000,
|
||||||
|
0b11111111111111111111111000000000,
|
||||||
|
0b11111111111111111111111100000000,
|
||||||
|
0b11111111111111111111111110000000,
|
||||||
|
0b11111111111111111111111111000000,
|
||||||
|
0b11111111111111111111111111100000,
|
||||||
|
0b11111111111111111111111111110000,
|
||||||
|
0b11111111111111111111111111111000,
|
||||||
|
0b11111111111111111111111111111100,
|
||||||
|
0b11111111111111111111111111111110,
|
||||||
|
0b11111111111111111111111111111111,
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach ($networks as $tag => &$options) {
|
||||||
|
$ip_addr = ip2long($network["router"] ?? $options["dhcp-range"]["start_addr"]);
|
||||||
|
$netmask = ip2long($network["netmask"] ?? $options["dhcp-range"]["netmask"]);
|
||||||
|
$hostmask = 0xFFFFFFFF & ~$netmask;
|
||||||
|
$options["network-addr"] = $ip_addr & $netmask;
|
||||||
|
$options["broadcast"] = $ip_addr | $hostmask;
|
||||||
|
$options["cidr_mask"] = array_search($netmask, $long_mask);
|
||||||
|
}
|
34
save.php
Normal file
34
save.php
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
require_once "load.php";
|
||||||
|
|
||||||
|
$dhcp_options = "";
|
||||||
|
$dhcp_ranges = "";
|
||||||
|
foreach($networks as $tag => $options) {
|
||||||
|
foreach($options as $option => $value) {
|
||||||
|
if ($option == "dhcp-range") {
|
||||||
|
$dhcp_ranges .= "dhcp-range=set:$tag,{$value["start_addr"]},{$value["end_addr"]}";
|
||||||
|
if (isset($value["netmask"])) $dhcp_ranges .= ",{$value["netmask"]}";
|
||||||
|
if (isset($value["lease_time"])) $dhcp_ranges .= ",{$value["lease_time"]}";
|
||||||
|
$dhcp_ranges .= "\n";
|
||||||
|
} else {
|
||||||
|
$dhcp_options .= "tag:$tag,option:$option,$value\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
file_put_contents($conf["dhcp-optsfile"], $dhcp_options);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
http_response_code(500);
|
||||||
|
die($e->getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
file_put_contents($conf["conf-file"], $dhcp_ranges);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
http_response_code(500);
|
||||||
|
die($e->getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
echo $dhcp_ranges;
|
43
show-network.php
Normal file
43
show-network.php
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
<?php
|
||||||
|
require_once "load-networks.php";
|
||||||
|
require_once "load-hosts.php";
|
||||||
|
|
||||||
|
$network = $networks[$tag];
|
||||||
|
?>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<style>
|
||||||
|
table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
th, td {
|
||||||
|
border: 1px solid;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>
|
||||||
|
<?=$tag?><br/>
|
||||||
|
<small><?=long2ip($network["network-addr"])?>/<?=$network["cidr_mask"]?></small>
|
||||||
|
</h1>
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr><th></th><th>Adresse IP</th><th>Adresse MAC</th><th>Nom d'hôte</th><th>Description</th><th>Services</th><th></th></tr>
|
||||||
|
<?php
|
||||||
|
for ($ipaddr = $network["network-addr"] + 1; $ipaddr < $network["broadcast"]; $ipaddr++):
|
||||||
|
$host = $hosts[$ipaddr] ?? [];
|
||||||
|
?>
|
||||||
|
<tr>
|
||||||
|
<td></td>
|
||||||
|
<td><?=long2ip($ipaddr)?></td>
|
||||||
|
<td><?=implode("<br/>\n", $host["hwaddrs"] ?? [])?></td>
|
||||||
|
<td><?=implode("<br/>\n", $host["hostnames"] ?? [])?></td>
|
||||||
|
<td><?=$host["comment"] ?? "" ?></td>
|
||||||
|
<td><?=implode(", ", $host["services"] ?? [])?></td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
<?php endfor; ?>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</body>
|
||||||
|
</html>
|
47
style.css
Normal file
47
style.css
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
ul {
|
||||||
|
margin-top: 0 !important;
|
||||||
|
margin-bottom: 1em !important;
|
||||||
|
padding-top: 0.7em !important;
|
||||||
|
padding-left: 0 !important;
|
||||||
|
padding-bottom: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
border-left: 2px solid #DDD;
|
||||||
|
margin: 0 !important;
|
||||||
|
padding-top: 0.5em !important;
|
||||||
|
padding-bottom: 0.5em !important;
|
||||||
|
padding-left: 0.7em !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
li::before {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.form input[type="number"].textfield {
|
||||||
|
appearance: textfield;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.form input[type="number"].textfield ::-webkit-inner-spin-button,
|
||||||
|
.ui.form input[type="number"].textfield ::-webkit-outer-spin-button {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.input.address input {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.address :not(:first-child):not(:last-child) {
|
||||||
|
border-radius: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.address :first-child {
|
||||||
|
border-top-right-radius: 0 !important;
|
||||||
|
border-bottom-right-radius: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.address :last-child {
|
||||||
|
border-top-left-radius: 0 !important;
|
||||||
|
border-bottom-left-radius: 0 !important;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user