diff --git a/scripts/apply_network.sh b/scripts/apply_network.sh new file mode 100644 index 0000000..bef2502 --- /dev/null +++ b/scripts/apply_network.sh @@ -0,0 +1,41 @@ +#!/bin/bash +# apply_network.sh — Configure le réseau via NetworkManager +# Usage: apply_network.sh dhcp +# ou: apply_network.sh static +# Exemple: apply_network.sh static 192.168.1.100/24 192.168.1.1 8.8.8.8,1.1.1.1 + +set -e + +MODE="$1" +CON="Wired connection 1" + +# Trouve la connexion active si le nom par défaut a changé +if ! nmcli con show "$CON" &>/dev/null; then + CON=$(nmcli -t -f NAME,TYPE con show --active | grep ethernet | cut -d: -f1 | head -1) +fi + +[[ -z "$CON" ]] && echo "Aucune connexion Ethernet trouvée." && exit 1 + +if [[ "$MODE" == "dhcp" ]]; then + nmcli con mod "$CON" ipv4.method auto ipv4.addresses "" ipv4.gateway "" ipv4.dns "" + nmcli con up "$CON" + echo "OK: mode DHCP appliqué." + +elif [[ "$MODE" == "static" ]]; then + IP_PREFIX="$2" # ex: 192.168.1.100/24 + GATEWAY="$3" # ex: 192.168.1.1 + DNS="$4" # ex: 8.8.8.8,1.1.1.1 + + [[ -z "$IP_PREFIX" || -z "$GATEWAY" ]] && echo "IP et gateway requis." && exit 1 + + nmcli con mod "$CON" \ + ipv4.method manual \ + ipv4.addresses "$IP_PREFIX" \ + ipv4.gateway "$GATEWAY" \ + ipv4.dns "${DNS:-8.8.8.8,1.1.1.1}" + nmcli con up "$CON" + echo "OK: IP statique $IP_PREFIX appliquée." + +else + echo "Usage: $0 dhcp | static [dns]" && exit 1 +fi diff --git a/web/admin/domain.php b/web/admin/domain.php index b461773..02b3aa8 100644 --- a/web/admin/domain.php +++ b/web/admin/domain.php @@ -118,5 +118,169 @@ html_navbar('domain'); Annuler + + +
+
+ Réseau + chargement… +
+
+
+
Lecture de la configuration… +
+ +
+
+ + diff --git a/web/api/network.php b/web/api/network.php new file mode 100644 index 0000000..2def8c4 --- /dev/null +++ b/web/api/network.php @@ -0,0 +1,91 @@ +/dev/null | grep ethernet | cut -d: -f1 | head -1") ?? ''); + if (!$conName) $conName = 'Wired connection 1'; + + // Méthode (dhcp ou static) + $method = trim(shell_exec("nmcli -g ipv4.method con show " . escapeshellarg($conName) . " 2>/dev/null") ?? 'auto'); + + // IP actuelle + $ip4 = trim(shell_exec("nmcli -g IP4.ADDRESS dev show eth0 2>/dev/null | head -1") ?? ''); + + // Gateway actuelle + $gw = trim(shell_exec("nmcli -g IP4.GATEWAY dev show eth0 2>/dev/null | head -1") ?? ''); + + // DNS + $dns = trim(shell_exec("nmcli -g IP4.DNS dev show eth0 2>/dev/null | head -3 | tr '\n' ','") ?? ''); + $dns = rtrim($dns, ','); + + // Config statique configurée (pas forcément active) + $staticIp = trim(shell_exec("nmcli -g ipv4.addresses con show " . escapeshellarg($conName) . " 2>/dev/null") ?? ''); + $staticGw = trim(shell_exec("nmcli -g ipv4.gateway con show " . escapeshellarg($conName) . " 2>/dev/null") ?? ''); + $staticDns = trim(shell_exec("nmcli -g ipv4.dns con show " . escapeshellarg($conName) . " 2>/dev/null") ?? ''); + + return [ + 'connection' => $conName, + 'method' => ($method === 'auto' || $method === 'dhcp') ? 'dhcp' : 'static', + 'current_ip' => $ip4, + 'current_gw' => $gw, + 'current_dns'=> $dns, + 'static_ip' => $staticIp, + 'static_gw' => $staticGw, + 'static_dns' => $staticDns, + 'hostname' => gethostname(), + ]; +} + +if ($_SERVER['REQUEST_METHOD'] === 'GET') { + echo json_encode(get_network_info()); + exit; +} + +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $data = json_decode(file_get_contents('php://input'), true) ?? []; + $mode = $data['mode'] ?? 'dhcp'; + + if ($mode === 'dhcp') { + $out = shell_exec('sudo /opt/copymail/scripts/apply_network.sh dhcp 2>&1'); + echo json_encode(['success' => true, 'msg' => trim($out)]); + exit; + } + + if ($mode === 'static') { + $ip = trim($data['ip'] ?? ''); + $prefix = trim($data['prefix'] ?? '24'); + $gateway = trim($data['gateway'] ?? ''); + $dns = trim($data['dns'] ?? '8.8.8.8,1.1.1.1'); + + // Validation basique + if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { + http_response_code(400); + echo json_encode(['error' => 'Adresse IP invalide.']); + exit; + } + if (!filter_var($gateway, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { + http_response_code(400); + echo json_encode(['error' => 'Passerelle invalide.']); + exit; + } + $prefix = max(1, min(30, (int)$prefix)); + + $out = shell_exec(sprintf( + 'sudo /opt/copymail/scripts/apply_network.sh static %s %s %s 2>&1', + escapeshellarg("{$ip}/{$prefix}"), + escapeshellarg($gateway), + escapeshellarg($dns) + )); + echo json_encode(['success' => true, 'msg' => trim($out), 'new_ip' => $ip]); + exit; + } + + http_response_code(400); + echo json_encode(['error' => 'Mode invalide.']); +}