Desarrollo de Aplicaciones PHP para Gestión de Usuarios y Configuración de Redes

Enviado por Programa Chuletas y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 8,01 KB

Revisión y Estructuración de Código PHP

El documento original presenta dos secciones de código PHP distintas y no relacionadas, una para la gestión de usuarios mediante un menú interactivo y otra para la modificación del archivo de configuración de red /etc/network/interfaces. A continuación, se presenta el código corregido, formateado y estructurado para mejorar su legibilidad y corrección sintáctica y ortográfica.

Parte 1: Sistema de Gestión de Usuarios (Agenda)

Este bloque implementa un sistema básico de **CRUD** (Crear, Leer, Actualizar, Eliminar) para gestionar usuarios, almacenados en un array asociativo donde la clave es el DNI.

#!/usr/bin/php
// Agenda de Juan Gavira Escrivá

<?php

/**

Función para leer la entrada estándar (STDIN). @return string La cadena leída y limpia de espacios. */ function leer(): string { $cadena = ""; // Asegura que STDIN esté definido como un recurso de lectura if (!defined("STDIN")) { define("STDIN", fopen('php://stdin', 'r')); } $cadena = fread(STDIN, 1024); return trim($cadena); }

/**

Muestra el menú principal y solicita una opción al usuario.

@return string La opción seleccionada. */ function menu(): string { system("clear"); // Limpia la consola echo "\n--- Menú de Gestión de Usuarios ---\n"; echo "---------------------------------------------------\n"; echo "1. Dar de alta a un usuario.\n"; echo "2. Dar de baja a un usuario.\n"; echo "3. Consultar un usuario (se pedirá DNI).\n"; echo "4. Ver todos los usuarios.\n"; echo "---------------------------------------------------\n"; echo "5. Salir\n"; echo "Su opción: ";

$opcion = leer(); return $opcion; }

/**

Elimina un usuario de la tabla usando su DNI. @param array $tabla Referencia al array de usuarios. @param string $dni El DNI del usuario a eliminar. @return int Siempre retorna 0. */ function eliminar(array &$tabla, string $dni): int { if (isset($tabla[$dni])) { unset($tabla[$dni]); // unset sirve para borrar variables/claves echo "Se eliminó correctamente.\n"; } else { echo "No existe DNI.\n"; } sleep(2); // Espera 2 segundos antes de continuar return 0; }

/**

Muestra todos los usuarios registrados. @param array $tabla Referencia al array de usuarios. @return int Siempre retorna 0. */ function verTodo(array &$tabla): int { if (empty($tabla)) { echo "No hay usuarios registrados.\n"; } else { echo "\n--- Listado de Usuarios ---\n"; foreach ($tabla as $clave => $valor) { echo "DNI: {$clave} | Nombre: {$valor}\n"; } } return 0; }

// --- Inicialización y Bucle Principal ---

$tabla = []; // Inicializa el array de usuarios $opcion = '';

// El bucle Do-While original se corrige a While para mejor práctica, aunque se mantiene la lógica de salida. do { $opcion = menu();

switch ($opcion) {
    case '1':
        system("clear");
        echo "Introduce el nombre: ";
        $nombre = leer();
        echo "Introduce el DNI: ";
        $dni = leer();

        if (!empty($nombre) && !empty($dni)) {
            $tabla[$dni] = $nombre;
            ksort($tabla); // ksort() ordena el array por las claves (DNI)
            echo "Usuario dado de alta.\n";
        } else {
            echo "Error: Nombre o DNI vacíos.\n";
        }
        sleep(2);
        break;

    case '2':
        system("clear");
        echo "Introduzca el DNI a eliminar: ";
        $dni = leer();
        eliminar($tabla, $dni);
        break;

    case '3':
        system("clear");
        echo "Introduzca el DNI a consultar: ";
        $dni = leer();
        if (isset($tabla[$dni])) {
            echo "DNI: {$dni} | Nombre: {$tabla[$dni]}\n";
        } else {
            echo "No existe el DNI.\n";
        }
        sleep(2);
        break;

    case '4':
        system("clear");
        verTodo($tabla);
        echo "\nPresione Enter para continuar...";
        leer(); // Espera a que el usuario presione Enter
        break;

    case '5':
        echo "Saliendo del sistema...\n";
        break;

    default:
        echo "Opción no válida.\n";
        sleep(2);
        break;
}

} while ($opcion != '5');

?>

Parte 2: Script para Configuración de Redes

Esta sección parece ser un script independiente diseñado para modificar el archivo de configuración de red /etc/network/interfaces, solicitando IP, máscara y puerta de enlace.

Nota Importante: La ejecución de comandos como exec y la modificación directa de archivos de configuración del sistema (como /etc/network/interfaces) requieren **permisos de superusuario (root)** y deben manejarse con extrema precaución.


<?php

// CONFIGURAR /etc/network/interfaces

/**

Función para leer la entrada estándar (STDIN) con manejo de caracteres. @return string La frase leída, sin el carácter de nueva línea final. */ function lee(): string { if (!defined("STDIN")) { // Se corrige la ruta de 'http:/stdin' a 'php://stdin' o se mantiene la estructura original si se asume un entorno específico. define("STDIN", fopen('php://stdin', 'r')); } $frase = fread(STDIN, 1024); // Elimina el carácter de nueva línea final si existe $tam = strlen($frase) - 1; $nueva = ""; for ($i = 0; $i < $tam; $i++) { $nueva .= $frase[$i]; } return $nueva; }

// 1. Copia de seguridad del archivo original exec("cp /etc/network/interfaces /etc/network/interfaces2");

// 2. Definición del patrón de validación IP (IPv4) $patron = "^([0-9]{1,3}.){3}[0-9]{1,3}$";

// 3. Definición de tipos (aunque solo se usan los dos primeros datos en el bucle) $tipo[0] = "ip"; $tipo[1] = "mascara"; $tipo[2] = "puerta de enlace";

$dato = [];

// 4. Apertura del archivo para escritura (se usará el archivo copiado para modificar) $fichero = fopen("/etc/network/interfaces2", "w");

if ($fichero !== NULL) { echo "Fichero abierto para escritura.\n";

// Solicitud de datos: IP y Máscara (el bucle original itera 2 veces, pero luego usa $dato[2] en el texto)
for ($i = 0; $i < 3; $i++) {
    do {
        $prompt = "Introduzca la dirección " . $tipo[$i] . ": ";
        echo $prompt;
        $dato[$i] = lee();

        // Validación: Solo se valida la IP (índice 0) y la Máscara (índice 1) con el patrón.
        if ($i === 0 || $i === 1) {
            // Se usa preg_match en lugar de ereg (obsoleta)
            if (!preg_match("/" . $patron . "/", $dato[$i])) {
                echo "Error: Formato de dirección inválido. Inténtelo de nuevo.\n";
                $dato[$i] = ""; // Limpia el dato si falla la validación
            }
        }
    } while (empty($dato[$i]));
}

// 5. Construcción del texto de configuración
$texto = "auto eth0\n";
$texto .= "iface eth0 inet static\n";
$texto .= "\taddress " . $dato[0] . "\n";
$texto .= "\tnetmask " . $dato[1] . "\n";
$texto .= "\tgateway " . $dato[2] . "\n";

// 6. Escritura y cierre
fputs($fichero, $texto);
fclose($fichero);
echo "Fichero cerrado y datos escritos.\n";

// 7. Reinicio del servicio de red (requiere permisos)
echo "Reiniciando el servicio de networking...\n";
exec("/etc/init.d/networking restart");

} else { echo "\nError al abrir el fichero /etc/network/interfaces2"; }

?>

Entradas relacionadas: