jueves, enero 27, 2005

Problemas con CVS, RedHat y pserver?

Creo que la mayor de las complicaciones entorno a CVS es la correcta inicialización del repositorio, de forma tal que sea segura y que funcione correctamente.

Este pequeño artículo trata de cubrir precisamente este problema, y aunque el material expuesto es fiel reflejo de los que se encuentran en Internet, he tratado de complementarlo con un ejemplo concreto, más los correspondientes comandos Unix/Linux que facilitan la tarea.

Nota: Dependiendo de la distribución de Linux que usemos algunos archivos de configuración pueden variar. En mi caso particular la distribución que uso es Mandrake Linux 9.1

Habilitando el servicio para tener acceso vía pserver

CVS prosee principalmente cuatro métodos de acceso remoto:

  • rsh: En la cual la seguridad en nula. Pero donde no es necesario modificar el archivo inetd.conf (o xinetd.conf dependiendo de la distribución de Linux)

  • ssh: Aquí el tema de la seguridad es mucho mayor, pero obliga a que los usuarios del repositorio tengan una cuenta local en el sistema y aunque tampoco debemos configurar el archivo inetd.conf, lamentablemente posee el inconveniente de tener que ingresar nuestra password cada vez que operamos sobre nuestros módulos, a menos claro que usemos una herramienta visual que guarde nuestra password al menos durante la sesión. (Recomiendo TortoiseCVS para Windows y Cervisia para Linux)

  • pserver: Este tipo de acceso permite un acceso genérico al repositorio sin necesidad de crear una cuenta de sistema por cada usuario. Mejor en seguridad que rsh, pero más débil que ssh. Sin embargo, se debe configurar el archivo inetd.conf.

  • Kerberos: Bueno, no tengo mucho que decir al respecto, sé que es muy superior en seguridad, pero la verdad es que hasta ahora nunca he visto el tema de Kerberos, ni siquiera en forma remota.
Como en la mayoria de los proyectos de SourceForge y otros desarrollos de código abierto, nos enfocaremos al método pserver, por lo que nuestro primer paso es configurar el archivo inetd.conf.



El caso inetd.conf

Este archivo se encuentra en /etc en la mayoria de los sistemas Linux, y las líneas que debemos agregar son las siguientes:

cvspserver stream tcp nowait root /usr/sbin/tcpd /usr/bin/cvs -b /usr/bin -f --allow-root=/var/lib/cvs pserver


Todo en una sóla línea y donde /var/lib/cvs es el directorio donde crearemos nuestro repositorio. En algunos casos es necesario modificar el archivo /etc/hosts.allow y agregar la línea cvs: ALL para garantizar la conexión.

El caso xinetd.conf

En realidad el archivo a configurar en la distribución que uso es /etc/xinetd.d/cvs. En donde sólo se debe cambiar el valor del parámetro disable a no.

Adicionalmente se debe editar /etc/cvs/cvs.conf y modificar el contenido de la variable CVS_REPOS por el directorio en donde vamos a crear nuestro repositorio, esto es: CVS_REPOS="/var/lib/cvs" .

Una vez hecho esto ya estamos en condiciones de crear el repositorio como tal, pero no sin antes crear un par de cuentas para darle un poco más de seguridad al tema.

Y si no existe el archivo /etc/xinetd.d/cvs?

Bueno, en este caso debemos crearlo (tal como me pasó con un RedHat9 recien instalado, previo rpm -ivh cvs*). Aquí las lineas que debe tener este archivo son:


# default: on
#
# service cvspserver
#
service cvspserver
{
disable = no
id = cvspserver
env = HOME=/var/lib/cvs
socket_type = stream
protocol = tcp
port = 2401
wait = no
user = root
passenv = PATH
server = /usr/bin/cvs
server_args = -f --allow-root=/var/lib/cvs pserver
}

Y después de ello, reiniciar el servicio xinetd: /etc/init.d/xinetd restart

Creando las cuentas de usuarios y administración.

Con el fin de designar a un único administrador de nuestro repositorio, el cual tendrá permisos para crear nuevos módulos ( cvs import ....) y restringir al resto de los usuarios, se deben crear cuentas y grupos asociados. En mi caso:

  1. Crear el grupo cvs ( grpadd cvs )
  2. Crear la cuenta cvsadm ( adduser cvsadm ). Podemos crear o usar otra cuenta si así lo queremos.
  3. Agregar el administrador del repositorio al grupo cvs ( usermod -G cvsadm )
  4. Agregar a todos los usuarios que estime necesario al grupo cvs ( usermod -G username )
Todos estos comandos ejecutados obviamente como root.

Creando el directorio para el repositorio.

Una vez creados los grupos y cuentas correspondientes creamos el directorio en donde residirá nuestro repositorio: "mkdir /var/lib/cvs", en caso de usar otro directorio distinto debemos modificar los correpondientes archivos inetd.conf o xinetd.conf según corresponda.

Antes de inicializar el repositorio debemos volver al tema de la seguridad, ejecutando los siguientes comandos (situados ya en el directorio /var/lib):

chmod o-rx cvs: Con esto eliminamos los accesos de terceros a nuestro repositorio.
chown cvsadm:cvs cvs: Aquí cambiamos el dueño y grupo del directorio.
chmod g+s: Con esto nos aseguramos que todos los archivos creados por los usuarios (en este caso el administrador) queden a nombre del grupo cvs.

Creando el repositorio.
Por fin... ahora ya estamos en condiciones de crear nuestro repositorio, asegurando que los accesos y permisos serán los correctos.

Este tema es la principal causa de dolores de cabeza al momento de crear un CVS, sobre todo para aquellos usuarios inexpertos en Unix/Linux como yo, y que lamentablemente la documentación CVS no nos ayuda mucho.

Bueno... una vez hechos los descargos... la creación del repositorio:

export CVSROOT=/var/lib/cvs
cvs init

Con estas dos últimas instrucciones hemos creado nuestro repositorio, pero aún nos falta crear/agregar nuestros módulos:

export CVSROOT=:pserver:cvsadm@localhost:/var/lib/cvs

cambiar al directorio que queremos agregar como nuevo módulo, ejemplo: cd $HOME/cvstest
cvs login

ingresar la password, obvio!
cvs import nombre-módulo etiqueta-vendedor etiqueta-versión

Donde:

nombre-módulo: es el nombre que le queremos dar al nuevo módulo.
etiqueta-vendedor: es el nombre que usa CVS para etiquetar la rama que crea con la importación. Puede ser una cadena cualquiera de letras, números y subrayados.
etiqueta-versión: es el nombre que usa CVS para etiquetar la versión concreta que se crea con esta importación.Puede ser una cadena cualquiera de letras, números y subrayados.


Ahora a obtener copias de trabajo (cvs checkout), actualizar cambios (cvs update) y a subir las modificaciones (cvs commit)...



Basado en el documento creado por Ismael Olea y Ignacio Arenaza. (ver documento original en html o pdf)