Gestión de usuarios en gitlab desde la consola rails

Esta semana tuve que dar soporte a un viejo servidor GitLab 6.0 y nadie tenía la contraseña del usuario admin. Así que me vi en la necesidad de usar la consola de rails para crear un usuario local y asignarle permisos de administrador en GitLab. Desde la rails console es posible realizar multitud de gestiones aunque en esta entrada tan solo nos centraremos en la creación de usuarios, reseteo de contraseña y asignación de permisos de administrador en GitLab.

Dependiendo de la versión de GitLab algunos parámetros no son permitidos, siendo necesario hacer algunas acciones en dos pasos.

Lanzar la consola rails

Dependiendo del GitLab, la consola puede ser invocada con el usuario root desde cualquier directorio usando el comando gitlab-rails console production o debe ser invocada con el usuario git en el directorio gitlab usando el comando bundle exec rails console production. A continuación ambos ejemplos:

  • A través de gitlab-rails:

    1
    2
    3
    [root@git ~]# gitlab-rails console production
    Loading production environment (Rails 4.2.8)
    irb(main):001:0>
  • A través de bundle exec:

    1
    2
    3
    git@gitlab-prod:~/gitlab[6-0-stable]$ bundle exec rails console production
    Loading production environment (Rails 3.2.13)
    1.9.1 :001 >

UniFi Video: Unable to Load Stream

Al configurar Nginx como proxy SSL/TLS OffLoading de un Tomcat ejecutando la aplicación UniFi Video, no es posible reproducir los streaming de videos a través de HTTPS. El streaming de video funciona correctamente a través de HTTP, pero no a través de HTTPS. En el interfaz web de UniFi Video se muestra un tooltip con el siguiente mensaje de error: Unable to load stream. Please make sure port 7446 is open on your NVR.

A continuación una captura de pantalla del error en la interfaz web de UniFi Video:

Error 'transmit timed out' en VM Linux en Hyper-V

En una migración de una VM CentOS a una granja Hyper-V, la interfaz de red dejó de funcionar. De acuerdo al System Center Virtual Machine Manager (SCVMM), la VM tenía atachada un tarjeta de red legacy. A continuación la información del sistema de la tarjeta de red:

1
2
3
4
5
6
7
8
9
10
[root@svn-qa]# ethtool -i eth0
driver: tulip
version: 1.1.15
firmware-version:
bus-info: 0000:00:0a.0
supports-statistics: no
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no

Además en los logs, se registrarón multiples errores del tipo transmit timed out, status fc678147, a continuación se puede ver un ejemplo de lo que registró el log:

El comando du de Linux en Windows

El comando du de Linux es un comando muy útil para conocer el uso del disco de forma recursiva desde un punto concreto del árbol de directorios.

Personalmente suelo usar el comando du de la siguiente forma du -csh /PATH/*, donde:

  • -c, muestra el tamaño total.
  • -s, solo muestra el tamaño total de cada directorio, contabilizando el tamaño de su contenido, es decir, no se muestra el detalle para cada elemento dentro de cada directorio sino la suma del tamaño total.
  • -h o -m, muestra el tamaño en un formato facilmente comprensible por humano (-h) o bien en MB (-m). El uso de uno u otro depende de si la salida generada por du será procesada por un script o no.

Windows no incorporá de forma nativa ningún comando similar al comando du de Linux aunque es posible descargar la utilidad Disk Usage (du) de Windows Sysinternals.

Incrementar el tamaño máximo del POST de Tomcat

Un equipo de desarrollo quería usar el Manager App de Tomcat para desplegar de los war). Aunque al intentar subir war de más de 50MB les arrojaba el siguiente error Message: FAIL - Tried to use command /upload via a GET request but POST is required.

El log manager.log registró el siguiente error:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
SEVERE: HTMLManager: FAIL - Deploy Upload Failed, Exception: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (68626547) exceeds the configured maximum (52428800)
java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (68626547) exceeds the configured maximum (52428800)
at org.apache.catalina.connector.Request.parseParts(Request.java:2929)
at org.apache.catalina.connector.Request.parseParameters(Request.java:3252)
at org.apache.catalina.connector.Request.getParameter(Request.java:1158)
at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:382)
at org.apache.catalina.filters.CsrfPreventionFilter.doFilter(CsrfPreventionFilter.java:108)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:614)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:958)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:452)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1087)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
Caused by: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (68626547) exceeds the configured maximum (52428800)
at org.apache.tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:815)
at org.apache.tomcat.util.http.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:259)
at org.apache.tomcat.util.http.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:283)
at org.apache.catalina.connector.Request.parseParts(Request.java:2859)
... 27 more

Apache: Instalar y configurar PHP-FPM (FastCGI Process Manager)

El servidor de PHP puede ejecutarse dentro de Apache como un módulo (mod_php) o como un servidor independiente. En caso de que corra como un servidor independiente, la comunicación entre Apache y el servidor PHP puede usar:

  • CGI: es un método de comunicación entre un servidor web y una aplicación externa, es decir, las aplicaciones CGI son ejecutadas por un proceso separado del servidor web. Este proceso es creado con cada petición CGI del servidor web y finalizado cuando termina su trabajo, lo cual hace que el rendimiento CGI sea limitado y poco escalable. Es independiente al lenguaje utilizado, es decir, CGI permite interconectar el servidor web con una aplicación externa programada en cualquier lenguaje. Es un método antiguo y en desuso debido principalmente a su pobre rendimiento.
  • FastCGI: Es una evolución de CGI donde existe un proceso persistente para procesar las peticiones CGI. Es indepediente al lenguaje utilizado, es decir, CGI permite interconectar el servidor web con una aplicación externa programada en cualquier lenguaje.
  • PHP-FPM: Es una alternativa a FastCGI para PHP, donde existe un demonio PHP en espera de peticiones CGI a través de un socket TCP o UNIX. Es exclusivo para conectar el servidor web con una aplicación PHP.

En esta entrada se verá como ejecutar multiples versiones de PHP en un mismo servidor usando PHP-FPM. La versión de PHP será configurada de forma individual para cada virtualhost.

Instalar HAProxy desde el código fuente

En esta entrada se verá como compilar e instalar HAProxy desde las fuentes.

Dependencias necesarias

En RedHat/CentOS se requieren los siguientes paquetes: make, gcc, pcre-devel, openssl-devel y zlib-devel. Se pueden instalar con:

1
yum install make gcc pcre-devel openssl-devel zlib-devel

Los errores que recibirá en caso de carecer de alguna de las dependencias son:

Error 'Cannot recover key' al configurar un conector SSL en Tomcat

Al configurar el conector Tomcat de Jira para que cifre las comunicaciones, tras reiniciar el servicio, Tomcat dió el siguiente error java.io.IOException: Cannot recover key y el conector no iniciaba.

A continuación el log del Tomcat:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
20-Feb-2017 08:56:48.994 SEVERE [main] org.apache.coyote.AbstractProtocol.init Failed to initialize end point associated with ProtocolHandler ["http-bio-8443"]
java.io.IOException: Cannot recover key
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.init(JSSESocketFactory.java:518)
... 14 more
Caused by: java.security.UnrecoverableKeyException: Cannot recover key
at sun.security.provider.KeyProtector.recover(KeyProtector.java:328)
... 31 more
20-Feb-2017 08:56:48.997 SEVERE [main] org.apache.catalina.core.StandardService.initInternal Failed to initialize connector [Connector[org.apache.coyote.http11.Http11Protocol-8443]]
org.apache.catalina.LifecycleException: Failed to initialize component [Connector[org.apache.coyote.http11.Http11Protocol-8443]]
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:106)
... 19 more
Caused by: org.apache.catalina.LifecycleException: Protocol handler initialization failed
at org.apache.catalina.connector.Connector.initInternal(Connector.java:962)
... 13 more
Caused by: java.io.IOException: Cannot recover key
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.init(JSSESocketFactory.java:518)
... 19 more
Caused by: java.security.UnrecoverableKeyException: Cannot recover key
at sun.security.provider.KeyProtector.recover(KeyProtector.java:328)
... 31 more