<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<?xml-stylesheet href="docbook.xsl" type="text/xsl"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
<article lang="pt_BR">
  <articleinfo>
    <title>Instalando o Subversion integrado ao Apache2 com autenticação em um servidor LDAP</title>
    <authorgroup>
      <author>
        <firstname>Leonardo</firstname>
        <othername>Serra Maciel de</othername>
        <surname>Campos</surname>
        <affiliation>
          <address>
            <email>linuxbh@brfree.com.br</email>
          </address>
        </affiliation>
      </author>
    </authorgroup>
    <revhistory>
      <revision>
        <revnumber>0.1</revnumber>
        <date>2004-09-15 11:23:14 -0300</date>
        <authorinitials>Leonardo Serra Maciel de Campos</authorinitials>
      </revision>
      <revision>
        <revnumber>0.2</revnumber>
        <date>2004-09-20 20:59:24 -0300</date>
        <authorinitials>Leonardo Serra Maciel de Campos</authorinitials>
      </revision>
      <revision>
        <revnumber>0.3</revnumber>
        <date>2004-09-20 23:37:12 -0300</date>
        <authorinitials>Leonardo Serra Maciel de Campos</authorinitials>
      </revision>
      <revision>
        <revnumber>0.4</revnumber>
        <date>2004-09-22 10:03:18 -0300</date>
        <authorinitials>Leonardo Serra Maciel de Campos</authorinitials>
      </revision>
      <revision>
        <revnumber>0.5</revnumber>
        <date>2004-10-04 12:04:39 -0300</date>
        <authorinitials>Leonardo Serra Maciel de Campos</authorinitials>
      </revision>
      <revision>
        <revnumber>0.6</revnumber>
        <date>2004-10-28 11:58:39 -0300</date>
        <authorinitials>Leonardo Serra Maciel de Campos</authorinitials>
      </revision>
      <revision>
        <revnumber>0.7</revnumber>
        <date>2004-12-09 20:22:13 -0300</date>
        <authorinitials>Leonardo Serra Maciel de Campos</authorinitials>
      </revision>
      <revision>
        <revnumber>0.8</revnumber>
        <date>2005-01-17 17:16:08 -0300</date>
        <authorinitials>Leonardo Serra Maciel de Campos</authorinitials>
      </revision>
    </revhistory>
    <copyright>
      <year>2004-2005</year>
      <holder>Leonardo Serra Maciel de Campos</holder>
    </copyright>
    <legalnotice>
      <para>Este documento é licenciado sobre a licença de Atribuição-Compartilhamento da Creative Commons. Para ver uma cópia desta licença, visite <ulink url="http://creativecommons.org/licenses/by-sa/2.0/"/> ou envie uma carta para Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.</para>
    </legalnotice>
    <abstract>
      <para>Este documento visa ensinar como instalar o Subversion integrado com o Apache2 no <glossterm baseform="Debian GNU/Linux">Debian GNU/Linux</glossterm> realizando as autenticações em um servidor LDAP.</para>
    </abstract>
  </articleinfo>
  <sect1>
    <title>Introdução</title>
    <sect2>
      <title>O que é Subversion?</title>
      <para>O objetivo do projeto Subversion é construir um sistema de controle de versão que seja um substituto para o CVS. O Subversion é liberado sob a licença Apache/BSD-style.</para>
    </sect2>
  </sect1>
  <sect1>
    <title>Ambiente</title>
    <para>Será presumido que o seu sistema <glossterm baseform="Debian GNU/Linux">Debian GNU/Linux</glossterm> e o aptitude estão corretamente configurados. Também estaremos acreditando que o Apache2 e o seu servidor de LDAP já se encontrem instalados, configurados e sendo executados de maneira correta.</para>
    <para>Estaremos acessando o servidor do Subversion pelo protocolo WebDAV, pois este é o metodo de acesso que mais recursos permite.</para>
    <para>Estaremos criando dois repositorios, um onde iremos colocar nossos arquivos fontes e outro onde iremos colocar nossas documentações.</para>
    <warning>
      <para>Todos os comandos deverão ser executados pelo usuário root!</para>
    </warning>
    <para>A tabelo abaixo mostra as versões de cada <glossterm baseform="Logicial">logicial</glossterm> usado.</para>
    <table>
      <title>Versão dos logiciais</title>
      <tgroup cols="2">
        <thead>
          <row>
            <entry>
              <glossterm baseform="Logicial">Logicial</glossterm>
            </entry>
            <entry>Versão</entry>
          </row>
        </thead>
        <tbody>
          <row>
            <entry>Debian GNU/Linux</entry>
            <entry>Sarge</entry>
          </row>
          <row>
            <entry>apache2</entry>
            <entry>2.0.50-12</entry>
          </row>
          <row>
            <entry>subversion</entry>
            <entry>1.0.6-2</entry>
          </row>
          <row>
            <entry>libapache2-svn</entry>
            <entry>1.0.6-2</entry>
          </row>
        </tbody>
      </tgroup>
    </table>
    <para>A tabelo abaixo mostra as principais caracteristicas do ambiente onde foi feito esta documentação.</para>
    <table>
      <title>Ambiente</title>
      <tgroup cols="2">
        <tbody>
          <row>
            <entry>Dominio da rede</entry>
            <entry>
              <replaceable>exemplo.com.br</replaceable>
            </entry>
          </row>
          <row>
            <entry>Pasta principal dos repositorios</entry>
            <entry>
              <replaceable>/var/lib/svn/</replaceable>
            </entry>
          </row>
          <row>
            <entry>Pasta do repositorio para codigos fontes</entry>
            <entry>
              <replaceable>/var/lib/svn/fontes/</replaceable>
            </entry>
          </row>
          <row>
            <entry>Caminho externo do repositorio para codigos fontes</entry>
            <entry>
              <replaceable>/svn/fontes</replaceable>
            </entry>
          </row>
          <row>
            <entry>Pasta do repositorio para documentacao</entry>
            <entry>
              <replaceable>/var/lib/svn/documentacao/</replaceable>
            </entry>
          </row>
          <row>
            <entry>Caminho externo do repositorio para documentacao</entry>
            <entry>
              <replaceable>/svn/documentacao</replaceable>
            </entry>
          </row>
          <row>
            <entry>Usuario que roda o Apache2</entry>
            <entry>
              <replaceable>www-data</replaceable>
            </entry>
          </row>
          <row>
            <entry>Grupo do usuario que roda o Apache2</entry>
            <entry>
              <replaceable>www-data</replaceable>
            </entry>
          </row>
          <row>
            <entry>Endereco do servidor LDAP</entry>
            <entry>
              <replaceable>ldap.exemplo.com.br</replaceable>
            </entry>
          </row>
          <row>
            <entry>Entrada no LDAP onde será feita a autenticação</entry>
            <entry>
              <replaceable>ou=People,dc=exemplo,dc=com,dc=br</replaceable>
            </entry>
          </row>
        </tbody>
      </tgroup>
    </table>
    <note>
      <itemizedlist>
        <listitem>
          <para>No caminho externo do repositorio não use <userinput>/</userinput> no fim.</para>
        </listitem>
        <listitem>
          <para>Usaremos palavras <replaceable>desta maneira</replaceable> para indicar substituição.</para>
        </listitem>
        <listitem>
          <para>Não será abordado detalhes referentes a autenticação, para maiores é recomendado a leitura da documentação oficial do Apache2 referente a autenticação.</para>
        </listitem>
      </itemizedlist>
    </note>
  </sect1>
  <sect1>
    <title>Instalação</title>
    <orderedlist numeration="arabic">
      <listitem>
        <para>É necessario instalar o pacote Debian para o Subversion e seu modulo para o Apache2, para isto execute:</para>
        <screen><prompt>#</prompt> <userinput>aptitude install subversion subversion-tools libapache2-svn</userinput></screen>
      </listitem>
    </orderedlist>
  </sect1>
  <sect1>
    <title>Configuração</title>
    <orderedlist numeration="arabic">
      <listitem>
        <para>É necessario abilitar o modulo do Apache2 responsavel por fazer as autenticações no servidor LDAP, para isto execute.</para>
        <screen>
<prompt>#</prompt> <userinput>a2dismod ldap</userinput>
<prompt>#</prompt> <userinput>a2enmod auth_ldap</userinput>
</screen>
        <note>
          <para>O comando <userinput>a2dismod ldap</userinput>, foi executado para garantir que o modulo responsavel pela conexao com servidores LDAP seja carregado apenas uma vez, pois o comando <userinput>a2enmod auth_ldap</userinput> informa ao Apache2 para carregar o modulo de conexao e o modulo de autenticacao em servidores LDAP.</para>
        </note>
      </listitem>
      <listitem>
        <para>Edite o arquivo /etc/apache2/mods-enabled/dav_svn.conf. O arquivo deverá estar identico ao exemplo abaixo, exceto quando estiver indicado.</para>
        <screen>
&lt;Location <replaceable>/svn/fontes</replaceable>&gt;
  DAV svn

  SVNPath <replaceable>/var/lib/svn/fontes/</replaceable>

  AuthType Basic
  AuthName "Repositorio de codigos fontes (Subversion)"

  AuthLDAPURL ldap://<replaceable>ldap.exemplo.com.br</replaceable>/<replaceable>ou=People,dc=exemplo,dc=com,dc=br</replaceable>?uid

  &lt;LimitExcept GET PROPFIND OPTIONS REPORT&gt;
   Require valid-user
  &lt;/LimitExcept&gt;
&lt;/Location&gt;

&lt;Location <replaceable>/svn/documentacao</replaceable>&gt;
  DAV svn

  SVNPath <replaceable>/var/lib/svn/documentacao/</replaceable>

  AuthType Basic
  AuthName "Repositorio de documentacao (Subversion)"

  AuthLDAPURL ldap://<replaceable>ldap.exemplo.com.br</replaceable>/<replaceable>ou=People,dc=exemplo,dc=com,dc=br</replaceable>?uid

  &lt;LimitExcept GET PROPFIND OPTIONS REPORT&gt;
   Require valid-user
  &lt;/LimitExcept&gt;
&lt;/Location&gt;
</screen>
      </listitem>
      <listitem>
        <para>Nesta configuração, o acesso de leitura dos repositorios é publica e o acesso de escrita só é permitida para usuarios autenticados. Caso queira retirar o acesso publico de leitura dos repositorios, altere as seguintes linhas;</para>
        <screen>
  &lt;LimitExcept GET PROPFIND OPTIONS REPORT&gt;
   Require valid-user
  &lt;/LimitExcept&gt;
</screen>
        <para>Para:</para>
        <screen>
   Require valid-user
</screen>
        <note>
          <para>Não esqueça que isto deve ser feito para cada bloco de <userinput>&lt;Location&gt;</userinput></para>
        </note>
      </listitem>
      <listitem>
        <para>É necessario criar a pasta onde firacam armazenados nossos repositoris, para isto execute:</para>
        <screen><prompt>#</prompt> <userinput>mkdir <replaceable>/var/lib/svn/</replaceable></userinput></screen>
      </listitem>
      <listitem>
        <para>É necessario criar os repositorios, para isto execute:</para>
        <screen>
<prompt>#</prompt> <userinput>svadmin create <replaceable>/var/lib/svn/fontes/</replaceable></userinput>
<prompt>#</prompt> <userinput>svadmin create <replaceable>/var/lib/svn/documentacao/</replaceable></userinput>
</screen>
      </listitem>
      <listitem>
        <para>É necessario garantir que o Apache2 poderar ter acesso completo aos repositorios, para isto execute:</para>
        <screen>
<prompt>#</prompt> <userinput>find <replaceable>/var/lib/svn/fontes/</replaceable> -type d -exec chmod 700 {} \;</userinput>
<prompt>#</prompt> <userinput>find <replaceable>/var/lib/svn/fontes/</replaceable> -type f -exec chmod 600 {} \;</userinput>
<prompt>#</prompt> <userinput>chown -R <replaceable>www-data</replaceable>:<replaceable>www-data</replaceable> <replaceable>/var/lib/svn/fontes/</replaceable></userinput>
<prompt>#</prompt> <userinput>find <replaceable>/var/lib/svn/documentacao/</replaceable> -type d -exec chmod 700 {} \;</userinput>
<prompt>#</prompt> <userinput>find <replaceable>/var/lib/svn/documentacao/</replaceable> -type f -exec chmod 600 {} \;</userinput>
<prompt>#</prompt> <userinput>chown -R <replaceable>www-data</replaceable>:<replaceable>www-data</replaceable> <replaceable>/var/lib/svn/documentacao/</replaceable></userinput>
</screen>
        <note>
          <para>Caso queira aumentar a segurança do repositorio e garantir que somente o Apache2 podera ter acesso ao repositorio utilize <userinput>700</userinput> ao invez de <userinput>755</userinput></para>
        </note>
      </listitem>
      <listitem>
        <para>É necessario reiniciar o Apache2, para isto execute:</para>
        <screen><prompt>#</prompt> <userinput>invoke-rc.d apache2 restart</userinput></screen>
      </listitem>
    </orderedlist>
  </sect1>
  <sect1>
    <title>Repositorio corrompido</title>
    <itemizedlist>
      <listitem>
        <para>Caso acontece alguma interrupção no repositorio, ele podera ficar corrompido. Para diagnosticar se realmente o repositorio se encontra corrompido execute:</para>
        <screen><prompt>#</prompt> <userinput>svn list file://<replaceable>/caminho/do/repositorio/</replaceable></userinput></screen>
        <para>Seu repositorio estara corrompido caso o retorno seja isto:</para>
<screen>
svn: Unable to open an ra_local session to URL
svn: Unable to open reposition 'file://<replaceable>/caminho/do/repositorio/</replaceable>'
svn: Berkeley DB error while opening environment for file system '/.../svnroot/db'
Invalid argument
</screen>
      </listitem>
      <listitem>
        <para>É necessario parar o Apache2 para recuperar o repositorio, pois é necessario que nenhum processo esteja fazendo acesso ao repositorio, para isto execute:</para>
        <screen><prompt>#</prompt> <userinput>invoke-rc.d apache2 stop</userinput></screen>
      </listitem>
      <listitem>
        <para>O proximo comando é a parte principal da recuperação, será ele que ira recuperar o repositorio, para isto execute:</para>
        <screen><prompt>#</prompt> <userinput>svnadmin recover <replaceable>/caminho/do/repositorio/</replaceable></userinput></screen>
        <warning>
          <para>Caso a execução do comando demore, verifique se não há nenhum processo fazendo acesso direto ao repositorio atraves do comando <userinput>lsof</userinput>!</para>
        </warning>
      </listitem>
      <listitem>
        <para>A execução do comando <userinput>svnadmin recover</userinput> altera as permissoes do repositorio. É necessario garantir que o Apache2 poderar ter acesso completo ao repositorio, para isto execute:</para>
<screen>
<prompt>#</prompt> <userinput>find <replaceable>/caminho/do/repositorio/</replaceable> -type d -exec chmod 700 {} \;</userinput>
<prompt>#</prompt> <userinput>find <replaceable>/caminho/do/repositorio/</replaceable> -type f -exec chmod 600 {} \;</userinput>
<prompt>#</prompt> <userinput>chown -R <replaceable>www-data</replaceable>:<replaceable>www-data</replaceable> <replaceable>/caminho/do/repositorio/</replaceable></userinput>
</screen>
      </listitem>
      <listitem>
        <para>É necessario iniciar o Apache2 para voltar o acesso ao repositorio, para isto execute:</para>
        <screen><prompt>#</prompt> <userinput>invoke-rc.d apache2 start</userinput></screen>
      </listitem>
    </itemizedlist>
  </sect1>
  <sect1>
    <title>Comandos uteis</title>
    <itemizedlist>
      <listitem>
        <para>Criar repositorio</para>
        <screen><prompt>#</prompt> <userinput>svadmin create <replaceable>/caminho/do/repositorio/</replaceable></userinput></screen>
      </listitem>
      <listitem>
        <para>Recuperar repositorio corrompido</para>
        <screen><prompt>#</prompt> <userinput>svnadmin recover <replaceable>/caminho/do/repositorio/</replaceable></userinput></screen>
      </listitem>
    </itemizedlist>
  </sect1>
  <bibliography>
    <title>Bibliografia</title>
    <para>Os seguintes sítios foram usados como base para a criação desta documentação</para>
    <biblioentry>
      <title>Livro sobre o Subversion</title>
      <releaseinfo><ulink url="http://svnbook.red-bean.com/"/></releaseinfo>
    </biblioentry>
    <biblioentry>
      <title>Perguntas e respostas sobre o Subversion</title>
      <releaseinfo><ulink url="http://subversion.tigris.org/project_faq.html"/></releaseinfo>
    </biblioentry>
    <biblioentry>
      <title>Referencia para autenticações no Apache2</title>
      <releaseinfo><ulink url="http://httpd.apache.org/docs-2.0/howto/auth.html"/></releaseinfo>
    </biblioentry>
  </bibliography>
  <glossary>
    <title>Glossário</title>
    <glossentry>
      <glossterm>Debian GNU/Linux</glossterm>
      <glossdef>
        <para>O <ulink url="http://www.debian.org">Debian</ulink> é um sistema operacional (SO) livre para seu computador. Um sistema operacional é um conjunto de programas básicos e utilitários que fazem seu computador funcionar. O Debian usa o kernel (núcleo de um sistema operacional), <ulink url="http://www.kernel.org">Linux</ulink>, mas a maior parte das ferramentas do SO vêm do projeto <ulink url="http://www.gnu.org">GNU</ulink>; daí o nome GNU/Linux.</para>
      </glossdef>
    </glossentry>
    <glossentry>
      <glossterm>Logicial</glossterm>
      <glossdef>
        <para>Conjunto de instruções lógicas. Na informática designa um conjunto de instruções lógicas e suas dependências, também conhecido como programa ou sistema de computador.</para>
        <para>Esta palavra é pouco usada no Brasil, onde se usa muito a expressão "Software".</para>
        <para>Origem: <ulink url="http://pt.wikipedia.org/wiki/Logicial">Wikipédia, a enciclopédia livre.</ulink></para>
      </glossdef>
    </glossentry>
  </glossary>
</article>
