network managment

This commit is contained in:
Devdatt Bhatt 2026-06-07 23:35:38 +00:00
parent b408dc90e5
commit 13658ddd4c
1 changed files with 217 additions and 85 deletions

View File

@ -1,5 +1,4 @@
<?php <?php
/* /*
Urmi you happy me happy licence Urmi you happy me happy licence
@ -8,93 +7,226 @@ Copyright (c) 2026 shreebhattji
License text: License text:
https://github.com/shreebhattji/Urmi/blob/main/licence.md https://github.com/shreebhattji/Urmi/blob/main/licence.md
*/ */
include 'header.php' ?> include 'header.php';
// Load network configuration
$config_file = '/etc/urmi/network.json';
$network_config = [];
if (file_exists($config_file)) {
$config_data = file_get_contents($config_file);
$network_config = json_decode($config_data, true);
}
// Handle form submissions
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (isset($_POST['action'])) {
$interface = $_POST['interface'];
$action = $_POST['action'];
if ($action === 'save') {
// Save configuration
$config = [
'interface' => $interface,
'method' => $_POST['method'],
'ip' => $_POST['ip'] ?? '',
'netmask' => $_POST['netmask'] ?? '',
'gateway' => $_POST['gateway'] ?? '',
'dns' => $_POST['dns'] ?? ''
];
$network_config[$interface] = $config;
file_put_contents($config_file, json_encode($network_config, JSON_PRETTY_PRINT));
} elseif ($action === 'activate') {
// Activate interface
exec("sudo ip link set $interface up", $output, $return_code);
} elseif ($action === 'deactivate') {
// Deactivate interface
exec("sudo ip link set $interface down", $output, $return_code);
}
}
}
// Get network interfaces excluding specific ones
$interfaces = [];
$output = [];
exec('ip addr show', $output);
$current_interface = null;
$interface_data = [];
foreach ($output as $line) {
// Match interface name
if (preg_match('/^\d+:\s+([a-zA-Z0-9]+):/', $line, $matches)) {
$current_interface = $matches[1];
// Skip interfaces we want to exclude
if (strpos($current_interface, 'enx') === 0) {
$current_interface = null;
continue;
}
if ($current_interface === 'lo') {
$current_interface = null;
continue;
}
// Check if interface is a bridge or docker interface
if (strpos($current_interface, 'docker') === 0 ||
strpos($current_interface, 'br-') === 0 ||
strpos($current_interface, 'veth') === 0) {
$current_interface = null;
continue;
}
$interface_data[$current_interface] = [
'name' => $current_interface,
'ip' => '',
'mac' => '',
'status' => 'down',
'config' => $network_config[$current_interface] ?? null
];
}
// Extract IP address
if ($current_interface && preg_match('/inet\s+(\d+\.\d+\.\d+\.\d+)/', $line, $matches)) {
$interface_data[$current_interface]['ip'] = $matches[1];
}
// Extract MAC address
if ($current_interface && preg_match('/link\/ether\s+([a-f0-9:]+)/', $line, $matches)) {
$interface_data[$current_interface]['mac'] = $matches[1];
}
// Check if interface is up
if ($current_interface && strpos($line, 'state UP') !== false) {
$interface_data[$current_interface]['status'] = 'up';
}
}
?>
<div class="container"> <div class="container">
<h2>Network Interfaces</h2> <h2>Network Interfaces</h2>
<table class="table table-striped">
<thead>
<tr>
<th>Interface Name</th>
<th>IP Address</th>
<th>MAC Address</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<?php
// Get network interfaces excluding specific ones
$interfaces = [];
// Get all interfaces using ip command <!-- Interface Tabs -->
$output = []; <ul class="nav nav-tabs" id="interfaceTabs" role="tablist">
exec('ip addr show', $output); <?php $first = true; foreach ($interface_data as $interface): ?>
<li class="nav-item" role="presentation">
<button class="nav-link <?php echo $first ? 'active' : ''; ?>"
id="tab-<?php echo $interface['name']; ?>"
data-bs-toggle="tab"
data-bs-target="#<?php echo $interface['name']; ?>"
type="button"
role="tab">
<?php echo htmlspecialchars($interface['name']); ?>
</button>
</li>
<?php $first = false; endforeach; ?>
</ul>
$current_interface = null; <!-- Tab Content -->
$interface_data = []; <div class="tab-content" id="interfaceTabContent">
<?php $first = true; foreach ($interface_data as $interface): ?>
<div class="tab-pane fade <?php echo $first ? 'show active' : ''; ?>"
id="<?php echo $interface['name']; ?>"
role="tabpanel">
<div class="card mt-3">
<div class="card-header">
<h5><?php echo htmlspecialchars($interface['name']); ?></h5>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<p><strong>IP Address:</strong> <?php echo htmlspecialchars($interface['ip'] ?: 'N/A'); ?></p>
<p><strong>MAC Address:</strong> <?php echo htmlspecialchars($interface['mac'] ?: 'N/A'); ?></p>
<p><strong>Status:</strong>
<span class="badge bg-<?php echo $interface['status'] === 'up' ? 'success' : 'secondary'; ?>">
<?php echo htmlspecialchars($interface['status']); ?>
</span>
</p>
</div>
<div class="col-md-6">
<form method="post" action="">
<input type="hidden" name="interface" value="<?php echo htmlspecialchars($interface['name']); ?>">
foreach ($output as $line) { <div class="mb-3">
// Match interface name <label class="form-label">Configuration Method</label>
if (preg_match('/^\d+:\s+([a-zA-Z0-9]+):/', $line, $matches)) { <div class="form-check">
$current_interface = $matches[1]; <input class="form-check-input" type="radio" name="method" id="dhcp-<?php echo $interface['name']; ?>"
value="dhcp" <?php echo ($interface['config']['method'] ?? '') === 'dhcp' ? 'checked' : ''; ?>>
<label class="form-check-label" for="dhcp-<?php echo $interface['name']; ?>">
DHCP
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="method" id="static-<?php echo $interface['name']; ?>"
value="static" <?php echo ($interface['config']['method'] ?? '') === 'static' ? 'checked' : ''; ?>>
<label class="form-check-label" for="static-<?php echo $interface['name']; ?>">
Static IP
</label>
</div>
</div>
// Skip interfaces we want to exclude <div class="mb-3" id="static-ip-fields-<?php echo $interface['name']; ?>"
if (strpos($current_interface, 'enx') === 0) { style="<?php echo ($interface['config']['method'] ?? '') === 'static' ? 'display: block;' : 'display: none;'; ?>">
$current_interface = null; <label class="form-label">IP Address</label>
continue; <input type="text" class="form-control" name="ip"
} value="<?php echo htmlspecialchars($interface['config']['ip'] ?? ''); ?>"
placeholder="192.168.1.100">
if ($current_interface === 'lo') { <label class="form-label mt-2">Netmask</label>
$current_interface = null; <input type="text" class="form-control" name="netmask"
continue; value="<?php echo htmlspecialchars($interface['config']['netmask'] ?? ''); ?>"
} placeholder="255.255.255.0">
// Check if interface is a bridge or docker interface <label class="form-label mt-2">Gateway</label>
if (strpos($current_interface, 'docker') === 0 || <input type="text" class="form-control" name="gateway"
strpos($current_interface, 'br-') === 0 || value="<?php echo htmlspecialchars($interface['config']['gateway'] ?? ''); ?>"
strpos($current_interface, 'veth') === 0) { placeholder="192.168.1.1">
$current_interface = null;
continue;
}
$interface_data[$current_interface] = [ <label class="form-label mt-2">DNS Server</label>
'name' => $current_interface, <input type="text" class="form-control" name="dns"
'ip' => '', value="<?php echo htmlspecialchars($interface['config']['dns'] ?? ''); ?>"
'mac' => '', placeholder="8.8.8.8">
'status' => 'down' </div>
];
}
// Extract IP address <div class="d-flex justify-content-between">
if ($current_interface && preg_match('/inet\s+(\d+\.\d+\.\d+\.\d+)/', $line, $matches)) { <button type="submit" name="action" value="save" class="btn btn-primary">Save Configuration</button>
$interface_data[$current_interface]['ip'] = $matches[1]; <div>
} <button type="submit" name="action" value="activate"
class="btn btn-success <?php echo $interface['status'] === 'up' ? 'disabled' : ''; ?>">
// Extract MAC address Activate
if ($current_interface && preg_match('/link\/ether\s+([a-f0-9:]+)/', $line, $matches)) { </button>
$interface_data[$current_interface]['mac'] = $matches[1]; <button type="submit" name="action" value="deactivate"
} class="btn btn-danger <?php echo $interface['status'] === 'down' ? 'disabled' : ''; ?>">
Deactivate
// Check if interface is up </button>
if ($current_interface && strpos($line, 'state UP') !== false) { </div>
$interface_data[$current_interface]['status'] = 'up'; </div>
} </form>
} </div>
</div>
// Display the filtered interfaces </div>
foreach ($interface_data as $interface) { </div>
if (!empty($interface['ip']) || !empty($interface['mac'])) { </div>
echo "<tr>"; <?php $first = false; endforeach; ?>
echo "<td>" . htmlspecialchars($interface['name']) . "</td>"; </div>
echo "<td>" . htmlspecialchars($interface['ip']) . "</td>";
echo "<td>" . htmlspecialchars($interface['mac']) . "</td>";
echo "<td>" . htmlspecialchars($interface['status']) . "</td>";
echo "</tr>";
}
}
?>
</tbody>
</table>
</div> </div>
<script>
// Toggle static IP fields based on method selection
document.querySelectorAll('input[name^="method"]').forEach(radio => {
radio.addEventListener('change', function() {
const interfaceName = this.name.replace('method', '');
const staticFields = document.getElementById(`static-ip-fields-${interfaceName}`);
if (this.value === 'static') {
staticFields.style.display = 'block';
} else {
staticFields.style.display = 'none';
}
});
});
</script>
<?php include 'footer.php' ?> <?php include 'footer.php' ?>