Svnserve sotto inetd

Se si utilizza un server su una connessione dial-up (anche adsl) il demone svnserve fallirà l'avvio al boot perché, non essendoci ancora la connessione internet, non riuscirà a fare il bind sull'hostname specificato. Con una connessione che assegna un nuovo ip, non sarà neanche possibile fare il bind sull'ip dato che cambia ad ogni nuova connessione.

Usando servizi di dns dinamico come dyndns o no-ip è possibile accedere alla macchina dall'esterno, ma comunque all'avvio non ci sarà ancora la connessione e quindi il problema rimane.

Per aggirare il problema conviene mettere svnserve sotto il controllo di inetd. Facendo il bind di inetd su tutte le interfacce non c'è più il problema di un hostname o indirizzo ip specifico: quando la macchina diventerà raggiungibile (ovvero connessione dial-up è stabilita) automaticamente saranno raggiungibili tutti i servizi sotto inetd.

Per prima cosa disabilitare l'avvio di svnserve al boot commentando la relativa istruzione in /etc/rc.conf:

#svnserve_enable="YES"

Poi permettere l'avvio di inetd, sempre in /etc/rc.conf:

inetd_enable="YES"

Configurare inetd per l'avvio di svnserve. Nel file /etc/inetd.conf aggiungere la linea:

svn  stream  tcp  nowait  svn  /usr/local/bin/svnserve -i -t -r /usr/home/svn/repos

Il significato delle opzioni passate a svnserve:

  • -i : modalità inetd
  • -t : modalità tunnel
  • -r : directory di root da servire

Nota bene: modificare la riga dell'esempio per rispecchiare i giusti nome utente svn e path alla repository.

Perché funzioni è importante specificare l'opzione -t (modalità tunnel) altrimenti ci saranno problemi nelle comunicazioni tra inetd e svnserve, ricevendo il messaggio di errore "Malformed network data" (Dati di rete malformati).

Se non si specifica l'opzione -t e si prova a fare telnet locale al server si avrà infatti un messaggio esplicativo che le opzioni non sono sufficienti:

telnet miohost.no-ip.org 3690
Trying 87.3.37.12...
Connected to miohost.no-ip.org.
Escape character is '^]'.
Devi specificare esattamente un'opzione fra -d, -i, -t o -X.
Digita '-i --help' per informazioni.
Connection closed by foreign host.

Nell'utilizzo come demone stand-alone l'opzione -t non serve e questo è causa di incomprensione del problema quando si passa dalla configurazione stand-alone a quella sotto inetd.

Fonte: Subversion Users: RE: svnserve and inetd: malformed network data