verificación google

miércoles, 17 de octubre de 2018

Cómo instalar cvsweb en Debian 9 stretch

Esta entrada tiene relación con la anterior entrada donde hago referencia a la instalación del servidor CVS, podes consultarla y ver el porqué sigo utilizando cvs cuando existen sistemas de control de versiones mucho más potentes y populares como git.

¿Qué es CVSWEB?

Es una aplicación desde la que podemos visualizar nuestro repositorio CVS desde un navegador web. Desde CVSWEB podemos navegar entre las modificaciones que ha sufrido nuestro proyecto, así como ver quién y qué modificó en cada una de las versiones de un fichero.


Esta es una captura de pantalla del formato en el que cvsweb muestra las modificaciones de un fichero. Como podéis ver asigna una versión al fichero, nos muestra la fecha de la modificación, información sobre el usuario que realizó la modificación y en el caso de escribir algún comentario cuando se hizo el commit, se vería aquí también.

Como muchos sistemas de control de versiones también podemos ver diferencias entre las distintas versiones del fichero para ver exactamente qué se modificó.

Instalar CVSWEB

Desde la gestión de paquetes de Debian 9 stretch nos solucionan mucho la tarea de instalación de CVSWEB, simplemente tenemos que instalar el paquete cvsweb con la siguiente instrucción. 
root@desarrollo:~# apt-get install cvsweb
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias   
Leyendo la información de estado... Hecho
Se instalarán los siguientes paquetes adicionales:
  apache2 apache2-bin apache2-data apache2-utils libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libconvert-binhex-perl libicu57
  libio-pty-perl libio-socket-ssl-perl libipc-run-perl libldap-2.4-2 libldap-common liblua5.2-0 libmailtools-perl libmime-tools-perl
  libnet-smtp-ssl-perl libnet-ssleay-perl libnghttp2-14 libperl5.24 libsasl2-2 libsasl2-modules-db libtimedate-perl liburi-perl libxml2 perl
  perl-modules-5.24 perl-openssl-defaults rcs
Paquetes sugeridos:
  www-browser apache2-doc apache2-suexec-pristine | apache2-suexec-custom cvsgraph enscript libmime-types-perl zip libwww-perl perl-doc
  libterm-readline-gnu-perl | libterm-readline-perl-perl make
Paquetes recomendados:
  ssl-cert libauthen-sasl-perl libsasl2-modules xml-core rename
Se instalarán los siguientes paquetes NUEVOS:
  apache2 apache2-bin apache2-data apache2-utils cvsweb libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libconvert-binhex-perl
  libicu57 libio-pty-perl libio-socket-ssl-perl libipc-run-perl libldap-2.4-2 libldap-common liblua5.2-0 libmailtools-perl libmime-tools-perl
  libnet-smtp-ssl-perl libnet-ssleay-perl libnghttp2-14 libperl5.24 libsasl2-2 libsasl2-modules-db libtimedate-perl liburi-perl libxml2 perl
  perl-modules-5.24 perl-openssl-defaults rcs
0 actualizados, 32 nuevos se instalarán, 0 para eliminar y 0 no actualizados.
Se necesita descargar 19,1 MB de archivos.
Se utilizarán 85,3 MB de espacio de disco adicional después de esta operación.
¿Desea continuar? [S/n]
Des:1 http://deb.debian.org/debian stretch/main amd64 perl-modules-5.24 all 5.24.1-3+deb9u4 [2.724 kB]
Des:2 http://deb.debian.org/debian stretch/main amd64 libperl5.24 amd64 5.24.1-3+deb9u4 [3.522 kB]
Des:3 http://deb.debian.org/debian stretch/main amd64 perl amd64 5.24.1-3+deb9u4 [218 kB]
Des:4 http://deb.debian.org/debian stretch/main amd64 libapr1 amd64 1.5.2-5 [96,6 kB]
Des:5 http://deb.debian.org/debian stretch/main amd64 libaprutil1 amd64 1.5.4-3 [85,8 kB]
Des:6 http://deb.debian.org/debian stretch/main amd64 libaprutil1-dbd-sqlite3 amd64 1.5.4-3 [19,3 kB]
Des:7 http://deb.debian.org/debian stretch/main amd64 libsasl2-modules-db amd64 2.1.27~101-g0780600+dfsg-3 [68,2 kB]
Des:8 http://deb.debian.org/debian stretch/main amd64 libsasl2-2 amd64 2.1.27~101-g0780600+dfsg-3 [105 kB]
Des:9 http://deb.debian.org/debian stretch/main amd64 libldap-common all 2.4.44+dfsg-5+deb9u2 [85,5 kB]
Des:10 http://deb.debian.org/debian stretch/main amd64 libldap-2.4-2 amd64 2.4.44+dfsg-5+deb9u2 [219 kB]
Des:11 http://deb.debian.org/debian stretch/main amd64 libaprutil1-ldap amd64 1.5.4-3 [17,4 kB]
Des:12 http://deb.debian.org/debian stretch/main amd64 liblua5.2-0 amd64 5.2.4-1.1+b2 [110 kB]
Des:13 http://deb.debian.org/debian stretch/main amd64 libnghttp2-14 amd64 1.18.1-1 [79,1 kB]
Des:14 http://deb.debian.org/debian stretch/main amd64 libicu57 amd64 57.1-6+deb9u2 [7.700 kB]
Des:15 http://deb.debian.org/debian stretch/main amd64 libxml2 amd64 2.9.4+dfsg1-2.2+deb9u2 [920 kB]
Des:16 http://deb.debian.org/debian stretch/main amd64 apache2-bin amd64 2.4.25-3+deb9u5 [1.186 kB]
Des:17 http://deb.debian.org/debian stretch/main amd64 apache2-utils amd64 2.4.25-3+deb9u5 [217 kB]
Des:18 http://deb.debian.org/debian stretch/main amd64 apache2-data all 2.4.25-3+deb9u5 [162 kB]
Des:19 http://deb.debian.org/debian stretch/main amd64 apache2 amd64 2.4.25-3+deb9u5 [236 kB]
Des:20 http://deb.debian.org/debian stretch/main amd64 rcs amd64 5.9.4-3 [206 kB]
Des:21 http://deb.debian.org/debian stretch/main amd64 libio-pty-perl amd64 1:1.08-1.1+b2 [33,6 kB]
Des:22 http://deb.debian.org/debian stretch/main amd64 libipc-run-perl all 0.94-1+deb9u1 [99,1 kB]
Des:23 http://deb.debian.org/debian stretch/main amd64 libconvert-binhex-perl all 1.125-1 [30,5 kB]
Des:24 http://deb.debian.org/debian stretch/main amd64 libtimedate-perl all 2.3000-2 [42,2 kB]
Des:25 http://deb.debian.org/debian stretch/main amd64 perl-openssl-defaults amd64 3 [6.782 B]
Des:26 http://deb.debian.org/debian stretch/main amd64 libnet-ssleay-perl amd64 1.80-1 [285 kB]
Des:27 http://deb.debian.org/debian stretch/main amd64 libio-socket-ssl-perl all 2.044-1 [195 kB]
Des:28 http://deb.debian.org/debian stretch/main amd64 libnet-smtp-ssl-perl all 1.04-1 [6.184 B]
Des:29 http://deb.debian.org/debian stretch/main amd64 libmailtools-perl all 2.18-1 [88,5 kB]
Des:30 http://deb.debian.org/debian stretch/main amd64 libmime-tools-perl all 5.508-1 [212 kB]
Des:31 http://deb.debian.org/debian stretch/main amd64 liburi-perl all 1.71-1 [88,6 kB]
Des:32 http://deb.debian.org/debian stretch/main amd64 cvsweb all 3:3.0.6-8 [60,7 kB]
Descargados 19,1 MB en 1s (10,1 MB/s)
Extrayendo plantillas para los paquetes: 100%
Seleccionando el paquete perl-modules-5.24 previamente no seleccionado.
(Leyendo la base de datos ... 27169 ficheros o directorios instalados actualmente.)
Preparando para desempaquetar .../00-perl-modules-5.24_5.24.1-3+deb9u4_all.deb ...
Desempaquetando perl-modules-5.24 (5.24.1-3+deb9u4) ...
Seleccionando el paquete libperl5.24:amd64 previamente no seleccionado.
Preparando para desempaquetar .../01-libperl5.24_5.24.1-3+deb9u4_amd64.deb ...
Desempaquetando libperl5.24:amd64 (5.24.1-3+deb9u4) ...
Seleccionando el paquete perl previamente no seleccionado.
Preparando para desempaquetar .../02-perl_5.24.1-3+deb9u4_amd64.deb ...
Desempaquetando perl (5.24.1-3+deb9u4) ...
Seleccionando el paquete libapr1:amd64 previamente no seleccionado.
Preparando para desempaquetar .../03-libapr1_1.5.2-5_amd64.deb ...
Desempaquetando libapr1:amd64 (1.5.2-5) ...
Seleccionando el paquete libaprutil1:amd64 previamente no seleccionado.
Preparando para desempaquetar .../04-libaprutil1_1.5.4-3_amd64.deb ...
Desempaquetando libaprutil1:amd64 (1.5.4-3) ...
Seleccionando el paquete libaprutil1-dbd-sqlite3:amd64 previamente no seleccionado.
Preparando para desempaquetar .../05-libaprutil1-dbd-sqlite3_1.5.4-3_amd64.deb ...
Desempaquetando libaprutil1-dbd-sqlite3:amd64 (1.5.4-3) ...
Seleccionando el paquete libsasl2-modules-db:amd64 previamente no seleccionado.
Preparando para desempaquetar .../06-libsasl2-modules-db_2.1.27~101-g0780600+dfsg-3_amd64.deb ...
Desempaquetando libsasl2-modules-db:amd64 (2.1.27~101-g0780600+dfsg-3) ...
Seleccionando el paquete libsasl2-2:amd64 previamente no seleccionado.
Preparando para desempaquetar .../07-libsasl2-2_2.1.27~101-g0780600+dfsg-3_amd64.deb ...
Desempaquetando libsasl2-2:amd64 (2.1.27~101-g0780600+dfsg-3) ...
Seleccionando el paquete libldap-common previamente no seleccionado.
Preparando para desempaquetar .../08-libldap-common_2.4.44+dfsg-5+deb9u2_all.deb ...
Desempaquetando libldap-common (2.4.44+dfsg-5+deb9u2) ...
Seleccionando el paquete libldap-2.4-2:amd64 previamente no seleccionado.
Preparando para desempaquetar .../09-libldap-2.4-2_2.4.44+dfsg-5+deb9u2_amd64.deb ...
Desempaquetando libldap-2.4-2:amd64 (2.4.44+dfsg-5+deb9u2) ...
Seleccionando el paquete libaprutil1-ldap:amd64 previamente no seleccionado.
Preparando para desempaquetar .../10-libaprutil1-ldap_1.5.4-3_amd64.deb ...
Desempaquetando libaprutil1-ldap:amd64 (1.5.4-3) ...
Seleccionando el paquete liblua5.2-0:amd64 previamente no seleccionado.
Preparando para desempaquetar .../11-liblua5.2-0_5.2.4-1.1+b2_amd64.deb ...
Desempaquetando liblua5.2-0:amd64 (5.2.4-1.1+b2) ...
Seleccionando el paquete libnghttp2-14:amd64 previamente no seleccionado.
Preparando para desempaquetar .../12-libnghttp2-14_1.18.1-1_amd64.deb ...
Desempaquetando libnghttp2-14:amd64 (1.18.1-1) ...
Seleccionando el paquete libicu57:amd64 previamente no seleccionado.
Preparando para desempaquetar .../13-libicu57_57.1-6+deb9u2_amd64.deb ...
Desempaquetando libicu57:amd64 (57.1-6+deb9u2) ...
Seleccionando el paquete libxml2:amd64 previamente no seleccionado.
Preparando para desempaquetar .../14-libxml2_2.9.4+dfsg1-2.2+deb9u2_amd64.deb ...
Desempaquetando libxml2:amd64 (2.9.4+dfsg1-2.2+deb9u2) ...
Seleccionando el paquete apache2-bin previamente no seleccionado.
Preparando para desempaquetar .../15-apache2-bin_2.4.25-3+deb9u5_amd64.deb ...
Desempaquetando apache2-bin (2.4.25-3+deb9u5) ...
Seleccionando el paquete apache2-utils previamente no seleccionado.
Preparando para desempaquetar .../16-apache2-utils_2.4.25-3+deb9u5_amd64.deb ...
Desempaquetando apache2-utils (2.4.25-3+deb9u5) ...
Seleccionando el paquete apache2-data previamente no seleccionado.
Preparando para desempaquetar .../17-apache2-data_2.4.25-3+deb9u5_all.deb ...
Desempaquetando apache2-data (2.4.25-3+deb9u5) ...
Seleccionando el paquete apache2 previamente no seleccionado.
Preparando para desempaquetar .../18-apache2_2.4.25-3+deb9u5_amd64.deb ...
Desempaquetando apache2 (2.4.25-3+deb9u5) ...
Seleccionando el paquete rcs previamente no seleccionado.
Preparando para desempaquetar .../19-rcs_5.9.4-3_amd64.deb ...
Desempaquetando rcs (5.9.4-3) ...
Seleccionando el paquete libio-pty-perl previamente no seleccionado.
Preparando para desempaquetar .../20-libio-pty-perl_1%3a1.08-1.1+b2_amd64.deb ...
Desempaquetando libio-pty-perl (1:1.08-1.1+b2) ...
Seleccionando el paquete libipc-run-perl previamente no seleccionado.
Preparando para desempaquetar .../21-libipc-run-perl_0.94-1+deb9u1_all.deb ...
Desempaquetando libipc-run-perl (0.94-1+deb9u1) ...
Seleccionando el paquete libconvert-binhex-perl previamente no seleccionado.
Preparando para desempaquetar .../22-libconvert-binhex-perl_1.125-1_all.deb ...
Desempaquetando libconvert-binhex-perl (1.125-1) ...
Seleccionando el paquete libtimedate-perl previamente no seleccionado.
Preparando para desempaquetar .../23-libtimedate-perl_2.3000-2_all.deb ...
Desempaquetando libtimedate-perl (2.3000-2) ...
Seleccionando el paquete perl-openssl-defaults:amd64 previamente no seleccionado.
Preparando para desempaquetar .../24-perl-openssl-defaults_3_amd64.deb ...
Desempaquetando perl-openssl-defaults:amd64 (3) ...
Seleccionando el paquete libnet-ssleay-perl previamente no seleccionado.
Preparando para desempaquetar .../25-libnet-ssleay-perl_1.80-1_amd64.deb ...
Desempaquetando libnet-ssleay-perl (1.80-1) ...
Seleccionando el paquete libio-socket-ssl-perl previamente no seleccionado.
Preparando para desempaquetar .../26-libio-socket-ssl-perl_2.044-1_all.deb ...
Desempaquetando libio-socket-ssl-perl (2.044-1) ...
Seleccionando el paquete libnet-smtp-ssl-perl previamente no seleccionado.
Preparando para desempaquetar .../27-libnet-smtp-ssl-perl_1.04-1_all.deb ...
Desempaquetando libnet-smtp-ssl-perl (1.04-1) ...
Seleccionando el paquete libmailtools-perl previamente no seleccionado.
Preparando para desempaquetar .../28-libmailtools-perl_2.18-1_all.deb ...
Desempaquetando libmailtools-perl (2.18-1) ...
Seleccionando el paquete libmime-tools-perl previamente no seleccionado.
Preparando para desempaquetar .../29-libmime-tools-perl_5.508-1_all.deb ...
Desempaquetando libmime-tools-perl (5.508-1) ...
Seleccionando el paquete liburi-perl previamente no seleccionado.
Preparando para desempaquetar .../30-liburi-perl_1.71-1_all.deb ...
Desempaquetando liburi-perl (1.71-1) ...
Seleccionando el paquete cvsweb previamente no seleccionado.
Preparando para desempaquetar .../31-cvsweb_3%3a3.0.6-8_all.deb ...
Desempaquetando cvsweb (3:3.0.6-8) ...
Configurando libapr1:amd64 (1.5.2-5) ...
Configurando perl-modules-5.24 (5.24.1-3+deb9u4) ...
Configurando libperl5.24:amd64 (5.24.1-3+deb9u4) ...
Configurando libnghttp2-14:amd64 (1.18.1-1) ...
Configurando libldap-common (2.4.44+dfsg-5+deb9u2) ...
Configurando perl-openssl-defaults:amd64 (3) ...
Configurando libsasl2-modules-db:amd64 (2.1.27~101-g0780600+dfsg-3) ...
Configurando libsasl2-2:amd64 (2.1.27~101-g0780600+dfsg-3) ...
Configurando apache2-data (2.4.25-3+deb9u5) ...
Configurando libicu57:amd64 (57.1-6+deb9u2) ...
Configurando libxml2:amd64 (2.9.4+dfsg1-2.2+deb9u2) ...
Configurando rcs (5.9.4-3) ...
Configurando perl (5.24.1-3+deb9u4) ...
update-alternatives: utilizando /usr/bin/prename para proveer /usr/bin/rename (rename) en modo automático
Procesando disparadores para libc-bin (2.24-11+deb9u3) ...
Configurando libldap-2.4-2:amd64 (2.4.44+dfsg-5+deb9u2) ...
Configurando liburi-perl (1.71-1) ...
Configurando libaprutil1:amd64 (1.5.4-3) ...
Procesando disparadores para systemd (232-25+deb9u4) ...
Procesando disparadores para man-db (2.7.6.1-2) ...
Configurando liblua5.2-0:amd64 (5.2.4-1.1+b2) ...
Configurando libconvert-binhex-perl (1.125-1) ...
Configurando libaprutil1-ldap:amd64 (1.5.4-3) ...
Configurando libio-pty-perl (1:1.08-1.1+b2) ...
Configurando libaprutil1-dbd-sqlite3:amd64 (1.5.4-3) ...
Configurando libtimedate-perl (2.3000-2) ...
Configurando libnet-ssleay-perl (1.80-1) ...
Configurando apache2-utils (2.4.25-3+deb9u5) ...
Configurando apache2-bin (2.4.25-3+deb9u5) ...
Configurando libio-socket-ssl-perl (2.044-1) ...
Configurando libipc-run-perl (0.94-1+deb9u1) ...
Configurando libnet-smtp-ssl-perl (1.04-1) ...
Configurando apache2 (2.4.25-3+deb9u5) ...
Enabling module mpm_event.
Enabling module authz_core.
Enabling module authz_host.
Enabling module authn_core.
Enabling module auth_basic.
Enabling module access_compat.
Enabling module authn_file.
Enabling module authz_user.
Enabling module alias.
Enabling module dir.
Enabling module autoindex.
Enabling module env.
Enabling module mime.
Enabling module negotiation.
Enabling module setenvif.
Enabling module filter.
Enabling module deflate.
Enabling module status.
Enabling module reqtimeout.
Enabling conf charset.
Enabling conf localized-error-pages.
Enabling conf other-vhosts-access-log.
Enabling conf security.
Enabling conf serve-cgi-bin.
Enabling site 000-default.
Created symlink /etc/systemd/system/multi-user.target.wants/apache2.service → /lib/systemd/system/apache2.service.
Created symlink /etc/systemd/system/multi-user.target.wants/apache-htcacheclean.service → /lib/systemd/system/apache-htcacheclean.service.
Configurando libmailtools-perl (2.18-1) ...
Configurando libmime-tools-perl (5.508-1) ...
Configurando cvsweb (3:3.0.6-8) ...
Procesando disparadores para libc-bin (2.24-11+deb9u3) ...
Procesando disparadores para systemd (232-25+deb9u4) ...
Como podemos ver en la salida del comando, este paquete tiene muchas dependencias, entre otras el servidor Apache2. Que será el encargado de publicar cvsweb desde cgi. Sin que tengamos que instalar nada más el paquete cvsweb nos desplegará todo lo necesario para su funcionamiento. No obstante en esta última versión de Debian 9 stretch, no incorpora la configuración correcta y tendremos que hacer algunas configuraciones manuales.

Recuerdo utilizar hace años este mismo paquete y no tener que tocar nada en absoluto. Todo funcionó a la primera y sin tonar ninguna configuración extra. El propio paquete incorporaba la toda la configuración necesaria para su correcto despliegue.

Configuración de apache para CGI

Es importante que carguemos los modulos necesarios para el funcionamiento del paquete. Estos enlaces activarán los módulos necesarios para su funcionamiento.
cd /etc/apache2/mods-enabled/ && ln -s ../mods-available/cgi.load
cd /etc/apache2/mods-enabled/ && ln -s ../mods-available/cgid.conf
cd /etc/apache2/mods-enabled/ && ln -s ../mods-available/cgid.load
En mi caso estos dos enlaces ya existían previamente. No obstante verifica que existan antes de continuar.

cd /etc/apache2/mods-enabled/ && ln -s ../mods-available/alias.load
cd /etc/apache2/mods-enabled/ && ln -s ../mods-available/alias.conf

Por otro lado hay que crear este ultimo enlace para que las hojas de estilo e imágenes sean publicadas para una mejor visualización de cvsweb.
cd /var/www/ &&  ln -sd /usr/share/cvsweb/
Tras todos estos ajustes ahora únicamente nos falta reiniciar el servidor Apache2 para verlo todo funcionando correctamente.
/etc/init.d/apache2 restart


lunes, 15 de octubre de 2018

Servidor para el control de versiones de código fuente

Qué es CVS

Concurrent Versions System o simplemente CVS, es una aplicación que implementa un sistema de control de versiones: mantiene el registro de todo el desarrollo y los cambios en los ficheros (código fuente principalmente, en un único archivo para cada fichero correspondiente),​ que forman un proyecto (de programa) y permite que distintos desarrolladores colaboren. CVS se ha hizo popular en el mundo del software libre. Sus desarrolladores difunden el sistema bajo la licencia GPL.

Su primera versión fue liberada en 1986. Desde 2008 no se publican nuevas versiones.

¿Porqué ahora CVS?

A qué viene ahora hablar de CVS cuando todo el mundo habla de GIT. Pues llevo años trabajando en un proyecto donde históricamente se estaba trabajando con CVS y hace unos días se murió el servidor de desarrollo y hemos tenido de volver a instalar el sistema de control de versiones en una nueva máquina.

Muchos pensareis que sería recomendable abandonar CVS y pasar a GIT, y sí está entre mis prioridades cambiar el sistema de control de versiones. Pero planificado y organizado, no deprisa y corriendo provocado por la caída de un sistema. Lo principal es dejar los sistemas funcionado tal y como estaba funcionando y después planificar las migraciones.

Por otro lado, no creo que se migren todos los proyectos a GIT cuando planifiquemos la migración. Tenemos proyectos que se quedarán en CVS a modo de reliquias.

Instalando servidor CVS en Debian 9 stretch

Para el funcionamiento de un servidor CVS, necesitaremos instalar los paquete cvs y xinetd. Necesitamos el paquete xinetd para permitir publicar nuestro servidor CVS en la red. Con el paquete cvs podríamos trabajar únicamente en local con el control de versiones.
root@miservidordedesarrollo:~# apt-get install cvs 
Reading package lists... Done
Building dependency tree     
Reading state information... Done
Suggested packages:
  mksh rcs
The following NEW packages will be installed:
  cvs
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 2779 kB of archives.
After this operation, 4681 kB of additional disk space will be used.
Get:1 http://deb.debian.org/debian stretch/main amd64 cvs amd64 2:1.12.13+real-22+deb9u1 [2779 kB]
Fetched 2779 kB in 0s (9564 kB/s)
Selecting previously unselected package cvs.
(Reading database ... 27062 files and directories currently installed.)
Preparing to unpack .../cvs_2%3a1.12.13+real-22+deb9u1_amd64.deb ...
Unpacking cvs (2:1.12.13+real-22+deb9u1) ...
Setting up cvs (2:1.12.13+real-22+deb9u1) ...
Allowing use of questionable username.
Adding group `_cvsadmin' (GID 111) ...
Done.
Processing triggers for man-db (2.7.6.1-2) ...
root@miservidordedesarrollo:~# apt-get install xinetd
Reading package lists... Done
Building dependency tree     
Reading state information... Done
Recommended packages:
  update-inetd
The following NEW packages will be installed:
  xinetd
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 133 kB of archives.
After this operation, 316 kB of additional disk space will be used.
Get:1 http://deb.debian.org/debian stretch/main amd64 xinetd amd64 1:2.3.15-7 [133 kB]
Fetched 133 kB in 0s (1978 kB/s)
Selecting previously unselected package xinetd.
(Reading database ... 27137 files and directories currently installed.)
Preparing to unpack .../xinetd_1%3a2.3.15-7_amd64.deb ...
Unpacking xinetd (1:2.3.15-7) ...
Setting up xinetd (1:2.3.15-7) ...
Processing triggers for systemd (232-25+deb9u4) ...
Processing triggers for man-db (2.7.6.1-2) ...

Configurar servidor CVS

Ahora tenemos que configurar nuestro servidor, en primer lugar vamos a crear el directorio donde desplegaremos el repositorio. Realmente no importa demasiado el lugar donde lo despliegues, simplemente tendrás que definir la ruta elegida en los ficheros de configuración.
root@miservidordedesarrollo:~# mkdir /var/lib/cvs   
Tras crear el directorio hay que inicializar el directorio para que el servidor CVS lo interprete como raíz de repositorio de datos.
root@miservidordedesarrollo:~# cvs -d /var/lib/cvs init
Simplemente con estos pasos tendrás funcionando en tu sistema un servidor CVS para el control de versiones de tus proyectos. No obstante únicamente podrás utilizarlo de forma local y no podrás compartir tus proyectos con otros desarrolladores.

Publicar CVS en red con xinetd

Esto es un poco absurdo, en cualquier proyecto necesitarás trabajar con más desarrolladores y necesitarás un servidor para el control de versiones en red para poder de forma fácil trabajar con otros desarrolladores.

Tendrás que crear el fichero /etc/xinetd.d/cvs
root@miservidordedesarrollo:~# nano /etc/xinetd.d/cvs
Escribir el siguiente contenido:
service cvspserver
{
     port = 2401
     socket_type = stream
     protocol = tcp
     user = root
     wait = no
     type = UNLISTED
     server = /usr/bin/cvs
     server_args = -f --allow-root /var/lib/cvs pserver
     disable = no
}
Finalmente reiniciar el servidor xinetd para que coja la configuración definida.
root@miservidordedesarrollo:~# /etc/init.d/xinetd restart

viernes, 12 de octubre de 2018

Apache NetBeans 9 PHP 7 Plugins


netbeans-logo-32@3x.png

Si has instalado la nueva versión de Apache NetBeans 9 y has intentado gestionar tus proyectos PHP, te habrás dado cuenta que aún no está disponible el plugin para PHP. Y como bien nos comentan en esta entrada del blog del proyecto Apache NetBeans el 1 de octubre de 2018:

"Hi all. Today, we will briefly show you about PHP7.3 support which will be available in the next NetBeans version i.e. NetBeans 10."

Así pues tendremos que esperar hasta la versión 10 de NetBeans para utilizar de forma nativa un plugin de PHP. No obstante Apache NetBeans por ahora continua siendo compatible con los repositorios del antiguo NetBeans 8.2, de esta forma podemos añadir un repositorio con el antiguo catálogo de plugins e instalar los plugins necesarios de la antigua versión.

Es importante destacar que para la instalación de Apache NetBeans 9 será necesario tener en nuestro sistema una versión igual o superior a jdk9, aquí os dejo los enlaces de descarga para jdk11, es el jdk que yo he utilizado para mi instalación de Apache NetBeans9.

¿Cómo instalamos el plugin PHP 7 en Apache NetBeans 9?

Esto es muy simple, tenemos que añadir un nuevo catálogo. Esto se hace desde Tools > Plugins > Settings > Add y veremos la siguiente pantalla.

Ventana para Tools > Plugins > Settings > Add

Desde esta venta tendremos que añadir el nombre que le queremos dar al catálogo de plugins que en este caso hace referencia a "NetBeans IDE 8.2 Plugin Centre" y la url correspondiente al catálogo "https://updates.netbeans.org/netbeans/updates/8.2/uc/final/distribution/catalog.xml.gz".

Ventana para Tools > Plugins > Available Plugins

Ahora si desde esta misma ventana de Tools > Plugins nos dirigimos a Tools > Plugins > Available Plugins y buscamos PHP en el buscador localizado en la parte superior derecha; nos aparecerán los plugins relacionados con la palabra PHP. Marcaremos el último "PHP" y pulsaremos el botón Install.

Esto lanzará algunas ventanas para confirmar la instalación de dependencias, aceptación de términos de uso y licencias y al terminar nos solicitará reiniciar el IDE de desarrollo Apache NetBeans 9 para que funcione el nuevo plugin de PHP7 que hemos instalado.






¡¡Funciona el plugin de PHP7 bajo Apache NetBeans 9!!

Perfecto, ahora ya tenemos funcionando el plugin para PHP7 en nuestro Apache NetBeans 9. Cuando creamos un nuevo proyecto, ahora tendremos la posibilidad de seleccionar un proyecto de tipo PHP.

Lamentablemente solo podemos definir hasta la versión 7.0 de PHP con este plugin. Para utilizar hasta la versión de PHP 7.3 tendremos que esperar a la siguiente versión de Apache NetBeans 10. Pero por ahora podemos continuar trabajando con este sistema.

viernes, 14 de septiembre de 2018

Cómo instalar el cliente "no-ip" en GNU/Linux Debian 9 Stretch e iniciar en el arranque

logo https://www.noip.com


En esta nueva entrada vamos a realizar la instalación de un DUC (Dynamic Update Client). En concreto se trata de un cliente para la actualización de nuestra IP en un registrador de dominios correspondiente a la marca noip (https://www.noip.com) en  GNU/Linux Debian 9 Stretch y hacer que inicie automáticamente al iniciar la máquina.




Cuando es necesario utilizar un DNS dinámico (Dynamic DNS)

Un DNS dinámico se utiliza cuando no dispones de una dirección IP fija en tu conexión a internet. Esto quiere decir que cada vez que tu router se desconecte tu proveedor de internet le asiganará una dirección IP nueva.

Esto es lo normal y no tiene porqué ser ningún problema. Pero cuando queremos correr algún servicio (web, correo, ftp, ldap, etc.) y queremos publicarlo en internet entonces sí es un problema. Puesto que no podremos configurar ningún dominio apuntando a nuestra IP para publicar el servicio.

Algunas empresas como www.noip.com nos facilitan esto con el uso de DNS dinámicos. El sistema es simple, corremos un servicio dentro de nuestra red que le envíe peticiones a los servidores de www.noip.com, estos servidores identifican esa petición y vinculan la IP desde la que viene la petición con el dominio que hemos configurado.

De esta forma "siempre"* tendremos acceso a los servicios que hemos publicado en nuestra red con salida a internet con IP dinámica.

* digo "siempre" entrecomillado porque este servicio no deja de ser un proceso que cada cierto tiempo envía una petición a los servidores de www.noip.com, puede que tu proveedor de internet por alguna razón cambie tu IP y el dominio configurado en www.noip.com pase algunos minutos sin apuntar correctamente a la dirección IP correcta. Hasta que vuelva a despertarse el servicio y actualice los datos. Por esta razón no aconsejo utilizar este tipo de utilidades para servicios críticos. Si tienes un servicio critico, contrata con tu proveedor de internet una dirección ip fija.

Por otro lado he encontrado algunos routers desde los que se pueden establecer estas configuraciones, de forma que cada vez que cambia de IP le envía la actualización al servidor de www.noip.com. Este método es algo más seguro. Mira si tu router dispone de esta opción.

Instalando el cliente de www.noip.com

Abrimos un terminal identificamos como root, necesitaremos permisos de administrador para realizar todas estas operaciones. Si no tenemos instalado gcc, lo instalamos con este comando:
apt install build-essential gcc
Una vez instalado bajamos el cliente en el directorio /usr/local/src:
cd /usr/local/src
Bajamos el cliente a instalar:
wget http://www.no-ip.com/client/linux/noip-duc-linux.tar.gz
Lo descomprimimos:
tar xzf noip-duc-linux.tar.gz
Entramos en el directorio resultante de la descompresión:
cd noip-2.1.9-1
Ejecutamos los 2 siguientes comandos:
make
make install
Si te aparece un mensaje como "make not found" o "missing gcc" es que no has instalado el gcc. Tendrás que instalar un paquete llamado build-essential que es el que contiene todas las utilidades necesarias para realizar las operaciones de compilado de un código fuente. Y posiblemente no has ejecutado el primer paso.

Configurando el cliente

Antes de configurar el cliente es necesario que tengas una cuenta activa en www.noip.com, si aún no la tienes creala. Los tres primeros host son gratis bajo un subdominio que ellos te facilitarán.

Seguimos como root y ejecutamos este comando:
/usr/local/bin/noip2 -C
La "C" tiene que ser mayúscula, con esto empieza el asistente de configuración propiamente dicho y pedirá el correo con el que nos registramos y la contraseña. Luego viene una pregunta importante "Do you wish to update ALL hosts?". Si tenemos varios host creados y respondemos "Yes" nos va a actualizar todos ellos, si respondemos "No" nos va a ir preguntando uno a uno cuales queremos actualizar y luego cada cuantos minutos queremos actualizar.

Ahora ya tenemos el cliente instalado y configurado, podemos ejecutarlo, se quedará funcionando en background:
/usr/local/bin/noip2

Iniciar el cliente con el arranque

Ya tenemos funcionando el cliente, pero nos interesa que cada vez que arranquemos el equipo no tener que ejecutar el comando manualmente, automatizarlo. Para ello creamos un script dentro de "/etc/init.d" con este comando:
nano /etc/init.d/noip2
Y pegamos en él este código:
#! /bin/sh
# /etc/init.d/noip2
# Supplied by no-ip.com
# Modified for Debian GNU/Linux by Eivind L. Rygge <eivind@rygge.org>
# Updated by David Courtney to not use pidfile 130130 for Debian 6.
# Updated again by David Courtney to "LSBize" the script for Debian 7.
### BEGIN INIT INFO
# Provides:     noip2
# Required-Start: networking
# Required-Stop:
# Should-Start:
# Should-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start noip2 at boot time
# Description: Start noip2 at boot time
### END INIT INFO
# . /etc/rc.d/init.d/functions  # uncomment/modify for your killproc
DAEMON=/usr/local/bin/noip2
NAME=noip2
test -x $DAEMON || exit 0
case "$1" in
    start)
    echo -n "Starting dynamic address update: "
    start-stop-daemon --start --exec $DAEMON
    echo "noip2."
    ;;
    stop)
    echo -n "Shutting down dynamic address update:"
    start-stop-daemon --stop --oknodo --retry 30 --exec $DAEMON
    echo "noip2."
    ;;
    restart)
    echo -n "Restarting dynamic address update: "
    start-stop-daemon --stop --oknodo --retry 30 --exec $DAEMON
    start-stop-daemon --start --exec $DAEMON
    echo "noip2."
    ;;
    *)
    echo "Usage: $0 {start|stop|restart}"
    exit 1
esac
exit 0

Salimos guardando los cambios y le damos permisos de ejecución:
chmod +x /etc/init.d/noip2
Lo añadimos al inicio con el comando:
cd /etc/init.d/ && update-rc.d noip2 defaults 
Después de reiniciar podemos comprobar que está funcionando con el comando:
ps aux --forest 
Donde podemos ver el proceso de noip2 ejecutándose correctamente.
ps aux --forest
O este otro propio de noip2:
/usr/local/bin/noip2 -S
Que nos devolverá algo parecido a esto:
1 noip2 process active.
Process 135, started as noip2, (version 2.1.9)
Using configuration from /usr/local/etc/no-ip2.conf
Last IP Address set *.*.*.*
Account jmruiz@openhr.cloud
configured for:
host  midominio.ddns.net
Updating every 30 minutes via /dev/eth0 with NAT enabled.

martes, 21 de agosto de 2018

Actualizar de Proxmox 4 a Proxmox 5, Debian 8 Jessie a Debian 9 Stretch



Si recientemente has actualizado tu Proxmox 4 habrás visto el mensaje "Support for Proxmox VE 4.4
ends on June 30, 2018". Así que ha llegado el momento de actualizar a la última versión Proxmox 5.

Este artículo está basado en la fuente principal en la web de www.proxmox.com en su wiki de soporte: https://pve.proxmox.com/wiki/Upgrade_from_4.x_to_5.0 consúltalo para más ayuda.

En términos generales, existen dos posibilidades para pasar de Proxmox 4 a Proxmox 5.
  1. La primera opción es realizar una nueva instalación en hardware nuevo para posteriormente restauración de máquinas virtuales desde la copia de seguridad. 
  2. La segunda opción es realizar una actualización en a través de apt, paso a paso.
En cualquier caso, será necesario que vacíes la memoria caché del navegador después de la actualización y vuelvas a cargar la página de la GUI o existe la posibilidad de que veas muchas fallas.

Seguramente si utilizas tu servidor de virtualización Proxmox como laboratorio de pruebas como lo hago yo, es muy probable que no tengas disponible nuevo hardware para realizar una nueva instalación y realizar una migración de todas las máquinas virtualizadas.

Así pues en nuestro caso vamos a poner en practica la opción de actualizar; nos disponemos a actualizar Proxmox desde el repositorio de APT. Vamos a aclarar que esta actualización en Debian de proxmox va asociada a la versión de Debian que corremos. Proxmox 4 está asociado a la versión Debian 8 (Jessie) mientras que Proxmox 5 está asociado a la versión Debian 9 (Stretch), por tanto principalmente lo que haremos para hacer la actualización de Proxmox es una actualización de repositorios para utilizar la última versión de Debian  9 (Stretch). 

IMPORTANTE: Tal y como especifican en el manual oficial de Proxmox; debes saber antes de comenzar si usa ceph, actualice su clúster Ceph a la versión Luminous antes de actualizar, siguiendo el artículo Ceph Jewel to Luminous.

Antes de actualizar

Principalmente nos tenemos que asegurar antes de actualizar de cumplir los siguientes puntos:
  • Tenemos copia de seguridad de todas las máquinas virtuales.
  • Todo el sistema está funcionando correctamente. 
  • Todas las máquinas virtuales están correctamente apagadas. 
  • Asegurarnos de estar en la última versión (Proxmox 4.4) antes de iniciar el proceso de actualización a Proxmox 5, para ello ejecutar: 
    • apt-get update && apt-get dist-upgrade
  • Mi ultima recomendación personal es reiniciar el sistema con todas las máquinas sin iniciar (start on boot OFF).

Comenzamos la actualización: 

Los pasos para la actualización sin pocos y simples como puedes ver. 

1. Cambiar en nuestro sources.list de nombre de versión, cambiando de jessie a stretch. Puede que no estemos utilizando el nombre de la versión en nuestro sources.list asegúrate. 
sed -i 's/jessie/stretch/g' /etc/apt/sources.list
1.1. Igualmente hay que cambiar el nombre de la versión en nuestro fichero pve-enterprise.list, en mi caso tenía el repositorio de Proxmox en el propio sources.list, puesto que este Proxmox venía de una versión anterior donde el repositorio simplemente se añadía en el sources.list principal.
sed -i 's/jessie/stretch/g' /etc/apt/sources.list.d/pve-enterprise.list
2. Actualizar nuestra lista de repositorios con la actual Stretch.
apt-get update
3. Descargar e instalar las nuevas versiones de paquetes.
apt-get dist-upgrade

Este último paso en el proceso de actualización será el más largo y también dependerá mucho de nuestra linea de acceso a internet. Puesto que tiene que descargar todos los paquetes necesarios para la actualización y posteriormente desempaquetarlos e instalarlos.

Además durante el proceso de instalación algunos paquetes requieren de la intervención del usuario, para solicitar la confirmación de reinicio de algunos servicios esenciales para el sistema (ssh, postfix, ...) o para solicitar confirmación de instalación de los ficheros de configuración del desarrollador o bien mantener los existentes. 

IMPORTANTE: Actualizar desde terminal ssh

Si pretendes hacer la actualización desde un terminal ssh no ejecutes el comando "apt-get dist-upgrade" directamente en el terminal ssh. Podrías perder la conexión por cualquier motivo y no sabrás cómo/cuando terminó el proceso de actualización o si el proceso solicita de tu intervención, el proceso de actualización quedará paralizado y puede dejar el sistema en un estado inestable. 

Siempre que necesito ejecutar un proceso largo o con cierto nivel de riesgo para la estabilidad del sistema en mis sistemas, utilizo "screen". Este comando nos permite "virtualizar" un terminal que cuelga del raíz de procesos del sistema, es decir, pese a ejecutar screen desde un terminal ssh el proceso colgará fuera del proceso ssh y si perdemos la conexión nuestros procesos seguirán su curso y podremos volver a recuperarlos cuando lo necesitemos. 

Puedes visitar un artículo que escribí hace tiempo en este blog sobre screen, pero te dejo los comandos básicos de screen aquí como ayuda:
  • Crear un terminal: screen -dmS ProcesoUpgrade
  • Acceder al terminal con el nombre ProcesoUpgrade: screen -r ProcesoUpgrade
  • Atajo de teclado para salir del terminal screen sin cerrar el proceso que hemos ejecutado: ctrl+a+d

jueves, 19 de julio de 2018

Ampliar disco máquina virtual

Este es un pequeño manual que describe el procedimiento a seguir para ampliar el tamaño de un disco duro virtual. En mi caso he utilizado una máquina virtual KVM con un disco virtual de tipo ".qcow2". Depende del tipo de máquina virtual que utilices podrás aprovechar algunas partes de este manual.

1. Modificar tamaño de la imagen

En primer lugar tenemos que modificar la definición del fichero ".qcow2" para que tenga un tamaño mayor. Cuando se crea se define un tamaño y este será el tamaño máximo que tomará. Depende del sistema de virtualización que utilices te permitirá hacerlo desde el entorno de administración o no.

Por ejemplo Proxmox (versión 3.1) permite modificar el tamaño de las imágenes ".qcow2" de una forma muy sencilla; desde un botón "Resize disk", donde nos pregunta cuanto queremos ampliar el tamaño de la imagen.

Pero si no utilizas Proxmox, puedes utilizar la herramienta "qemu-img" para modificar el tamaño máximo de tu ".qcow2". Para modificar el tamaño aumentando en 10GB utiliza:
qemu-img resize fichero.qcow2 +10G
Para consultar el tamaño que tiene actualmente definido el fichero puedes utilizar el siguiente comando:
qemu-img info fichero.qcow2

2. Modificar tabla de particiones

Bien ahora nuestra máquina virtual ya tiene más capacidad, pero el sistema operativo que la gestiona aún no se ha enterado. Tenemos que modificar la tabla de particiones de nuestro disco para hacer que aumente el tamaño de la partición y así poder comenzar a utilizar este nuevo espacio.

Este tipo de operaciones sobre la tabla de particiones del disco, hay que hacerlas con el sistema de ficheros desmontado. Si estamos trabajando sobre el sistema de ficheros principal, será necesario arrancar con un CD Live (digo cd live, pero puede ser usb live) para poder trabajar con el sistema desmontado.

Existen muchas herramientas para la manipulación de tablas particiones de los discos desde sistemas "live", yo he utilizado clonezilla. Es un poco tosca y posiblemente nada amigable, pero una vez que sabes utilizar las herramientas básicas desde linea de comando no tendrás problemas con ninguna otra y podrás utilizarlas en cualquier sistema.

El disco que yo quería aumentar su tamaño era el disco principal y tenía; por un lado la partición principal del sistema y a continuación de esta una partición extendida que contenía la partición para swap. Y tras todas las particiones tenía el nuevo espacio libre sin definir.

Para aumentar el tamaño de la partición principal tenía que eliminar la partición extendida y así poder aumentar el tamaño a la partición principal sin pisar el espacio que ocupa la partición para la swap.

Con herramientas como gparted se puede directamente redimensionar el tamaño de una partición, pero en mi caso utilicé fdisk y éste no tiene un procedimiento directo para la redimensión de una partición, así que hay que hacerlo manualmente. Para hacer la redimensión de la partición principal hay que eliminarla. Sí, parece arriesgado y da algo de miedo hacerlo sobre un sistema en explotación, pero según he buscado por internet es el único modo. Así que con fdisk:

  1. Borramos la partición principal.
  2. Creamos una nueva partición que comienza donde la que hemos borrado y termina donde queramos.
  3. Creamos la partición para swap.
  4. Establecemos la marca de arranque si fuera necesario para la nueva partición principal.
  5. Escribimos los cambios y salimos de fdisk.



http://vostorga.org/?p=42
https://wiki.debian.org/Swap








Limpiar paquetes nvidia en debian


Desinstalar todo rasto de paquetes nvidia.

El primer paso es localizar los paquetes con relación nvidia he utilizado:
aptitude search nvidia | grep ^i
En la instalación de Ubuntu por defecto no está instalado el paquete aptitude. Para instalar apt-get install aptitude.

Simplemente hacemos un aptitude remove de todos los paquetes que hemos obtenido en el listado anterior.

Ahora ha llegado el momento de instalar los nuevos drivers.

Descargamos el drivers para Linux 64bit desde nvidia.com; wget http://es.download.nvidia.com/XFree86/Linux-x86_64/310.19/NVIDIA-Linux-x86_64-310.19.run

jmruiz@jmruiz-Aspire-V3-571G:~/Descargas$ wget http://es.download.nvidia.com/XFree86/Linux-x86_64/310.19/NVIDIA-Linux-x86_64-310.19.run
--2012-11-17 11:46:06--  http://es.download.nvidia.com/XFree86/Linux-x86_64/310.19/NVIDIA-Linux-x86_64-310.19.run
Resolviendo es.download.nvidia.com (es.download.nvidia.com)... 217.212.238.51, 217.212.238.64, 217.212.238.59
Conectando con es.download.nvidia.com (es.download.nvidia.com)[217.212.238.51]:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 68022245 (65M) [application/octet-stream]
Grabando a: “NVIDIA-Linux-x86_64-310.19.run”
100%[=======================================================================================================>] 68.022.245  3,84M/s   en 20s  
2012-11-17 11:46:26 (3,24 MB/s) - “NVIDIA-Linux-x86_64-310.19.run” guardado [68022245/68022245]

sudo stop lightdm

chmod 775 NVIDIA-Linux-x86_64-310.19.run

(sudo) ./NVIDIA-Linux-x86_64-310.19.run





miércoles, 11 de julio de 2018

Ocultar versión de PHP en cabeceras

Si eres desarrollador de PHP esto te interesa cuando pases tus aplicaciones a producción. En tu servidor de explotación es recomendable modificar el fichero php.ini u poner en off la variable "expose_php", de esta forma nadie viendo tu aplicación en ejecución podrá saber qué versión de PHP corre en tu servidor.

Esto es altamente recomendable para evitar que la publicación de una vulnerabilidad para la versión de PHP que utilizas haga que tu servidor sea el foco de todas las miradas.
php.ini
expose_php = Off
Cuando ves las cabeceas de los paquetes podrás ver algo como:
X-Powered-By: PHP/5.3.8
Y simplemente cunado cuando cambiar la variable a off desaparece esta información.

IMPORTANTE: Esto no es una solución frente a vulnerabilidades, la solución es actualizar a una versión no vulnerable. Simplemente evitaremos que "gritar" al mundo qué versión de PHP utilizamos.

martes, 10 de julio de 2018

Contar lineas desde linux en /bin/bash con el comando wc

Seguro que en muchas ocasiones has necesitado contar lineas desde la consola de linux. Yo en alguna ocasión (antes de conocer el comando wc) he copiado desde el terminal para pegar en un calc o alguna otra aplicación de más alto nivel para contar un resultado. Pero puede que esto no lo tengas siempre disponible y sabemos que siempre es mucho más rápido realizar operaciones directamente en la linea de comandos.

Contar las líneas de un fichero con el comando wc

Los usuarios de GNU/Linux disponemos del comando wc (sigla de Word Count). Este comando nos permite contar las líneas (entendiendo como tal el número de caracteres nueva línea), bytes o palabras.

Para contar las líneas, simeplemente ejecutamos:
wc -l <fichero>
En <fichero> se introduce el nombre o nombres de los archivos en los que queremos efectuar el recuento. Cuando son varios los archivos, el comando devuelve, además, una línea resumen con la suma de los conteos efectuados.

Contar palabras de un fichero con el comando wc

Podemos también utilizar el comando wc para contar palabras, en cuyo caso se consideran como tal las secuencias de longitud no-nula delimitadas por espacios o directamente caracteres. En este caso, la llamada  sería:
wc -w 1<fichero>
Otras opciones interesantes son el uso de los modificadores -c y -m, que te devuelven el número de bytes y/o caracteres del archivo, respectivamente. Hay que destacar que el carácter de fin de línea también se cuenta. Para terminar destacamos el modificador -L, que nos devuelve la longitud máxima de línea.

Contar salida de un comando con wc

Esta será posiblemente la opción que más utilizo personalmente cuando necesito utilizar el comando wc. Consiste en desviar la salida de un comando utilizando tuberías (pipes) a la entrada del siguiente comando, en este caso wc.

Por hacer un ejemplo muy simple, en lugar de contar las lineas de un fichero utilizando:
wc -l mifichero.txt
También podríamos utilizar:
cat mifichero.txt | wc -l
Estos dos comandos realizarán la misma operación; contar el número de lineas del fichero mifichero.txt, pero con esta funcionalidad podríamos realizar operaciones mucho más interesantes. Podríamos crearnos un script que realice distintos procesos en su interior y posteriormente contar el resultado.
./miscript.bash | wc -l

Otras opciones

Si empleamos wc sin archivos de entrada, el conteo se hará sobre la entrada estándar y se contará sobre lo que escribamos en consola. para salir de este modo, se pulsará Ctrl+D y el programa nos devuelve los valores que hemos pedido al invocar el comando.

Por último, os indico que si invocamos el comando sin opciones de conteo (contar las líneas, las palabras, etc), el comando nos devolverá directamente cuatro columnas: la cuenta de palabras, de líneas y de bytes totales del archivo.

martes, 3 de julio de 2018

Instalar tablefunc extension en PostgreSQL 9.6 para utilizar crosstab


El módulo "tablefunc" incluye varias funciones que devuelven tablas, es decir, obtendremos varias filas. En el siguiente enlace os dejo disponible la documentación para su correcto uso.

https://www.postgresql.org/docs/9.6/static/tablefunc.html

Tengo una entrada en este blog sobre como instalar PostgreSQL en un linux Debian partiendo del código fuente (tengo pendiente hacer una actualización de esta entrada) y en lugar de utilizar el repositorio de paquetes del sistema.

En esta entrada veremos como partiendo de esa instalación compilando el código fuente de PostgreSQL, incorporaremos la extensión tablefunc. Si buscas un poco encontrarás que para hacer uso de las funciones contenidas en tablefunc será necesario ejecutar como usuario administrador la sentencia "create extension tablefunc". Y posiblemente si has llegado hasta aquí, obtuviste como resultado algo parecido a "ERROR:  could not access file "$libdir/tablefunc": No existe el fichero o el directorio".
echo 'create extension tablefunc' | psql -U usuario base_de_datos
ERROR:  could not access file "$libdir/tablefunc": No existe el fichero o el directorio
Si es así está es tu solución. ¿Recuerdas cuando compilaste PostgreSql? Pues mira en aquel directorio donde encontrarás dentro de contrib al directorio contrib/tablefunc. Dirígete a ese directorio y ejecuta "make" y "make install".
root@myhost:~/descargas/postgresql-9.6.3/contrib/tablefunc# make
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -fpic -I. -I. -I../../src/include -D_GNU_SOURCE   -c -o tablefunc.o tablefunc.c
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -fpic -L../../src/port -L../../src/common -Wl,--as-needed -Wl,-rpath,'/opt/postgresql-9.6.3/lib',--enable-new-dtags -lm  -shared -o tablefunc.so tablefunc.o
root@myhost:~/descargas/postgresql-9.6.3/contrib/tablefunc# make install
/bin/mkdir -p '/opt/postgresql-9.6.3/share/extension'
/bin/mkdir -p '/opt/postgresql-9.6.3/share/extension'
/bin/mkdir -p '/opt/postgresql-9.6.3/lib'
/usr/bin/install -c -m 644 ./tablefunc.control '/opt/postgresql-9.6.3/share/extension/'
/usr/bin/install -c -m 644 ./tablefunc--1.0.sql ./tablefunc--unpackaged--1.0.sql  '/opt/postgresql-9.6.3/share/extension/'
/usr/bin/install -c -m 755  tablefunc.so '/opt/postgresql-9.6.3/lib/'
Ahora sí al ejecutar "CREATE EXTENSION tablefunc;" se instalará sin problemas y ya tendrás disponibles las funciones incluidas en tablefunc.

Ejemplo de utilización de crosstab

Una de las funciones más utilizadas de tablefunc es crosstab. Aquí dejo un simple ejemplo de ventas donde pivotaremos los costes de cada uno de los meses a columnas, de forma que nos quedará un registro (fila) por ejercicio.

Crearemos unos datos de prueba para trabajar

CREATE TABLE sales(year int, month int, qty int);
INSERT INTO sales VALUES(2017, 1, 1000);
INSERT INTO sales VALUES(2017, 2, 1500);
INSERT INTO sales VALUES(2017, 7, 500);
INSERT INTO sales VALUES(2017, 11, 1500);
INSERT INTO sales VALUES(2017, 12, 2000);
INSERT INTO sales VALUES(2018, 1, 1000);
INSERT INTO sales VALUES(2019, 5, 2500);
INSERT INTO sales VALUES(2019, 9, 800);

SELECT * FROM sales;
 year | month | qty 
------+-------+------
 2017 |     1 | 1000
 2017 |     2 | 1500
 2017 |     7 |  500
 2017 |    11 | 1500
 2017 |    12 | 2000
 2018 |     1 | 1000
 2019 |     5 | 2500
 2019 |     9 |  800
(8 rows)

Uso de crosstab

SELECT * FROM crosstab(
  $$ SELECT year, month, qty FROM sales ORDER BY 1 $$,
  $$ SELECT m FROM generate_series(1,12) m $$
) AS (
  year int, "Jan" int, "Feb" int, "Mar" int, "Apr" int, "May" int, "Jun" int, "Jul" int, "Aug" int, "Sep" int, "Oct" int, "Nov" int, "Dec" int
);

 year | Jan  | Feb  | Mar | Apr | May  | Jun | Jul | Aug | Sep | Oct | Nov  | Dec 
------+------+------+-----+-----+------+-----+-----+-----+-----+-----+------+------
 2017 | 1000 | 1500 |     |     |      |     | 500 |     |     |     | 1500 | 2000
 2018 | 1000 |      |     |     |      |     |     |     |     |     |      |   
 2019 |          |      |     |     | 2500 |     |     |     | 800 |     |      |   
(3 rows)

martes, 26 de junio de 2018

Instalar SQL Developer 18.1 en Linux

Esta entrada corresponde a una actualización de la entrada correspondiente a Instalar SQL Developer 4.0.1.14.18 en Ubuntu 14.04, está muy anticuada y ya era hora de actualizarla.

En la anterior entrada fue una instalación específica para Ubuntu por ser el sistema operativo que utilizaba en aquel momento. Ahora he vuelto a Debian y por eso esta entrada no es específica para Ubuntu, no obstante debería funcionar en casi cualquier GNU/Linux.

SQL Developer me sigue pareciendo una solución muy cómoda y rápida de acceder a los objetos de una instancia Oracle BD. Es una herramienta gráfica gratuita que simplifica las tareas de desarrollo de bases de datos. Puede explorar objetos de base de datos, ejecutar sentencias de SQL y script SQL, editar y depurar declaraciones de PL/SQL, manipular y exportar datos, y ver y crear informes. Puede conectarse a bases de datos Oracle, y puede conectarse a bases de datos seleccionadas de terceros (que no sean de Oracle), ver metadatos y datos, y migrar estas bases de datos a Oracle.

Requisitos para la instalación de SQL Developer 18.1

Tanto para descargar SQL Developer como JDK necesitaréis un usuario de Oracle que podréis obtener rápidamente si os registráis en www.oracle.com

Descargar SQL Developer 18.1

En primer lugar hay que descargar el zip correspondiente a SQL Developer 18.1 para otras plataformas, que encontrarás al final del siguiente enlace.

http://www.oracle.com/technetwork/developer-tools/sql-developer/downloads/index.html

sqldeveloper-18.1.0.095.1630-no-jre.zip

Para descomprimir ejecutar los siguientes comandos:
unzip sqldeveloper-18.1.0.095.1630-no-jre.zip
mv sqldeveloper /opt/sqldeveloper-18.1

Descargar jdk8 

Por otro lado necesitamos jdk8, podemos descargarlo de la página oficial en el siguiente enlace.

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

Yo prefiero instalar desde tgz para así utilizar en cada momento el jdk que necesite, en mi caso he descargado jdk-8u171-linux-x64.tar.gz, para descomprimirlo simplemente ejecuta el siguiente comando:
tar xvzf jdk-8u171-linux-x64.tar.gz -C /opt/
De esta forma tendremos disponible en /opt/jdk1.8.0_171/ la jdk8 lista para funcionar.

Ejecutar SQL Developer 18.1

Tras intentar ejecutar SQL Developer 18.1 si no tenéis configurado el JDK8 por defecto como vuestro JDK por defecto obtendréis el siente error.
/opt/sqldeveloper-18.1/sqldeveloper.sh
 Oracle SQL Developer
 Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
Found ../../jdk/bin/java to run this product, and the major version of this Java is 1.7.
The mandatory minimum major version to run this product is 1.8.
This product cannot run with this Java.
Type the full pathname of a JDK installation (or Ctrl-C to quit), the path will be stored in /home/jmruiz/.sqldeveloper/18.1.0/product.conf
El problema es que SQL Developer 18.1 necesita de JDK8 y tenemos configurado JDK7 para utilizar por defecto en nuestro sistema. Pero SQL Developer está preparado (como vimos en la entrada anterior) para funcionar con un JDK definido en su fichero de configuración.

Para realizar esta configuración editaremos el fichero /home/<usuario>/.sqldeveloper/18.1.0/product.conf y añadiremos la siguiente linea:
SetJavaHome /opt/jdk1.8.0_171
De esta forma SQL Developer sabrá cuál es la ubicación del JDK necesario para su inicio.

Y ahora sí al ejecutar /opt/sqldeveloper-18.1/sqldeveloper.sh podremos ver la pantalla de carga...


Y tras unos instantes, podremos comenzar a trabajar con SQL Developer 18.1


En la entrada anterior hice referencia a un error para GNOME que lamentablemente no puedo verificar si sucede en esta versión porque me he pasado a XFCE que me parece un entorno de escritorio mucho más rápido y estable.

Para terminar os dejo un enlace a la guía de usuario de Oracle SQL Developer 18.1 en PDF.

martes, 19 de junio de 2018

Buscar y reemplazar texto en bash

En muchas ocasiones me he encontrado con la necesidad de hacer un buscar reemplazar en el bash de linux. Hay muchas opciones para hacerlo, comentaré aquí algunas de las que yo utilizo por si a alguien la es de utilidad.

Utilizar editor nano desde bash para buscar y reemplazar un texto

La primera opción es utilizar un editor de texto cualquiera para hacer un buscar y reemplazar, yo utilizo nano por lo fácil y rápido que es. Te permite abrir fichero de texto muy pesados sin cargar demasiado tu equipo.

Una vez estas en nano simplemente presionas la combinación de teclas ctrl + w para buscar y después ctrl + r para reemplazar, esto te pedirá primero el texto a buscar, después el texto a reemplazar y para terminar preguntará si quieres reemplazar todas las coincidencias o únicamente la primera.





Una buena opción; crear un script /bin/bash para buscar y reemplazar un texto

Esta opción es muy útil cuando necesitamos hacer un buscar y reemplazar automatizado por ejemplo en un fichero de configuración. Yo lo utilizo en ficheros de configuración de apache para virtualhost, tengo una plantilla y cuando tengo que crear un nuevo virtualhost lo creo con un script automatizado de este estilo.
#!/bin/bash
primeraCadena="Amo con locura a mi hijo y a mi mujer."
segundaCadena="familia"
echo "${primeraCadena/hijo y a mi mujer/$segundaCadena}" 
Este script buscará en la cadena base "Amo con locura a mi hijo y a mi mujer." el texto "hijo y a mi mujer" y lo reemplazará por "familia", para después imprimir el resultado "Amo con locura a mi familia".

Esto puede ser útil pero cuando queremos hacer un buscar reemplazar en un fichero de configuración normalmente tenemos el mismo nombre en muchos sitios que tenemos que reemplazar (ficheros de configuración, ruta de directorios, nombre de dominios...). Para esto dejo aquí este pequeños script:
#!/bin/bash
apache=`cat apache.conf`
echo "${apache//instancia/$1}"
En primer lugar cargamos el fichero apache.conf en una variable, hay que destacar que las comillas utilizas son las comillas de ejecución y no las comillas de cadena de texto.

Después procedemos a reemplazar todas las palabras "instancia" por el primer parámetro que le pasamos en la ejecución del fichero.

El script tendríamos que ejecutarlo de la siguiente forma:
./buscar_reemplazar.bash nuevaInstancia
Su ejecución nos devolverá el contenido del fichero que necesitaremos para apache reemplazando la palabra "instancia" del fichero plantilla por "nuevaInstancia".

La opción más rápida; utiliza el comando sed para buscar y reemplazar textos

El comando sed es ampliamente utilizado en linux y lo puedes utilizar para escribir de forma sencilla y rápida una linea de comando para hacer un buscar y reemplazar en un fichero de texto.
sed -i 's/antigua/nueva/g' prueba.txt
Directamente con este simple comando buscará en el fichero prueba.txt todas las coincidencias con "antigua" y las reemplazará por "nueva". El resultado quedará guardado en el mismo fichero gracias al modificador " -i ".

Si prescindimos de este modificador obtendremos el resultado por la salida estandar de la consola. Y podemos desviar éste resultado a un fichero.
sed 's/antigua/nueva/g' prueba.txt > resultado.txt