Unison não pode sincronizar a configuração do Dropbox (arquivos socket)

2

Estou usando o Unison para sincronizar minha casa em vários computadores e resolvi tudo, menos isso.

A configuração do Dropbox é parcialmente ignorada e, como resultado, o Dropbox acha que não há configuração e passa pelo assistente de configuração novamente.

Aqui está a saída do Unison relacionada ao dropbox:

Reconciling changes                                                     
         <-?-- dir        .dropbox  
         <---- dir        .dropbox-dist  
         <---- dir        .dropbox-dist-new  
[BGN] Copying .dropbox from /home/.nfs/jorge.suarez/linux-home to /home/remoto/jorge.suarez
[END] Copying .dropbox
[BGN] Copying .dropbox-dist from /home/.nfs/jorge.suarez/linux-home to /home/remoto/jorge.suarez
[END] Copying .dropbox-dist
[BGN] Copying .dropbox-dist-new from /home/.nfs/jorge.suarez/linux-home to /home/remoto/jorge.suarez
[END] Copying .dropbox-dist-new
  partially transferred: .dropbox

Este é o conteúdo original do diretório:

$ ls -lah
total 22M
drwx------  3 jorge.suarez users 3,9K 2013-01-25 21:39 .
drwxr-xr-x 43 jorge.suarez users 3,9K 2013-01-25 21:40 ..
srw-------  1 jorge.suarez users    0 2013-01-25 21:39 command_socket
-rw-------  1 jorge.suarez users 3,0K 2013-01-25 21:39 config.db
-rw-------  1 jorge.suarez users  20K 2013-01-25 21:39 config.dbx
-rw-------  1 jorge.suarez users  66K 2013-01-25 21:39 deleted.dbx
-rw-------  1 jorge.suarez users    4 2013-01-25 21:39 dropbox.pid
-rw-------  1 jorge.suarez users 2,0M 2013-01-25 21:39 filecache.dbx
-rw-------  1 jorge.suarez users   89 2013-01-25 21:39 host.db
-rw-------  1 jorge.suarez users  221 2013-01-25 21:39 host.dbx
-rw-------  1 jorge.suarez users   81 2013-01-25 21:39 hostkeys
srw-------  1 jorge.suarez users    0 2013-01-25 21:39 iface_socket
drwx------  2 jorge.suarez users 3,9K 2013-01-25 21:39 l
-rw-------  1 jorge.suarez users  13K 2013-01-25 21:39 photo.dbx
-rw-------  1 jorge.suarez users  20M 2013-01-25 21:39 sigstore.dbx
-rw-------  1 jorge.suarez users  232 2013-01-25 21:39 unlink.db

E o sincronizado, pouco antes de o Dropbox ter a chance de ser lançado:

$ ls -lah
total 22M
drwx------  3 jorge.suarez users 4,0K Xan 25 22:09 .
drwx------ 43 jorge.suarez users 4,0K Xan 25 22:10 ..
-rw-------  1 jorge.suarez users 3,0K Xan 25 22:09 config.db
-rw-------  1 jorge.suarez users  20K Xan 25 22:09 config.dbx
-rw-------  1 jorge.suarez users  66K Xan 25 22:09 deleted.dbx
-rw-------  1 jorge.suarez users    4 Xan 25 22:09 dropbox.pid
-rw-------  1 jorge.suarez users 2,0M Xan 25 22:09 filecache.dbx
-rw-------  1 jorge.suarez users   89 Xan 25 22:09 host.db
-rw-------  1 jorge.suarez users  221 Xan 25 22:09 host.dbx
-rw-------  1 jorge.suarez users   81 Xan 25 22:09 hostkeys
drwx------  2 jorge.suarez users 4,0K Xan 25 22:09 l
-rw-------  1 jorge.suarez users  13K Xan 25 22:09 photo.dbx
-rw-------  1 jorge.suarez users  20M Xan 25 22:09 sigstore.dbx
-rw-------  1 jorge.suarez users  232 Xan 25 22:09 unlink.db

Parece que iface_socket e command_socket são ignorados porque são arquivos de soquete. Há algo que eu possa fazer sobre isso?

Como solução alternativa, eu poderia apenas analisar a saída do Unison e criar os arquivos de soquete manualmente. Isso deve corrigir esse problema específico, mas o problema permaneceria para outros arquivos de soquete, já que a saída do Unison não contém o nome dos arquivos ignorados.

    
por Jorge Suárez de Lis 25.01.2013 / 22:20

1 resposta

1

A partir do Unison 2.40 (a versão mais recente que eu escrevo), o Unison não suporta nenhum arquivo que não seja um arquivo regular, um diretório ou um link simbólico. Versões anteriores abortavam a transferência ao encontrar arquivos especiais; desde 2.40 esses arquivos são ignorados. Em 2.40.65, você não consegue ver o nome dos arquivos ignorados na primeira sincronização, mas é exibido em sincronizações subseqüentes. Assim, você pode executar o Unison manualmente uma vez e depois analisar sua saída para detectar arquivos especiais.

As outras opções são para corrigir o Unison, ou procurar arquivos especiais manualmente e copiá-los.

Um método para sincronizar esses arquivos seria manter um repositório deles. Por exemplo, crie uma hierarquia paralela que codifique os arquivos especiais com arquivos normais, deixe o Unison sincronizar isso e decodifique a hierarquia paralela novamente após a sincronização. Antes de correr em uníssono, de cada lado:

mkdir -p .pipes .sockets
find . -type p -exec sh -c '
    mkdir -p ".pipes/${0%/*}";
    touch -r "$0" ".pipes/$0"; chmod -r "$0" ".pipes/$0"
  ' {} \;
find . -type s -exec sh -c '
    mkdir -p ".sockets/${0%/*}";
    touch -r "$0" ".sockets/$0"; chmod -r "$0" ".sockets/$0"
' {} \;

Depois de executar o uníssono:

(cd .pipes &&
 find -type f -exec sh -c '
    [ -p "../$0" ] && exit;
    mkfifo "../$0";
    touch -r "$0" "../$0"; chmod -r "$0" "../$0"
  ' {} \;)
find -type p -exec '[ -e ".pipes/$0" ] || rm "$0"' {} \;
(cd .sockets &&
 find -type f -exec sh -c '
    [ -S "../$0" ] && exit;
    python -c "import os, sys; os.mknod(sys.argv[1], 0140000)" "../$0";
    touch -r "$0" "../$0"; chmod -r "$0" "../$0"
' {} \;)
find -type s -exec '[ -e ".sockets/$0" ] || rm "$0"' {} \;

(Atenção: código não testado. Pressupõe ferramentas GNU (o que inclui qualquer Linux não embutido).)

Acho que isso é mais complexo do que garantido. Existem muito poucos aplicativos que dependem de um pipe ou soquete nomeado existente: a maioria cria-os conforme necessário. O Dropbox é o primeiro caso que eu já ouvi falar. Então, eu acho que optaria por uma abordagem ad hoc: ignore os sockets ao sincronizar e crie-os para o Dropbox como parte do novo procedimento de criação de conta (junto com a criação do perfil Unison e o que mais você fizer).

    
por 26.01.2013 / 01:50