{"id":906,"date":"2022-03-01T18:45:04","date_gmt":"2022-03-01T17:45:04","guid":{"rendered":"https:\/\/esferas.org\/mldt\/?p=906"},"modified":"2022-03-01T20:44:59","modified_gmt":"2022-03-01T19:44:59","slug":"tareas-martes-1-de-marzo-de-2022","status":"publish","type":"post","link":"https:\/\/esferas.org\/mldt\/tareas-martes-1-de-marzo-de-2022\/","title":{"rendered":"Tareas: martes, 1 de marzo de 2022"},"content":{"rendered":"\n<p>Parte de lo hecho hoy fue comenzado ayer pero no quer\u00eda confundirme m\u00e1s. Ayer fue domingo y desde que estoy varado en casa sin coche los d\u00edas se me hacen iguales. <\/p>\n\n\n\n<!--more-->\n\n\n\n<h3 class=\"wp-block-heading\">Servidor barbacana.venexma.net<\/h3>\n\n\n\n<p>He estado realizando un mont\u00f3n de cambios en la configuraci\u00f3n de los servidores virtuales bajo Apache2 en esta m\u00e1quina. Todos han cambiado su definici\u00f3n de escucha para hacerlo en dos direcciones IP: la interna (192.168.100.1) y la externa (79.148.243.240). S\u00f3lo en un par de casos el contenido cambia, y es en aquellos servidores que deben dar s\u00f3lo contenido al interior y no al exterior. Muy pocos. Y ha funcionado correctamente. <\/p>\n\n\n\n<p>He tenido que ponerlos a todos porque si dejo algo con un asterisco como direcci\u00f3n IP suele darle prioridad a \u00e9stos y descabalarme todo el montaje. Al final casi mejor. <\/p>\n\n\n\n<p>Otro problema que no s\u00e9 de d\u00f3nde sale pero me lo estoy imaginando es que los archivos dentro de <em>\/etc\/apache2\/sites-enabled<\/em> deber\u00edan ser enlaces simb\u00f3licos a <em>\/etc\/apache2\/sites-available<\/em> y son archivos completos. Eso significa que he estado trabajando varias horas sobre archivos creyendo que su contenido se ver\u00eda reflejado autom\u00e1ticamente en el otro y no era as\u00ed. Explica varias cosas: que el procedimiento de restauraci\u00f3n de configuraci\u00f3n antes de Debian 11 no fue correcto y que soy un poco mel\u00f3n por no haberlo visto antes. Lo corrijo entonces porque si no emplear <em>a2ensite<\/em> y derivados no sirve de nada.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Servidor usuarios.venexma.net<\/h3>\n\n\n\n<p>Hace tiempo que buscaba una aplicaci\u00f3n web que me permitiese gestionar los usuarios por una parte y proporcionar un servicio de cambio de contrase\u00f1a por otro. Y no, no la he encontrado. Bueno, un poco s\u00ed. <\/p>\n\n\n\n<p>Buscando, buscando, me he topado en github con una aplicaci\u00f3n PHP (para no variar) que funciona en un contenedor (para variar menos a\u00fan) -porque emplea PHP versi\u00f3n 8- y que m\u00e1s o menos da la funcionalidad que quiero. Se llama <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/wheelybird\/ldap-user-manager\" target=\"_blank\">ldap-user-manager<\/a>, es de <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/wheelybird\" target=\"_blank\">Brian Lycett<\/a> y me ha costado bastante que arrancase por falta de lectura de la documentaci\u00f3n. <\/p>\n\n\n\n<p>Una vez descargado el contenedor he creado un archivo de configuraci\u00f3n para cargar las variables de entorno:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">SERVER_HOSTNAME=usuarios.venexma.net\nORGANIZATION_NAME=\"Venexma Europa, S.L.\"\nSITE_NAME=\"Gesti\u00f3n de usuarios de Venexma Europa, S.L.\"\nSESSION_DEBUG=TRUE\n<strong>NO_HTTPS=TRUE<\/strong>\nLDAP_URI=ldap:\/\/ldap.venexma.net\nLDAP_BASE_DN=dc=venexma,dc=net\nLDAP_REQUIRE_STARTTLS=FALSE\nLDAP_ADMINS_GROUP=Admins\nLDAP_ADMIN_BIND_DN=cn=admin,dc=venexma,dc=net\nLDAP_ADMIN_BIND_PWD=secreto!\nLDAP_IGNORE_CERT_ERRORS=true\nLDAP_DEBUG=TRUE\nLDAP_USER_OU=users\nLDAP_GROUP_OU=groups\nLDAP_GROUP_MEMBERSHIP_USES_UID=TRUE\nDEFAULT_USER_GROUP=Venexma\nACCEPT_WEAK_PASSWORDS=TRUE\nACCOUNT_REQUESTS_ENABLED=FALSE\nEMAIL_DOMAIN=venexma.es\nSMTP_HOSTNAME=smtp.venexma.net\nEMAIL_FROM_ADDRESS=root@venexma.net\nEMAIL_FROM_NAME=\"Victor\"\nRESET_PASSWORD_EMAIL_SUBJECT=\"Contrase\u00f1a reiniciada\"<\/pre>\n\n\n\n<p>Tambi\u00e9n he a\u00f1adido una estrofa para que se tuviese acceso desde Apache2:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"apacheconf\" class=\"language-apacheconf\"># Creando proxy a aplicaci\u00f3n \nProxyPreserveHost on\nProxyPass \/ http:\/\/127.0.0.1:8099\/\nProxyPassReverse \/ http:\/\/127.0.0.1:8099\/\n<\/code><\/pre>\n\n\n\n<p>Habiendo arrancado el contenedor con el puerto <em>-p 8099:80<\/em> para que tuviese acceso. <\/p>\n\n\n\n<p>Ahora bien, \u00bf funciona ? Hombre, s\u00ed que funciona. Si entras con el URL <em>\/setup<\/em> pues echa un buen vistazo a la configuraci\u00f3n LDAP, sugiere unas cosas y a\u00f1ade otras si no existen. Crea un usuario de administraci\u00f3n y con \u00e9l puedes ver las otras cuentas y los otros grupos. Y s\u00ed, bien, excepto por los siguientes detalles:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>No hay otro idioma que el ingl\u00e9s (mis hom\u00ednidos no van a usarlo, eso est\u00e1 claro)<\/li><li>Los mensajes de error LDAP son continuos en la p\u00e1gina web. Eso afea. <\/li><li>Permite enviar una contrase\u00f1a nueva si lo pide el usuario utilizando el correo que encuentra en el directorio pero <ol><li>El mensaje incluye la contrase\u00f1a en texto plano (<strong>mal<\/strong>)<\/li><li>Sugiere que se visite un URL concreto para cambiar la contrase\u00f1a (<strong>regular<\/strong>)<\/li><li>Los mensajes est\u00e1n en ingl\u00e9s (<strong>pues igual de regular<\/strong>) aunque se pueden definir por completo en la configuraci\u00f3n (<strong>mira, eso est\u00e1 bien<\/strong>)<\/li><\/ol><\/li><li>Los servicios para cualquier cuenta no administrativa se reducen al cambio de contrase\u00f1a. No puede tocar ning\u00fan otro valor de su cuenta. <\/li><\/ol>\n\n\n\n<p>Ahora estoy un poco liado as\u00ed que no pondr\u00e9 nada nuevo. Me han hablado bien de <a href=\"https:\/\/www.fusiondirectory.org\/en\/\" target=\"_blank\" rel=\"noreferrer noopener\">Fusion Directory<\/a>. Lo bueno es que est\u00e1 empaquetado para Debian. Lo malo es que hay tropecientos paquetes y lo mismo instalo un monstruo hipervitaminado que nunca voy a terminar de conocer. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Creando r\u00e9plica del entorno de producci\u00f3n<\/h3>\n\n\n\n<p>Pues s\u00ed, volvemos a hacer una r\u00e9plica del entorno de producci\u00f3n para que el muchacho externo 3 pueda trabajar con datos actualizados. Como el procedimiento automatizado no trajo m\u00e1s que problemas -que no he identificado a\u00fan y me escuecen de verdad- estoy realizando el procedimiento a mano. <\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Avisar en el grupo de Telegram (en el que est\u00e1n todos menos el dire, porque \u00e9l lo vale)<\/li><li>Detener el servicio odoo-prod<\/li><li>Copiar archivos: <em>rsync -av \/var\/lib\/odoo-data-prod\/ \/var\/lib\/odoo-data-replica\/<\/em><\/li><li>Duplicar la base de datos<ol><li>Borrar la base de datos de r\u00e9plica: <em>sudo -u postgres dropdb replica<\/em><\/li><li>Crearla de nuevo partiendo de la de producci\u00f3n: <em>sudo -u postgres createdb -Tprod replica<\/em><\/li><li>Cambiar el propietario a odoo (en psql): <em>alter database replica owner to odoo;<\/em><\/li><li>Retocar algunos valores internos para que no haga de m\u00e1s (abajo el c\u00f3digo SQL)<\/li><li>Crear el logotipo actualizado (s\u00ed, abajo tambi\u00e9n)<\/li><\/ol><\/li><li>Actualizar el c\u00f3digo (seguimos abajo)<\/li><li>Poner en marcha ambos servicios<\/li><\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Valores internos<\/h4>\n\n\n\n<p>Lo siguiente son cambios que hay que hacer siempre que se replica la base de datos y que sigo ciegamente porque no parecen graves y fueron recomendados por el muchacho externo 1:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"sql\" class=\"language-sql\">update  ir_mail_server\nset     smtp_user = concat('xxx_', smtp_user),\n        smtp_pass = concat('xxx_', smtp_pass),\n        smtp_host = concat('xxx_', smtp_host);\nupdate ir_config_parameter set\n    value = 'https:\/\/replica.venexma.net'\n    where key = 'web.base.url';\nupdate ir_config_parameter set\n    value = 'http:\/\/127.0.0.1:8169'\n    where key = 'report_url';\nupdate ir_config_parameter set\n    value = '\/opt\/odoo-replica\/wkhtmltopdf-amd64'\n    where key = 'webkit_path2';\nupdate ir_config_parameter set value = '$DB_TEST' where key = 'ribbon.name';\nupdate fetchmail_server\nset     \"user\" = concat('xxx_', \"user\"),\n        password = concat('xxx_', \"user\"),\n        server = concat('xxx_', server) ;\nupdate ir_cron set active = False;\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Actualizar el c\u00f3digo<\/h4>\n\n\n\n<p>Aqu\u00ed viene donde la matan. He intentado organizarlo en repositorios git para que hubiese registro de cambios y se pudiesen retroceder cambios. Y, bueno, sobre el papel est\u00e1 bien, pero los externos tienden a emplear el interfaz web de odoo para subir c\u00f3digo y como \u00e9ste no tiene integraci\u00f3n con git se olvidan de la consola y los cambios se quedan ah\u00ed, sin registrar. <\/p>\n\n\n\n<p>El caso es que al menos lo hacen ahora en r\u00e9plica primero y luego lo pasan a producci\u00f3n. Es una gran mejora pero falta la guinda: emplear git. <\/p>\n\n\n\n<p>As\u00ed que hay que ir uno por uno, ver cambios, registrarlos, subirlos en una parte y recuperarlos en otra. Seguro que estoy haciendo un mont\u00f3n de cosas mal. Nunca he llegado a entender del todo c\u00f3mo funciona la herramienta y no paso del uso b\u00e1sico tipo repositorio central. En fin, al menos registrado queda. Si hay problemas ya veremos despu\u00e9s c\u00f3mo los resolvemos. <\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Cambiar el logotipo <\/h4>\n\n\n\n<p>Desde la primera vez que cre\u00e9 una r\u00e9plica me percat\u00e9 de que el URL no era lo m\u00e1s apropiado para hacerles ver en qu\u00e9 entorno estaban. odoo pone siempre y en cada una de sus <em>pantallas<\/em> el logotipo que se asigna a la empresa por lo que me las ingeni\u00e9 para adaptarlo un poco y ser m\u00e1s informativo. Empleando el programa convert modifico la versi\u00f3n original y le a\u00f1ado como texto la fecha y el texto <em>R\u00e9plica<\/em>. As\u00ed lo ven continuamente y sufren menos. <\/p>\n\n\n\n<p>El c\u00f3digo original, el que no quiero usar por las desgracias que trajo parte de \u00e9l, es complicado de usar directamente. As\u00ed que he hecho un extracto para que funcione en un script aparte:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">#!\/usr\/bin\/bash env\n\nLOGO=$1\n[ -z \"$LOGO\" ] &amp;&amp; exit 1\n\nLOGO_REPLICA=\/tmp\/logo-replica.jpeg\nFECHA=$(date +%d\/%m\/%Y)\n\nconvert $LOGO \\\n        -gravity south  \\\n        -font Cantarell-Bold \\\n        -pointsize 25 \\\n        -annotate 0 $FECHA \\\n        -gravity north \\\n        -pointsize 20  \\\n        -annotate 0 'R\u00e9plica' \\\n        $LOGO_REPLICA\n\nlogo64=$(base64 $LOGO_REPLICA)\nsudo -u postgres psql -d replica &lt;&lt;EOF\n    update res_company set\n        logo_web = '${logo64}';\nEOF<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Parte de lo hecho hoy fue comenzado ayer pero no quer\u00eda confundirme m\u00e1s. Ayer fue domingo y desde que estoy varado en casa sin coche los d\u00edas se me hacen iguales.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"webmentions_disabled_pings":false,"webmentions_disabled":false,"footnotes":""},"categories":[121],"tags":[126,37,11,249,163,248,35,94,105],"class_list":["post-906","post","type-post","status-publish","format-standard","hentry","category-el-dia-a-dia","tag-administracion","tag-apache2","tag-debian","tag-git","tag-ldap","tag-ldap-user-manager","tag-odoo","tag-postgresql","tag-virtual","content-box"],"_links":{"self":[{"href":"https:\/\/esferas.org\/mldt\/wp-json\/wp\/v2\/posts\/906","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/esferas.org\/mldt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/esferas.org\/mldt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/esferas.org\/mldt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/esferas.org\/mldt\/wp-json\/wp\/v2\/comments?post=906"}],"version-history":[{"count":9,"href":"https:\/\/esferas.org\/mldt\/wp-json\/wp\/v2\/posts\/906\/revisions"}],"predecessor-version":[{"id":917,"href":"https:\/\/esferas.org\/mldt\/wp-json\/wp\/v2\/posts\/906\/revisions\/917"}],"wp:attachment":[{"href":"https:\/\/esferas.org\/mldt\/wp-json\/wp\/v2\/media?parent=906"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/esferas.org\/mldt\/wp-json\/wp\/v2\/categories?post=906"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/esferas.org\/mldt\/wp-json\/wp\/v2\/tags?post=906"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}