oglivecli-no-daemon #5
Loading…
Reference in New Issue
There is no content yet.
Delete Branch "oglivecli-no-daemon"
Deleting a branch is permanent. Although the deleted branch may exist for a short time before cleaning up, in most cases it CANNOT be undone. Continue?
Pull Request: Probar y Validar Funciones de
oglivecli
como Usuarioogboot
Resumen
Este pull request cierra las historias #404 y #478 .tiene como objetivo probar y validar la funcionalidad de cada comando de
oglivecli
cuando es ejecutado por el usuarioogboot
. El objetivo principal es asegurar que todos los comandos se ejecutan sin problemas sin necesidad de utilizar el demoniooglive
, y confirmar que el usuarioogboot
tiene los permisos necesarios para ejecutar cada comando exitosamente. A mayores incluye la instalación swagger como módulo en el composer.json en vez de descargarlo desde un repositorio externo. Esta rama se ha creado a partir de la rama de ogboot_installer ya que incluye el instalador de python que es necesario para aplicar los cambios de swagger+symfony y probarlo en JenkinsAntecedentes
Actualmente, los comandos de
oglivecli
son ejecutados por un demonio con privilegios elevados. Para mejorar la seguridad y optimizar las operaciones, necesitamos validar que el usuarioogboot
puede ejecutar todos los comandos deoglivecli
directamente. Este cambio también implicará verificar los permisos sudo necesarios para el usuarioogboot
.Cambios
oglivecli
para asegurar la compatibilidad y la correcta ejecución con los permisos adecuados.sudoers
: Asegurar que el usuarioogboot
tiene los permisos necesarios para ejecutar los comandos requeridos sin solicitar la contraseña.ogboot_installer.py
: Se ha añadido el instalador,ogboot_installer.py
, para facilitar la instalación del entorno Symfony y el paquete actualizado denelmio/api-doc-bundle
, que incluye Swagger para la documentación.Plan de Pruebas
Creación de Máquinas Virtuales para Pruebas:
Para crear y configurar las máquinas virtuales necesarias para las pruebas, lanzar un job en Jenkins con los siguientes parámetros:
multivm-ogboot-installer
oglivecli-no-daemon
ogboot
Estos parámetros permiten configurar correctamente el entorno necesario para las pruebas.
Validación de Swagger UI:
Una vez completada la instalación y configuración, revisar la ip de la nueva máquina. Se puede comprobar entrando al vmware-esxi y accediendo a la máquina en cuestión. Ejecutar para obtener la ip de la máquina:
Validar endpoints:
Para cada comando listado:
ogboot
.Ejemplo de flujo de pruebas:
GET /ogboot/v1/oglives/isos
POST /ogboot/v1/oglives/install
con el URL"iso_url": "https://ognproject.evlt.uma.es/trac/downloads/ogLive-focal-5.11.0-22-generic-amd64-r20210413.992ebb9.iso"
.GET /ogboot/v1/oglives/f7a8ba47d27d0fbceb82b55d8b5f8ccc
.PUT /ogboot/v1/oglives/default/f7a8ba47d27d0fbceb82b55d8b5f8ccc
.DELETE /ogboot/v1/oglives/f7a8ba47d27d0fbceb82b55d8b5f8ccc
.apt
El instalador hace 49 llamadas a apt-get install:
Esto ya lo comenté en otro sitio. ¿Realmente no se puede instalar todo de una sola vez?
Igual también sería interesante ponerle
--no-install-recommends
para meter menos morralla en el sistema, pero hay que evaluarlo.apache
Sale esto en la instalación:
Sistema
Esto habría que borrarlo:
Mejor sería crear un directorio temporal (usando
mktemp
), meter el instalador ahí y por último borrarlo. Sobre todo cuando luego existe un/tmp/ogboot_installer/ogboot
que no es más que un symlink a la home.API
GET /ogboot/help
Da un 500.
GET /ogboot/v1/status
Habíamos comentado que el api no tiene que devolver valores presentables, sino los números duros.
Esto está bien así? ¿O igual lo deberíamos quitar?
GET /ogboot/v1/oglives/isos
Tarda bastante. ¿Es porque se conecta a la nube?
GET /ogboot/v1/oglives
Aparece información que ya aparece en /ogboot/v1/status. ¿Nos han pedido que aparezca lo mismo en los dos sitios?
GET /ogboot/v1/oglives/default
Estaría bien que apareciera el id del oglive.
POST /ogboot/v1/oglives/install
Sale un error:
Si le doy otra vez, tarda lo mismo que la primera vez. Parece que vuelve a hacer todo el proceso a ciegas sin comprobar si ya está en local.
PUT /ogboot/v1/oglives/default
Con datos
{ "checksum": "hola" }
devuelve "500 not found" pero debería ser 404 según la propia docu del endpoint.GET /ogboot/v1/oglives/.
(ojo al
/.
final)Devuelve lo mismo que GET /ogboot/v1/oglives. Creo que no es correcto, debería devolver que el oglive "." no existe. O mejor aún, que no es válido.
GET /ogboot/v1/oglives/..
Devuelve esto:
¿De dónde sale?
DELETE /ogboot/v1/oglives/6153d21e7bd7f2486c027c5b9b3b93b6
Me deja borrar el oglive que está puesto por defecto. A partir de este momento,
GET /ogboot/v1/oglives
dice que el default es uno que ya no existe, yGET /ogboot/v1/oglives/default
devuelve uno que ya no está instalado.GET /ogboot/v1/pxes
La docu dice que en un 200 devuelve
{"boot_files": ["string"]}
pero obtengo{"boot_files": []}
. ¿Es correcto en una instalación nueva?POST /ogboot/v1/pxes
Con datos
{ "mac": "00:50:56:22:11:../../../../../../etc/passwd" }
me ha dado un "500 Failed to create PXE boot file". Sospecho que el código se ha ido a escribir en /etc/passwd y le dio un pete de permisos.Hay que validar los datos de entrada siempre.
GET /ogboot/v1/pxes/00%3A50%3A56%3A22%3A11%3A12..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd
No está documentado que el método devuelva 400, pero devuelve 400 seguido de HTML (no JSON).
GET /ogboot/v1/pxes/00%3A50%3A56%3A22%3A11%3A11%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd
(la misma que la anterior, pero con menos
../
)No está documentado que el método devuelva 404, pero devuelve 404 seguido de HTML (no JSON).
Además, que devuelva 400 en un caso y 404 en otro, significa que el código está haciendo cosas distintas. Sospecho que está yendo a /etc.
GET
/ogboot/v1/pxes/00%3A50%3A56%3A22%3A11%3Amac
El PXE existe (lo he creado anteriormente) pero en la respuesta obtengo
"template_name": ""
. Creo que debería haber algo en template_name.GET /ogboot/v1/pxe-templates/.
Igual que antes, el
/.
final hace que el método se comporte comoGET /ogboot/v1/pxe-templates
.GET /ogboot/v1/pxe-templates/pxe_default%2F..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd
400 Bad request
GET /ogboot/v1/pxe-templates/pxe_default%2F
404 Not found, seguido de HTML.
Contenido del repo
Scripts de instalación
Los scripts de shell creo que no deberían existir.
Configuración del instalador
En installer/config.json pone
Esa IP es un dato concreto de alguna instalación en particular que no debe estar en el repo.
Instalador
El instalador va como root. No debe haber
sudo
para hacer cosas como root.Las llamadas a
if subprocess.run(["echo", "$?"])
provocan esto en la salida de jenkins:Es decir, que la comprobación de error no está funcionando bien. Lo que tienes que hacer, dado que estamos usando python, es hacer que
servicesCompilation()
y compañía provoquen una excepción si algo va mal, y luego en el código que las llama usartry
/except
.Más cositas:
Sistema
¿Podemos quitar el symlink y cambiar todas las referencias de "opengnsys" a "ogboot"?
Seguridad
Ser usuario
ogboot
es equivalente a serroot
:Contenido del repo
.env
Diría que
APP_SECRET
hay que ponerlo en tiempo de instalación, no un valor fijo en el repo.DATABASE_URL
apunta a un postgresql. ¿Se usa el módulodbal
?Sobre
MESSENGER_TRANSPORT_DSN
, ¿se usa el módulomessenger
?bin/composer.phar
¿Por qué usar este en lugar de
/usr/bin/composer
?composer.lock
Debe estar en el repo, y el instalador no tiene que tocarlo. Ahora mismo el archivo no está, y el instalador lo borra como parte del despliegue.
bin/oglive_daemon.py
A partir del commit
7412653ebb
creo que este no debe estar.bin/oglivecli
oglivecli version
no funciona:oglivecli help
funciona de carambola. No está soportado, y al gestionar el error el código ejecutaraiseError usage
.Las siguientes funciones creo que no se usan:
check
list
show
search
download_old
update_json
add_message
bin/setsmbpass
Parece que no funciona, salen varios warnings y errores:
Creo que por eso me topé con el error "setsmbpass failed with SAMBAPASS" anteayer.
config/
Aquí dentro no tengo mucha idea, pero en
config/packages/framework.yaml
yo descomentaría la línea#csrf_protection: true
.etc/dhcp_boot.ipxe.tmpl
Si esto es ipxe (a juzgar por el nombre del archivo) creo que ya puede usar http en lugar de tftp, ¿correcto?
etc/kea-dhcp4.conf.tmpl
La IP 192.168.2.1 sé de dónde viene y, aunque no me gusta tenerla ahí a capón, está puesta en más sitios y de momento tiene que quedarse.
Pero las IPs 192.168.8.1 y 192.168.9.1, ¿qué son? ¿Estaban ya puestas con el ISC dhcpd?
etc/mac_script.ipxe.tmpl
También usa tftp en lugar de http.
Tiene los kernelargs puestos a capón.
etc/nginxServer.conf.tmpl
Esto habrá que quitarlo.
Este comentario en el repo, mejor quitarlo.
Yo quitaría el autoindex.
etc/oglive_daemon.service
A partir del commit
7412653ebb
creo que este no debe estar.tftpboot/ipxe_scripts/01-00:50:56:22:11:11
Este creo que hay que borrarlo.
tftpboot/ipxe_scripts/default.ipxe
Usa tftp en lugar de http.
Tiene los kernelargs puestos a capón.
Instalador
Libs
Creo que zipfile y urllib.request no se usan.
Globales
Hay que usar el menor número de variables globales en general.
Estas variables no se usan.
Dos globales con el mismo valor.
Funciones
El
sudo
para hacer cosas como root sobra en todas partes.Hay mucho código comentado. Yo lo borraría.
Los comentarios inútiles de chatgpt no aportan nada.
Cosas como
subprocess.run(["mv"
,subprocess.run(["chown"
y otros, se pueden hacer con python en lugar de llamar a comandos externos.cidr2mask
Esta función está definida dos veces y no se usa.
get_missing_packages
Esta función hace:
Pero eso ya lo hace también
autoConfigure()
y no veo por qué hay que hacerlo otra vez.En lugar de llamar a
dpkg -s
decenas de veces, se puede llamar una sola vez.downloadComposer
No se usa.
og_core_create_user
El parámetro de esta función (
OPENGNSYS_CLIENT_USER
) coincide con una global. No es una buena práctica.og_boot_create_dirs
El
chown -R
está en esta función y en otras, y no hace falta repetirlo. Se hace una sola vez al terminar la instalación.og_boot_composer_install
¿Por qué una llamada a
composer
y luego otra acomposer.phar
?backupFile
Esta función solo se usa una vez. Igual tiene sentido dejar el código inline allá donde se use.
testPxe
No se usa.
run_command
Se usa muchas veces, pero también hay muchas llamadas a subprocess.run. Hagámoslo de una manera o de otra.
tftpConfigure
Diría que
/var/lib/tftpboot
hay que dejarlo sin tocar, porque a) al instalar tftpd-hpa creo que ya debería aparecer con los permisos que el sistema necesita. Y si tocamos esas cosas y luego actualizamos tftpd-hpa, probablemente perdamos los cambios que le hagamos.Yo quizá añadiría al usuario ogboot al grupo del directorio /var/lib/tftpboot y con eso quizá basta.
Esto por qué se ejecuta? Luego no se comprueba nada...
Otro chmod sobre el mismo directorio?
En linux los permisos de los symlinks no importan.
El oglive que se descarga no debería estar puesto a capón.
mask2cidr
No se usa.
getNetworkSettings
No se usa.
openGnsysConfigure
Quitar la línea que sobra...
Seguro que hay otra forma de hallar la tz sin llamar a un comando externo y parsear la salida.
mount_NFS
Esta función hace mucho más que montar NFS.
Esto no puede estar en el repo. Quien se clone el repo no puede montar el servidor de artefactos de la UMA.
No hay que ponerle
-j 4
sin saber el número de cores de la CPU del sistema destino.smbConfigure
Esto que se hace con perl, seguro que también se puede hacer con python.
Esto podría estar ya puesto en la plantilla y luego no sustituir nada. O en la plantilla podría poner
__USER__
y luego sustituir el usuario.(fuera de ninguna función)
Esto no funciona así.
Ah, y me olvidé de
apt-get --allow-change-held-packages
. ¿Por qué ese parámetro peligroso?"user" significa que los usuarios pueden montar el filesystem
UUID=C336-DC38
en/media/pendrive16gb
.Comandos que están en el instalador, en
add_sudoers_permissions()
, que proporcionan root instantáneo y por tanto hay que quitar sí o sí./usr/bin/mount, /usr/bin/cp, /usr/bin/tee, /usr/bin/sed, /usr/bin/gzip, /usr/bin/lz4, /usr/bin/cpio, /bin/tee, /usr/bin/dd, /usr/bin/rsync
Otros comandos no los veo obvios (eg.
find
) pero quizá también habría que quitarlos.Idealmente deberíamos tirar sin sudo.
mount con "user" en fstab:
Esto permite montar
/home/nati/.../ogLive-focal...iso
en/home/nati/punto-de-montaje
.Una línea similar se mete en el fstab en tiempo de instalación. Somos root así que no hay problema. No copies a ciegas todo. Lee la documentación (
man fstab
como punto de partida) y entiende qué significa "iso9660", "user", "0" y el otro "0".Lo siguiente ya es simplemente crear el punto de montaje, montar, disfrutar y desmontar.
Step 1:
From your project repository, check out a new branch and test the changes.Step 2:
Merge the changes and update on Gitea.